diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 3de32cc..926f6f8 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -651,9 +651,8 @@
         <!-- Second and third-level settings -->
 
         <activity android:name="ConfirmLockPattern"/>
-        <activity android:name="ConfirmLockPassword"
-            android:theme="@android:style/Theme.NoTitleBar">
-        </activity>
+
+        <activity android:name="ConfirmLockPassword"/>>
 
         <activity android:name="ChooseLockGeneric">
             <intent-filter>
@@ -669,7 +668,6 @@
 
         <activity android:name="ChooseLockPassword"
                 android:label="@string/lockpattern_change_lock_pin_label"
-            android:theme="@android:style/Theme.NoTitleBar"
             android:exported="false">
         </activity>
 
diff --git a/res/layout-xlarge-land/choose_lock_password.xml b/res/layout-xlarge-land/choose_lock_password.xml
new file mode 100644
index 0000000..1276681
--- /dev/null
+++ b/res/layout-xlarge-land/choose_lock_password.xml
@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+**
+** Copyright 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.
+*/
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="fill_parent"
+    android:layout_height="fill_parent"
+    android:orientation="vertical"
+    android:gravity="center_horizontal">
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal">
+
+        <!-- "Enter PIN(Password) to unlock" -->
+        <TextView android:id="@+id/headerText"
+            android:layout_width="0dip"
+            android:layout_height="wrap_content"
+            android:layout_weight="1"
+            android:orientation="horizontal"
+            android:layout_marginRight="6dip"
+            android:layout_marginLeft="6dip"
+            android:layout_marginTop="10dip"
+            android:layout_marginBottom="10dip"
+            android:gravity="left"
+            android:ellipsize="marquee"
+            android:textAppearance="?android:attr/textAppearanceLarge"
+        />
+
+        <!-- Password entry field -->
+        <EditText android:id="@+id/password_entry"
+            android:layout_width="0dip"
+            android:layout_height="wrap_content"
+            android:layout_weight="1"
+            android:singleLine="true"
+            android:textStyle="bold"
+            android:inputType="textPassword"
+            android:gravity="center"
+            android:layout_gravity="center"
+            android:textSize="24sp"
+            android:layout_marginTop="5dip"
+            android:layout_marginBottom="5dip"
+            android:textAppearance="?android:attr/textAppearanceLarge"
+            android:background="@drawable/password_field_default"
+            android:textColor="#ffffffff"
+        />
+    </LinearLayout>
+
+    <!-- Spacer between password entry and keyboard -->
+    <View
+        android:layout_width="match_parent"
+        android:layout_height="0dip"
+        android:layout_weight="1" />
+
+    <!-- Alphanumeric keyboard -->
+    <com.android.internal.widget.PasswordEntryKeyboardView android:id="@+id/keyboard"
+        android:layout_alignParentBottom="true"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:background="#00000000"
+        android:keyBackground="@*android:drawable/btn_keyboard_key_fulltrans"
+        android:visibility="gone"
+    />
+
+    <RelativeLayout
+        android:layout_width="match_parent"
+        android:layout_height="0dip"
+        android:layout_weight="1">
+
+        <Button android:id="@+id/cancel_button"
+            android:layout_height="wrap_content"
+            android:layout_width="140dip"
+            android:ellipsize="marquee"
+            android:singleLine="true"
+            android:layout_alignParentBottom="true"
+            android:layout_toLeftOf="@id/next_button"
+            android:text="@string/lockpassword_cancel_label"
+        />
+
+        <Button android:id="@+id/next_button"
+            android:layout_width="140dip"
+            android:layout_height="wrap_content"
+            android:ellipsize="marquee"
+            android:singleLine="true"
+            android:layout_alignParentRight="true"
+            android:layout_alignParentBottom="true"
+            android:text="@string/lockpassword_continue_label"
+        />
+
+    </RelativeLayout>
+
+</LinearLayout>
+
+
diff --git a/res/layout-xlarge-land/choose_lock_pattern.xml b/res/layout-xlarge-land/choose_lock_pattern.xml
new file mode 100644
index 0000000..fa2498f
--- /dev/null
+++ b/res/layout-xlarge-land/choose_lock_pattern.xml
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/topLayout"
+    android:orientation="horizontal"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <!-- left side: lock pattern -->
+    <com.android.internal.widget.LockPatternView android:id="@+id/lockPattern"
+         android:layout_width="wrap_content"
+         android:layout_height="wrap_content"/>
+
+     <!-- right side: pattern and messages -->
+    <LinearLayout
+        android:orientation="vertical"
+        android:layout_width="0dip"
+        android:layout_height="match_parent"
+        android:layout_weight="1.0">
+
+        <!-- header message -->
+        <TextView android:id="@+id/headerText"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:textSize="22sp"
+            android:gravity="left"/>
+
+        <!-- footer message -->
+        <TextView android:id="@+id/footerText"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:textSize="22sp"
+            android:layout_marginTop="40dip"
+            android:visibility="gone"/>
+
+        <!-- confirm / restart buttons -->
+        <RelativeLayout
+            android:layout_width="match_parent"
+            android:layout_height="0dip"
+            android:layout_weight="1">
+
+            <!-- right / bottom button: confirm or ok -->
+            <Button android:id="@+id/footerRightButton"
+                android:layout_height="wrap_content"
+                android:layout_width="140dip"
+                android:layout_alignParentRight="true"
+                android:layout_alignParentBottom="true"
+                android:ellipsize="marquee"
+                android:singleLine="true"
+                android:text="@string/lockpattern_confirm_button_text"/>
+
+            <!-- left / top button: skip, or re-try -->
+            <Button android:id="@+id/footerLeftButton"
+                android:layout_height="wrap_content"
+                android:layout_width="140dip"
+                android:layout_toLeftOf="@id/footerRightButton"
+                android:layout_alignParentBottom="true"
+                android:ellipsize="marquee"
+                android:singleLine="true"
+                android:text="@string/lockpattern_restart_button_text"/>
+
+        </RelativeLayout>
+
+    </LinearLayout>
+
+</com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient>
+
diff --git a/res/layout-xlarge-land/confirm_lock_password.xml b/res/layout-xlarge-land/confirm_lock_password.xml
new file mode 100644
index 0000000..cbfe88c
--- /dev/null
+++ b/res/layout-xlarge-land/confirm_lock_password.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+**
+** Copyright 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.
+*/
+-->
+
+<!-- This is the same layout as choose_lock_password. TODO: find out why merge fails -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="fill_parent"
+    android:layout_height="fill_parent"
+    android:orientation="vertical"
+    android:gravity="center_horizontal">
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal">
+
+        <!-- "Enter PIN(Password) to unlock" -->
+        <TextView android:id="@+id/headerText"
+            android:layout_width="0dip"
+            android:layout_height="wrap_content"
+            android:layout_weight="1"
+            android:orientation="horizontal"
+            android:layout_marginRight="6dip"
+            android:layout_marginLeft="6dip"
+            android:layout_marginTop="10dip"
+            android:layout_marginBottom="10dip"
+            android:gravity="left"
+            android:ellipsize="marquee"
+            android:textAppearance="?android:attr/textAppearanceLarge"
+        />
+
+        <!-- Password entry field -->
+        <EditText android:id="@+id/password_entry"
+            android:layout_width="0dip"
+            android:layout_height="wrap_content"
+            android:layout_weight="1"
+            android:singleLine="true"
+            android:textStyle="bold"
+            android:inputType="textPassword"
+            android:gravity="center"
+            android:layout_gravity="center"
+            android:textSize="24sp"
+            android:layout_marginTop="5dip"
+            android:layout_marginBottom="5dip"
+            android:textAppearance="?android:attr/textAppearanceLarge"
+            android:background="@drawable/password_field_default"
+            android:textColor="#ffffffff"
+        />
+    </LinearLayout>
+
+    <!-- Spacer between password entry and keyboard -->
+    <View
+        android:layout_width="match_parent"
+        android:layout_height="0dip"
+        android:layout_weight="1" />
+
+    <!-- Alphanumeric keyboard -->
+    <com.android.internal.widget.PasswordEntryKeyboardView android:id="@+id/keyboard"
+        android:layout_alignParentBottom="true"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:background="#00000000"
+        android:keyBackground="@*android:drawable/btn_keyboard_key_fulltrans"
+        android:visibility="gone"
+    />
+
+    <RelativeLayout
+        android:layout_height="wrap_content"
+        android:layout_width="match_parent"
+        android:visibility="visible">
+
+        <Button android:id="@+id/cancel_button"
+            android:layout_width="150dip"
+            android:layout_height="wrap_content"
+            android:layout_margin="5dip"
+            android:layout_toLeftOf="@id/next_button"
+            android:text="@string/lockpassword_cancel_label"
+        />
+
+        <Button android:id="@+id/next_button"
+            android:layout_width="150dip"
+            android:layout_height="wrap_content"
+            android:layout_margin="5dip"
+            android:layout_alignParentRight="true"
+            android:drawableRight="@drawable/ic_btn_next"
+            android:drawablePadding="10dip"
+            android:text="@string/lockpassword_continue_label"
+        />
+
+    </RelativeLayout>
+
+</LinearLayout>
+
diff --git a/res/layout-xlarge-land/confirm_lock_pattern.xml b/res/layout-xlarge-land/confirm_lock_pattern.xml
new file mode 100644
index 0000000..29fc93e
--- /dev/null
+++ b/res/layout-xlarge-land/confirm_lock_pattern.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient
+        xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/topLayout"
+    android:orientation="horizontal"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <!-- left side: lock pattern -->
+    <com.android.internal.widget.LockPatternView android:id="@+id/lockPattern"
+         android:layout_width="wrap_content"
+         android:layout_height="wrap_content" />
+
+    <!-- right side: instructions and buttons -->
+    <LinearLayout
+        android:orientation="vertical"
+        android:layout_width="0dip"
+        android:layout_height="match_parent"
+        android:layout_weight="1.0">
+
+        <!-- header message -->
+        <TextView android:id="@+id/headerText"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:gravity="left"
+            android:textSize="22sp"/>
+
+        <!-- footer message -->
+        <TextView android:id="@+id/footerText"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="40dip"
+            android:gravity="left"
+            android:textSize="22sp"/>
+    </LinearLayout>
+
+</com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient>
+
diff --git a/res/layout-xlarge/choose_lock_password.xml b/res/layout-xlarge/choose_lock_password.xml
new file mode 100644
index 0000000..051229e
--- /dev/null
+++ b/res/layout-xlarge/choose_lock_password.xml
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+**
+** Copyright 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.
+*/
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="fill_parent"
+    android:layout_height="fill_parent"
+    android:orientation="vertical"
+    android:background="@android:color/background_dark"
+    android:gravity="center_horizontal">
+
+    <!-- header text ('Enter Pin') -->
+    <TextView android:id="@+id/headerText"
+        android:layout_width="fill_parent"
+        android:layout_height="wrap_content"
+        android:gravity="center"
+        android:lines="2"
+        android:textAppearance="?android:attr/textAppearanceLarge"/>
+
+    <!-- spacer above text entry field -->
+    <View
+        android:id="@+id/spacerBottom"
+        android:layout_width="fill_parent"
+        android:layout_height="1dip"
+        android:layout_marginTop="6dip"
+        android:background="@android:drawable/divider_horizontal_dark"
+    />
+
+    <!-- Password entry field -->
+    <EditText android:id="@+id/password_entry"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:singleLine="true"
+        android:textStyle="bold"
+        android:inputType="textPassword"
+        android:gravity="center"
+        android:layout_gravity="center"
+        android:textSize="32sp"
+        android:layout_marginTop="15dip"
+        android:layout_marginLeft="30dip"
+        android:layout_marginRight="30dip"
+        android:textAppearance="?android:attr/textAppearanceLarge"
+        android:background="@drawable/password_field_default"
+        android:textColor="#ffffffff"
+    />
+
+    <!-- Spacer between password entry and keyboard -->
+    <View
+        android:layout_width="match_parent"
+        android:layout_height="0dip"
+        android:layout_weight="1" />
+
+    <!-- Alphanumeric keyboard -->
+    <com.android.internal.widget.PasswordEntryKeyboardView android:id="@+id/keyboard"
+        android:layout_alignParentBottom="true"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:background="#00000000"
+        android:layout_marginBottom="30dip"
+        android:keyBackground="@*android:drawable/btn_keyboard_key_fulltrans"
+    />
+
+    <RelativeLayout
+        android:layout_height="wrap_content"
+        android:layout_width="match_parent">
+
+        <Button android:id="@+id/cancel_button"
+            android:layout_width="150dip"
+            android:layout_height="wrap_content"
+            android:layout_margin="5dip"
+            android:layout_alignParentLeft="true"
+            android:text="@string/lockpassword_cancel_label"
+        />
+
+        <Button android:id="@+id/next_button"
+            android:layout_width="150dip"
+            android:layout_height="wrap_content"
+            android:layout_margin="5dip"
+            android:layout_alignParentRight="true"
+            android:drawableRight="@drawable/ic_btn_next"
+            android:drawablePadding="10dip"
+            android:text="@string/lockpassword_continue_label"
+        />
+
+    </RelativeLayout>
+
+</LinearLayout>
diff --git a/res/layout-xlarge/choose_lock_pattern.xml b/res/layout-xlarge/choose_lock_pattern.xml
new file mode 100644
index 0000000..97c647f
--- /dev/null
+++ b/res/layout-xlarge/choose_lock_pattern.xml
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient
+        xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/topLayout"
+    android:orientation="vertical"
+    android:layout_width="wrap_content"
+    android:layout_height="match_parent"
+    android:background="@color/black">
+
+    <!-- takes up all space above button bar at bottom -->
+    <LinearLayout
+        android:orientation="vertical"
+        android:layout_width="match_parent"
+        android:layout_height="0dip"
+        android:layout_weight="1">
+
+        <TextView android:id="@+id/headerText"
+            android:layout_width="match_parent"
+            android:layout_height="0dip"
+            android:layout_weight="1"
+            android:gravity="center"
+            android:textSize="18sp"/>
+
+        <View
+             android:background="@*android:drawable/code_lock_top"
+             android:layout_width="match_parent"
+             android:layout_height="2dip" />
+        <com.android.internal.widget.LockPatternView android:id="@+id/lockPattern"
+             android:layout_width="wrap_content"
+             android:layout_height="wrap_content" />
+
+        <!-- bottom line looks bad when button bar is their too, omit in this case -->
+        <!--View
+             android:background="@*android:drawable/code_lock_bottom"
+             android:layout_width="match_parent"
+             android:layout_height="8dip" /-->
+
+        <TextView android:id="@+id/footerText"
+            android:layout_width="match_parent"
+            android:layout_height="0dip"
+            android:layout_weight="1"
+            android:gravity="center"
+            android:textSize="14sp"/>
+
+    </LinearLayout>
+
+
+    <LinearLayout style="@android:style/ButtonBar"
+        android:orientation="horizontal"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content">
+
+        <Button android:id="@+id/footerLeftButton"
+            android:layout_height="wrap_content"
+            android:layout_width="140dip"
+            android:ellipsize="marquee"
+            android:singleLine="true"
+            android:text="@string/lockpattern_restart_button_text"/>
+
+        <View
+            android:visibility="invisible"
+            android:layout_height="0dip"
+            android:layout_width="1dip"
+            android:layout_weight="1" />
+
+        <Button android:id="@+id/footerRightButton"
+            android:layout_height="wrap_content"
+            android:layout_width="140dip"
+            android:ellipsize="marquee"
+            android:singleLine="true"
+            android:drawableRight="@drawable/ic_btn_next"
+            android:drawablePadding="3dip"
+            android:text="@string/lockpattern_confirm_button_text"/>
+
+    </LinearLayout>
+
+</com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient>
diff --git a/res/layout-xlarge/confirm_lock_password.xml b/res/layout-xlarge/confirm_lock_password.xml
new file mode 100644
index 0000000..7f563b1
--- /dev/null
+++ b/res/layout-xlarge/confirm_lock_password.xml
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+**
+** Copyright 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.
+*/
+-->
+
+<!-- This is the same layout as choose_lock_password -->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="fill_parent"
+    android:layout_height="fill_parent"
+    android:orientation="vertical"
+    android:background="@android:color/background_dark"
+    android:gravity="center_horizontal">
+
+    <!-- header text ('Enter Pin') -->
+    <TextView android:id="@+id/headerText"
+        android:layout_width="fill_parent"
+        android:layout_height="wrap_content"
+        android:gravity="center"
+        android:lines="2"
+        android:textAppearance="?android:attr/textAppearanceLarge"/>
+
+    <!-- spacer above text entry field -->
+    <View
+        android:id="@+id/spacerBottom"
+        android:layout_width="fill_parent"
+        android:layout_height="1dip"
+        android:layout_marginTop="6dip"
+        android:background="@android:drawable/divider_horizontal_dark"
+    />
+
+    <!-- Password entry field -->
+    <EditText android:id="@+id/password_entry"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:singleLine="true"
+        android:textStyle="bold"
+        android:inputType="textPassword"
+        android:gravity="center"
+        android:layout_gravity="center"
+        android:textSize="32sp"
+        android:layout_marginTop="15dip"
+        android:layout_marginLeft="30dip"
+        android:layout_marginRight="30dip"
+        android:textAppearance="?android:attr/textAppearanceLarge"
+        android:background="@drawable/password_field_default"
+        android:textColor="#ffffffff"
+    />
+
+    <!-- Spacer between password entry and keyboard -->
+    <View
+        android:layout_width="match_parent"
+        android:layout_height="0dip"
+        android:layout_weight="1" />
+
+    <!-- Alphanumeric keyboard -->
+    <com.android.internal.widget.PasswordEntryKeyboardView android:id="@+id/keyboard"
+        android:layout_alignParentBottom="true"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:background="#00000000"
+        android:layout_marginBottom="30dip"
+        android:keyBackground="@*android:drawable/btn_keyboard_key_fulltrans"
+    />
+
+    <RelativeLayout
+        android:layout_height="wrap_content"
+        android:layout_width="match_parent">
+
+        <Button android:id="@+id/cancel_button"
+            android:layout_width="150dip"
+            android:layout_height="wrap_content"
+            android:layout_margin="5dip"
+            android:layout_alignParentLeft="true"
+            android:text="@string/lockpassword_cancel_label"
+        />
+
+        <Button android:id="@+id/next_button"
+            android:layout_width="150dip"
+            android:layout_height="wrap_content"
+            android:layout_margin="5dip"
+            android:layout_alignParentRight="true"
+            android:drawableRight="@drawable/ic_btn_next"
+            android:drawablePadding="10dip"
+            android:text="@string/lockpassword_continue_label"
+        />
+
+    </RelativeLayout>
+
+</LinearLayout>
+
diff --git a/res/layout-xlarge/confirm_lock_pattern.xml b/res/layout-xlarge/confirm_lock_pattern.xml
new file mode 100644
index 0000000..01ef5b1
--- /dev/null
+++ b/res/layout-xlarge/confirm_lock_pattern.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient
+        xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/topLayout"
+    android:orientation="vertical"
+    android:layout_width="wrap_content"
+    android:layout_height="match_parent"
+    android:background="@color/black">
+
+    <TextView android:id="@+id/headerText"
+        android:layout_width="match_parent"
+        android:layout_height="0dip"
+        android:layout_weight="1.0"
+        android:gravity="center"
+        android:textSize="18sp"/>
+
+    <View
+         android:background="@*android:drawable/code_lock_top"
+         android:layout_width="match_parent"
+         android:layout_height="2dip" />
+    <com.android.internal.widget.LockPatternView android:id="@+id/lockPattern"
+         android:layout_width="wrap_content"
+         android:layout_height="wrap_content" />
+    <View
+         android:background="@*android:drawable/code_lock_bottom"
+         android:layout_width="match_parent"
+         android:layout_height="8dip" />
+
+    <TextView android:id="@+id/footerText"
+        android:layout_width="match_parent"
+        android:layout_height="0dip"
+        android:layout_weight="1.0"
+        android:gravity="center"
+        android:textSize="14sp"/>
+
+
+</com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient>
diff --git a/res/layout/wifi_dialog.xml b/res/layout/wifi_dialog.xml
index 0aa8aa3..25ad510 100644
--- a/res/layout/wifi_dialog.xml
+++ b/res/layout/wifi_dialog.xml
@@ -15,57 +15,42 @@
 -->
 
 <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
-         android:layout_width="300sp"
+         android:layout_width="wrap_content"
          android:layout_height="wrap_content">
 
     <LinearLayout
-            android:layout_width="match_parent"
+            android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:padding="8dip"
             android:orientation="vertical">
 
         <LinearLayout android:id="@+id/info"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:orientation="vertical" />
+                style="@style/wifi_section" />
 
         <LinearLayout android:id="@+id/setup_fields"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:orientation="vertical"
+                style="@style/wifi_item" 
                 android:visibility="gone">
 
             <TextView
-                    style="?android:attr/textAppearanceSmall"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_marginTop="8dip"
+                    style="@style/wifi_item_label"
                     android:text="@string/wifi_network_setup" />
 
             <Spinner android:id="@+id/network_setup"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
+                    style="@style/wifi_item_content"
                     android:prompt="@string/wifi_network_setup"
                     android:entries="@array/wifi_network_setup" />
 
         </LinearLayout>
 
         <LinearLayout android:id="@+id/wps_fields"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:orientation="vertical"
+                style="@style/wifi_item"
                 android:visibility="gone">
 
             <TextView
-                    style="?android:attr/textAppearanceSmall"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_marginTop="8dip"
+                    style="@style/wifi_item_label"
                     android:text="@string/wifi_wps_pin" />
 
             <EditText android:id="@+id/wps_pin"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
+                    style="@style/wifi_item_content"
                     android:singleLine="true"
                     android:inputType="textPassword" />
 
@@ -73,301 +58,262 @@
 
 
         <LinearLayout android:id="@+id/type"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:orientation="vertical"
+                style="@style/wifi_section"
                 android:visibility="gone">
 
-            <TextView
-                    style="?android:attr/textAppearanceSmall"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_marginTop="8dip"
-                    android:text="@string/wifi_ssid" />
+            <LinearLayout
+                      style="@style/wifi_item" >
+                <TextView
+                        style="@style/wifi_item_label"
+                        android:text="@string/wifi_ssid" />
 
-            <EditText android:id="@+id/ssid"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:singleLine="true"
-                    android:inputType="textNoSuggestions" />
+                <EditText android:id="@+id/ssid"
+                        style="@style/wifi_item_content"
+                        android:singleLine="true"
+                        android:inputType="textNoSuggestions" />
+             </LinearLayout>
 
-            <TextView
-                    style="?android:attr/textAppearanceSmall"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_marginTop="8dip"
-                    android:text="@string/wifi_security" />
+             <LinearLayout
+                       style="@style/wifi_item" >
+                 <TextView
+                         style="@style/wifi_item_content"
+                         android:text="@string/wifi_security" />
 
-            <Spinner android:id="@+id/security"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:prompt="@string/wifi_security"
-                    android:entries="@array/wifi_security" />
+                 <Spinner android:id="@+id/security"
+                         style="@style/wifi_item_content"
+                         android:prompt="@string/wifi_security"
+                         android:entries="@array/wifi_security" />
+             </LinearLayout>
         </LinearLayout>
 
         <LinearLayout android:id="@+id/security_fields"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:orientation="vertical"
+                style="@style/wifi_section"
                 android:visibility="gone">
 
             <LinearLayout android:id="@+id/eap"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:orientation="vertical"
+                    style="@style/wifi_section"
                     android:visibility="gone">
 
-                <TextView
-                        style="?android:attr/textAppearanceSmall"
-                        android:layout_width="match_parent"
-                        android:layout_height="wrap_content"
-                        android:layout_marginTop="4dip"
-                        android:text="@string/wifi_eap_method" />
+                <LinearLayout
+                        style="@style/wifi_item" >
+                    <TextView
+                            style="@style/wifi_item_label"
+                            android:text="@string/wifi_eap_method" />
 
-                <Spinner android:id="@+id/method"
-                        android:layout_width="match_parent"
-                        android:layout_height="wrap_content"
-                        android:prompt="@string/wifi_eap_method"
-                        android:entries="@array/wifi_eap_method" />
+                    <Spinner android:id="@+id/method"
+                            style="@style/wifi_item_content"
+                            android:prompt="@string/wifi_eap_method"
+                            android:entries="@array/wifi_eap_method" />
+                </LinearLayout>
+                
+                <LinearLayout
+                        style="@style/wifi_item" >
+                    <TextView
+                            style="@style/wifi_item_label"
+                            android:text="@string/please_select_phase2" />
 
-                <TextView
-                        style="?android:attr/textAppearanceSmall"
-                        android:layout_width="fill_parent"
-                        android:layout_height="wrap_content"
-                        android:layout_marginTop="8dip"
-                        android:text="@string/please_select_phase2" />
+                    <Spinner android:id="@+id/phase2"
+                            style="@style/wifi_item_content"
+                            android:prompt="@string/please_select_phase2"
+                            android:entries="@array/wifi_phase2_entries" />
+                </LinearLayout>
 
-                <Spinner android:id="@+id/phase2"
-                        android:layout_width="fill_parent"
-                        android:layout_height="wrap_content"
-                        android:prompt="@string/please_select_phase2"
-                        android:entries="@array/wifi_phase2_entries" />
+                <LinearLayout
+                        style="@style/wifi_item" >
+                    <TextView
+                            style="@style/wifi_item_label"
+                            android:text="@string/wifi_eap_ca_cert" />
 
-                <TextView
-                        style="?android:attr/textAppearanceSmall"
-                        android:layout_width="match_parent"
-                        android:layout_height="wrap_content"
-                        android:layout_marginTop="4dip"
-                        android:text="@string/wifi_eap_ca_cert" />
+                    <Spinner android:id="@+id/ca_cert"
+                            style="@style/wifi_item_content"
+                            android:prompt="@string/wifi_eap_ca_cert" />
+                </LinearLayout>
 
-                <Spinner android:id="@+id/ca_cert"
-                        android:layout_width="match_parent"
-                        android:layout_height="wrap_content"
-                        android:prompt="@string/wifi_eap_ca_cert" />
+                <LinearLayout
+                        style="@style/wifi_item" >
+                    <TextView
+                            style="@style/wifi_item_label"
+                            android:text="@string/wifi_eap_user_cert" />
 
-                <TextView
-                        style="?android:attr/textAppearanceSmall"
-                        android:layout_width="match_parent"
-                        android:layout_height="wrap_content"
-                        android:layout_marginTop="4dip"
-                        android:text="@string/wifi_eap_user_cert" />
+                    <Spinner android:id="@+id/user_cert"
+                            style="@style/wifi_item_content"
+                            android:prompt="@string/wifi_eap_user_cert" />
+                </LinearLayout>
 
-                <Spinner android:id="@+id/user_cert"
-                        android:layout_width="match_parent"
-                        android:layout_height="wrap_content"
-                        android:prompt="@string/wifi_eap_user_cert" />
+                <LinearLayout
+                        style="@style/wifi_item" >
+                    <TextView
+                            style="@style/wifi_item_label"
+                            android:text="@string/wifi_eap_identity" />
 
-                <TextView
-                        style="?android:attr/textAppearanceSmall"
-                        android:layout_width="match_parent"
-                        android:layout_height="wrap_content"
-                        android:layout_marginTop="4dip"
-                        android:text="@string/wifi_eap_identity" />
+                    <EditText android:id="@+id/identity"
+                            style="@style/wifi_item_content"
+                            android:singleLine="true"
+                            android:inputType="textNoSuggestions" />
+                </LinearLayout>
 
-                <EditText android:id="@+id/identity"
-                        android:layout_width="match_parent"
-                        android:layout_height="wrap_content"
-                        android:singleLine="true"
-                        android:inputType="textNoSuggestions" />
+                <LinearLayout
+                        style="@style/wifi_item" >
+                    <TextView
+                            style="@style/wifi_item_label"
+                            android:text="@string/wifi_eap_anonymous" />
 
-                <TextView
-                        style="?android:attr/textAppearanceSmall"
-                        android:layout_width="match_parent"
-                        android:layout_height="wrap_content"
-                        android:layout_marginTop="4dip"
-                        android:text="@string/wifi_eap_anonymous" />
-
-                <EditText android:id="@+id/anonymous"
-                        android:layout_width="match_parent"
-                        android:layout_height="wrap_content"
-                        android:singleLine="true"
-                        android:inputType="textNoSuggestions" />
+                    <EditText android:id="@+id/anonymous"
+                            style="@style/wifi_item_content"
+                            android:singleLine="true"
+                            android:inputType="textNoSuggestions" />
+                </LinearLayout>
             </LinearLayout>
 
-            <TextView
-                    style="?android:attr/textAppearanceSmall"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_marginTop="4dip"
-                    android:text="@string/wifi_password" />
+            <LinearLayout
+                       style="@style/wifi_item" >
+                <TextView
+                        style="@style/wifi_item_label"
+                        android:text="@string/wifi_password" />
 
-            <EditText android:id="@+id/password"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:singleLine="true"
-                    android:password="true" />
+                <EditText android:id="@+id/password"
+                        style="@style/wifi_item_content"
+                        android:singleLine="true"
+                        android:password="true" />
+            </LinearLayout>
 
-            <CheckBox android:id="@+id/show_password"
-                    style="?android:attr/textAppearanceSmall"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
+            <LinearLayout
+                    style="@style/wifi_item" >
+                <!--  Dummy to enable right-justification of checkbox -->
+                <TextView
+                    style="@style/wifi_item_label" />
+
+                <CheckBox android:id="@+id/show_password"
+                    style="@style/wifi_item_content"
                     android:text="@string/wifi_show_password" />
+            </LinearLayout>
         </LinearLayout>
 
         <LinearLayout android:id="@+id/ip_fields"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:orientation="vertical"
+                style="@style/wifi_item"
                 android:visibility="gone">
 
             <TextView
-                    style="?android:attr/textAppearanceSmall"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_marginTop="8dip"
+                    style="@style/wifi_item_label"
                     android:text="@string/wifi_ip_settings" />
 
             <Spinner android:id="@+id/ip_settings"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
+                    style="@style/wifi_item_content"
                     android:prompt="@string/wifi_ip_settings"
                     android:entries="@array/wifi_ip_settings" />
 
         </LinearLayout>
 
         <LinearLayout android:id="@+id/staticip"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:orientation="vertical"
+                style="@style/wifi_section"
                 android:visibility="gone">
-            <TextView
-                    style="?android:attr/textAppearanceSmall"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_marginTop="8dip"
-                    android:text="@string/wifi_ip_address" />
+            <LinearLayout
+                    style="@style/wifi_item" >
+                <TextView
+                        style="@style/wifi_item_label"
+                        android:text="@string/wifi_ip_address" />
 
-            <EditText android:id="@+id/ipaddress"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:singleLine="true"
-                    android:inputType="textNoSuggestions" />
+                <EditText android:id="@+id/ipaddress"
+                        style="@style/wifi_item_content"
+                        android:singleLine="true"
+                        android:inputType="textNoSuggestions" />
+            </LinearLayout>
+            
+            <LinearLayout
+                    style="@style/wifi_item" >
+                <TextView
+                        style="@style/wifi_item_label"
+                        android:text="@string/wifi_gateway" />
 
-            <TextView
-                    style="?android:attr/textAppearanceSmall"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_marginTop="8dip"
-                    android:text="@string/wifi_gateway" />
+                <EditText android:id="@+id/gateway"
+                        style="@style/wifi_item_content"
+                        android:singleLine="true"
+                        android:inputType="textNoSuggestions" />
+            </LinearLayout>
 
-            <EditText android:id="@+id/gateway"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:singleLine="true"
-                    android:inputType="textNoSuggestions" />
+            <LinearLayout
+                    style="@style/wifi_item" >
+                <TextView
+                        style="@style/wifi_item_label"
+                        android:text="@string/wifi_network_prefix_length" />
 
-            <TextView
-                    style="?android:attr/textAppearanceSmall"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_marginTop="8dip"
-                    android:text="@string/wifi_network_prefix_length" />
+                <EditText android:id="@+id/network_prefix_length"
+                        style="@style/wifi_item_content"
+                        android:singleLine="true"
+                        android:inputType="textNoSuggestions" />
+            </LinearLayout>
+            <LinearLayout
+                    style="@style/wifi_item" >
+                <TextView
+                        style="@style/wifi_item_label"
+                        android:text="@string/wifi_dns1" />
 
-            <EditText android:id="@+id/network_prefix_length"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:singleLine="true"
-                    android:inputType="textNoSuggestions" />
+                <EditText android:id="@+id/dns1"
+                        style="@style/wifi_item_content"
+                        android:singleLine="true"
+                        android:inputType="textNoSuggestions" />
+            </LinearLayout>
 
-            <TextView
-                    style="?android:attr/textAppearanceSmall"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_marginTop="8dip"
-                    android:text="@string/wifi_dns1" />
+            <LinearLayout
+                    style="@style/wifi_item" >
+                <TextView
+                        style="@style/wifi_item_label"
+                        android:text="@string/wifi_dns2" />
 
-            <EditText android:id="@+id/dns1"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:singleLine="true"
-                    android:inputType="textNoSuggestions" />
-
-            <TextView
-                    style="?android:attr/textAppearanceSmall"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_marginTop="8dip"
-                    android:text="@string/wifi_dns2" />
-
-            <EditText android:id="@+id/dns2"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:singleLine="true"
-                    android:inputType="textNoSuggestions" />
-
+                <EditText android:id="@+id/dns2"
+                        style="@style/wifi_item_content"
+                        android:singleLine="true"
+                        android:inputType="textNoSuggestions" />
+            </LinearLayout>
         </LinearLayout>
+
         <LinearLayout android:id="@+id/proxy_settings_fields"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:orientation="vertical"
+                style="@style/wifi_item"
                 android:visibility="gone">
 
             <TextView
-                    style="?android:attr/textAppearanceSmall"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_marginTop="8dip"
+                    style="@style/wifi_item_label"
                     android:text="@string/proxy_settings_title" />
 
             <Spinner android:id="@+id/proxy_settings"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
+                    style="@style/wifi_item_content"
                     android:prompt="@string/proxy_settings_title"
                     android:entries="@array/wifi_proxy_settings" />
         </LinearLayout>
 
         <LinearLayout android:id="@+id/proxy_fields"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:orientation="vertical"
+                style="@style/wifi_section"
                 android:visibility="gone">
-            <TextView
-                    style="?android:attr/textAppearanceSmall"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_marginTop="8dip"
-                    android:text="@string/proxy_hostname_label" />
+            <LinearLayout style="@style/wifi_item">
+                <TextView
+                        style="@style/wifi_item_label"
+                        android:text="@string/proxy_hostname_label" />
 
-            <EditText android:id="@+id/proxy_hostname"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:singleLine="true"
-                    android:inputType="textNoSuggestions" />
-            <TextView
-                    style="?android:attr/textAppearanceSmall"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_marginTop="8dip"
-                    android:text="@string/proxy_port_label" />
+                <EditText android:id="@+id/proxy_hostname"
+                        style="@style/wifi_item_content"
+                        android:singleLine="true"
+                        android:inputType="textNoSuggestions" />
+            </LinearLayout>
+            <LinearLayout style="@style/wifi_item">
+                <TextView
+                        style="@style/wifi_item_label"
+                        android:text="@string/proxy_port_label" />
 
-            <EditText android:id="@+id/proxy_port"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:singleLine="true"
-                    android:inputType="textNoSuggestions" />
-            <TextView
-                    style="?android:attr/textAppearanceSmall"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_marginTop="8dip"
-                    android:text="@string/proxy_exclusionlist_label" />
+                <EditText android:id="@+id/proxy_port"
+                        style="@style/wifi_item_content"
+                        android:singleLine="true"
+                        android:inputType="textNoSuggestions" />
+            </LinearLayout>
+            <LinearLayout style="@style/wifi_item">
+                <TextView
+                        style="@style/wifi_item_label"
+                        android:text="@string/proxy_exclusionlist_label" />
 
-            <EditText android:id="@+id/proxy_exclusionlist"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:singleLine="true"
-                    android:inputType="textNoSuggestions" />
-
+                <EditText android:id="@+id/proxy_exclusionlist"
+                        style="@style/wifi_item_content"
+                        android:singleLine="true"
+                        android:inputType="textNoSuggestions" />
+            </LinearLayout>
         </LinearLayout>
 
     </LinearLayout>
diff --git a/res/layout/wifi_dialog_row.xml b/res/layout/wifi_dialog_row.xml
index 757d975..7ca2e5c 100644
--- a/res/layout/wifi_dialog_row.xml
+++ b/res/layout/wifi_dialog_row.xml
@@ -15,18 +15,13 @@
 -->
 
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content">
+        style="@style/wifi_item" >
     <TextView
-            android:id="@+id/name"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginRight="8dip"
-            android:textAppearance="?android:attr/textAppearanceSmall" />
+            style="@style/wifi_item_label"
+            android:id="@+id/name" />
+
     <TextView
             android:id="@+id/value"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:textAppearance="?android:attr/textAppearanceSmall"
+            style="@style/wifi_item_content"
             android:textStyle="bold" />
 </LinearLayout>
diff --git a/res/values-xlarge/styles.xml b/res/values-xlarge/styles.xml
index a3ac46f..5e3fead 100644
--- a/res/values-xlarge/styles.xml
+++ b/res/values-xlarge/styles.xml
@@ -20,4 +20,34 @@
         <item name="android:windowNoTitle">true</item>
     </style>
 
+    <style name="wifi_item">
+        <item name="android:layout_width">560dip</item>
+        <item name="android:layout_height">wrap_content</item>
+        <item name="android:layout_marginTop">8dip</item>
+        <item name="android:layout_marginLeft">32dip</item>
+        <item name="android:layout_marginRight">32dip</item>
+        <item name="android:orientation">horizontal</item>
+        <item name="android:gravity">center_vertical</item>
+    </style>
+
+    <style name="wifi_item_label">
+        <item name="android:layout_width">0dip</item>
+        <item name="android:layout_height">wrap_content</item>
+        <item name="android:layout_weight">3</item>
+        <item name="android:textSize">18sp</item>
+    </style>
+
+    <style name="wifi_item_content">
+        <item name="android:layout_width">0dip</item>
+        <item name="android:layout_height">wrap_content</item>
+        <item name="android:layout_weight">7</item>
+        <item name="android:textSize">18sp</item>
+    </style>
+
+    <style name="wifi_section">
+        <item name="android:layout_width">match_parent</item>
+        <item name="android:layout_height">wrap_content</item>
+        <item name="android:orientation">vertical</item>
+    </style>
+
 </resources>
\ No newline at end of file
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 5df08d7..36046c4 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -2906,6 +2906,10 @@
     <string name="backup_data_title">Back up my data</string>
     <!-- Summary text of the "back up data" setting -->
     <string name="backup_data_summary">Back up application data, Wi-Fi passwords, and other settings to Google servers</string>
+    <!-- Configure backup options menu title [CHAR LIMIT=25]-->
+    <string name="backup_configure_transport_title">Configure backup</string>
+    <!-- Default summary text of the "Configure backup" setting [CHAR LIMIT=80]-->
+    <string name="backup_configure_transport_default_summary">No backup destination is available.</string>
     <!-- Auto-restore menu title -->
     <string name="auto_restore_title">Automatic restore</string>
     <!-- Summary text of the "automatic restore" setting -->
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 991637b..969742f 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -81,5 +81,32 @@
     
     <style name="Theme.CreateShortCut" parent="android:Theme.Holo.DialogWhenLarge">
     </style>
-    
+
+    <style name="wifi_item">
+        <item name="android:layout_width">match_parent</item>
+        <item name="android:layout_height">wrap_content</item>
+        <item name="android:layout_marginTop">8dip</item>
+        <item name="android:layout_marginLeft">16dip</item>
+        <item name="android:layout_marginRight">16dip</item>
+        <item name="android:orientation">vertical</item>
+        <item name="android:gravity">left</item>
+    </style>
+
+    <style name="wifi_item_label">
+        <item name="android:layout_width">wrap_content</item>
+        <item name="android:layout_height">wrap_content</item>
+        <item name="android:textSize">14sp</item>
+    </style>
+
+    <style name="wifi_item_content">
+        <item name="android:layout_width">match_parent</item>
+        <item name="android:layout_height">wrap_content</item>
+        <item name="android:textSize">18sp</item>
+    </style>
+
+    <style name="wifi_section">
+        <item name="android:layout_width">match_parent</item>
+        <item name="android:layout_height">wrap_content</item>
+        <item name="android:orientation">vertical</item>
+    </style>
 </resources>
diff --git a/res/xml/privacy_settings.xml b/res/xml/privacy_settings.xml
index 86fc306..c28dbc1 100644
--- a/res/xml/privacy_settings.xml
+++ b/res/xml/privacy_settings.xml
@@ -25,6 +25,14 @@
                 android:title="@string/backup_data_title"
                 android:summary="@string/backup_data_summary"
                 android:persistent="false" />
+        <PreferenceScreen
+                android:key="configure_transport"
+                android:dependency="backup_data"
+                android:layout="?android:attr/preferenceLayoutChild"
+                android:title="@string/backup_configure_transport_title"
+                android:summary="@string/backup_configure_transport_default_summary">
+            <intent android:action="dummy" />
+        </PreferenceScreen>
         <CheckBoxPreference
                 android:key="auto_restore"
                 android:title="@string/auto_restore_title"
diff --git a/src/com/android/settings/ChooseLockGeneric.java b/src/com/android/settings/ChooseLockGeneric.java
index f87ee5a..264db5f 100644
--- a/src/com/android/settings/ChooseLockGeneric.java
+++ b/src/com/android/settings/ChooseLockGeneric.java
@@ -18,6 +18,7 @@
 
 import com.android.internal.widget.LockPatternUtils;
 
+import android.app.Activity;
 import android.app.admin.DevicePolicyManager;
 import android.content.Context;
 import android.content.Intent;
@@ -28,179 +29,190 @@
 import android.preference.PreferenceScreen;
 
 public class ChooseLockGeneric extends PreferenceActivity {
-    private static final int MIN_PASSWORD_LENGTH = 4;
-    private static final String KEY_UNLOCK_SET_OFF = "unlock_set_off";
-    private static final String KEY_UNLOCK_SET_NONE = "unlock_set_none";
-    private static final String KEY_UNLOCK_SET_PIN = "unlock_set_pin";
-    private static final String KEY_UNLOCK_SET_PASSWORD = "unlock_set_password";
-    private static final String KEY_UNLOCK_SET_PATTERN = "unlock_set_pattern";
-    private static final int CONFIRM_EXISTING_REQUEST = 100;
-    private static final String PASSWORD_CONFIRMED = "password_confirmed";
-    private static final String CONFIRM_CREDENTIALS = "confirm_credentials";
-
-    private ChooseLockSettingsHelper mChooseLockSettingsHelper;
-    private DevicePolicyManager mDPM;
-    private boolean mPasswordConfirmed = false;
 
     @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
+    public Intent getIntent() {
+        Intent modIntent = new Intent(super.getIntent());
+        modIntent.putExtra(EXTRA_SHOW_FRAGMENT, ChooseLockGenericFragment.class.getName());
+        modIntent.putExtra(EXTRA_NO_HEADERS, true);
+        return modIntent;
+    }
 
-        mDPM = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
-        mChooseLockSettingsHelper = new ChooseLockSettingsHelper(this);
+    public static class ChooseLockGenericFragment extends SettingsPreferenceFragment {
+        private static final int MIN_PASSWORD_LENGTH = 4;
+        private static final String KEY_UNLOCK_SET_OFF = "unlock_set_off";
+        private static final String KEY_UNLOCK_SET_NONE = "unlock_set_none";
+        private static final String KEY_UNLOCK_SET_PIN = "unlock_set_pin";
+        private static final String KEY_UNLOCK_SET_PASSWORD = "unlock_set_password";
+        private static final String KEY_UNLOCK_SET_PATTERN = "unlock_set_pattern";
+        private static final int CONFIRM_EXISTING_REQUEST = 100;
+        private static final String PASSWORD_CONFIRMED = "password_confirmed";
+        private static final String CONFIRM_CREDENTIALS = "confirm_credentials";
 
-        if (savedInstanceState != null) {
-            mPasswordConfirmed = savedInstanceState.getBoolean(PASSWORD_CONFIRMED);
-        }
+        private ChooseLockSettingsHelper mChooseLockSettingsHelper;
+        private DevicePolicyManager mDPM;
+        private boolean mPasswordConfirmed = false;
 
-        if (!mPasswordConfirmed) {
-            ChooseLockSettingsHelper helper = new ChooseLockSettingsHelper(this);
-            if (!helper.launchConfirmationActivity(CONFIRM_EXISTING_REQUEST, null, null)) {
-                mPasswordConfirmed = true; // no password set, so no need to confirm
+        @Override
+        public void onCreate(Bundle savedInstanceState) {
+            super.onCreate(savedInstanceState);
+
+            mDPM = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
+            mChooseLockSettingsHelper = new ChooseLockSettingsHelper(this.getActivity());
+
+            if (savedInstanceState != null) {
+                mPasswordConfirmed = savedInstanceState.getBoolean(PASSWORD_CONFIRMED);
+            }
+
+            if (!mPasswordConfirmed) {
+                ChooseLockSettingsHelper helper = new ChooseLockSettingsHelper(this.getActivity(), this);
+                if (!helper.launchConfirmationActivity(CONFIRM_EXISTING_REQUEST, null, null)) {
+                    mPasswordConfirmed = true; // no password set, so no need to confirm
+                    updatePreferencesOrFinish();
+                }
+            } else {
                 updatePreferencesOrFinish();
             }
-        } else {
-            updatePreferencesOrFinish();
         }
-    }
 
-    @Override
-    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
-            Preference preference) {
-        final String key = preference.getKey();
-        boolean handled = true;
-        if (KEY_UNLOCK_SET_OFF.equals(key)) {
-            updateUnlockMethodAndFinish(DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED, true);
-        } else if (KEY_UNLOCK_SET_NONE.equals(key)) {
-            updateUnlockMethodAndFinish(DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED, false);
-        } else if (KEY_UNLOCK_SET_PATTERN.equals(key)) {
-            updateUnlockMethodAndFinish(DevicePolicyManager.PASSWORD_QUALITY_SOMETHING, false);
-        } else if (KEY_UNLOCK_SET_PIN.equals(key)) {
-            updateUnlockMethodAndFinish(DevicePolicyManager.PASSWORD_QUALITY_NUMERIC, false);
-        } else if (KEY_UNLOCK_SET_PASSWORD.equals(key)) {
-            updateUnlockMethodAndFinish(DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC, false);
-        } else {
-            handled = false;
+        @Override
+        public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
+                Preference preference) {
+            final String key = preference.getKey();
+            boolean handled = true;
+            if (KEY_UNLOCK_SET_OFF.equals(key)) {
+                updateUnlockMethodAndFinish(DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED, true);
+            } else if (KEY_UNLOCK_SET_NONE.equals(key)) {
+                updateUnlockMethodAndFinish(DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED, false);
+            } else if (KEY_UNLOCK_SET_PATTERN.equals(key)) {
+                updateUnlockMethodAndFinish(DevicePolicyManager.PASSWORD_QUALITY_SOMETHING, false);
+            } else if (KEY_UNLOCK_SET_PIN.equals(key)) {
+                updateUnlockMethodAndFinish(DevicePolicyManager.PASSWORD_QUALITY_NUMERIC, false);
+            } else if (KEY_UNLOCK_SET_PASSWORD.equals(key)) {
+                updateUnlockMethodAndFinish(DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC, false);
+            } else {
+                handled = false;
+            }
+            return handled;
         }
-        return handled;
-    }
 
-    @Override
-    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
-        super.onActivityResult(requestCode, resultCode, data);
-        if (requestCode == CONFIRM_EXISTING_REQUEST && resultCode == RESULT_OK) {
-            mPasswordConfirmed = true;
-            updatePreferencesOrFinish();
-        } else {
-            setResult(RESULT_CANCELED);
+        @Override
+        public void onActivityResult(int requestCode, int resultCode, Intent data) {
+            super.onActivityResult(requestCode, resultCode, data);
+            if (requestCode == CONFIRM_EXISTING_REQUEST && resultCode == Activity.RESULT_OK) {
+                mPasswordConfirmed = true;
+                updatePreferencesOrFinish();
+            } else {
+                getActivity().setResult(Activity.RESULT_CANCELED);
+                finish();
+            }
+        }
+
+        @Override
+        public void onSaveInstanceState(Bundle outState) {
+            super.onSaveInstanceState(outState);
+            // Saved so we don't force user to re-enter their password if configuration changes
+            outState.putBoolean(PASSWORD_CONFIRMED, mPasswordConfirmed);
+        }
+
+        private void updatePreferencesOrFinish() {
+            int quality = getActivity().getIntent().getIntExtra(LockPatternUtils.PASSWORD_TYPE_KEY, -1);
+            if (quality == -1) {
+                // If caller didn't specify password quality, show the UI and allow the user to choose.
+                quality = mChooseLockSettingsHelper.utils().getKeyguardStoredPasswordQuality();
+                final PreferenceScreen prefScreen = getPreferenceScreen();
+                if (prefScreen != null) {
+                    prefScreen.removeAll();
+                }
+                addPreferencesFromResource(R.xml.security_settings_picker);
+                disableUnusablePreferences(mDPM.getPasswordQuality(null));
+            } else {
+                updateUnlockMethodAndFinish(quality, false);
+            }
+        }
+
+        /***
+         * Disables preferences that are less secure than required quality.
+         *
+         * @param quality the requested quality.
+         */
+        private void disableUnusablePreferences(final int quality) {
+            final Preference picker = getPreferenceScreen().findPreference("security_picker_category");
+            final PreferenceCategory cat = (PreferenceCategory) picker;
+            final int preferenceCount = cat.getPreferenceCount();
+            for (int i = 0; i < preferenceCount; i++) {
+                Preference pref = cat.getPreference(i);
+                if (pref instanceof PreferenceScreen) {
+                    final String key = ((PreferenceScreen) pref).getKey();
+                    boolean enabled = true;
+                    if (KEY_UNLOCK_SET_OFF.equals(key)) {
+                        enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
+                    } else if (KEY_UNLOCK_SET_NONE.equals(key)) {
+                        enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
+                    } else if (KEY_UNLOCK_SET_PATTERN.equals(key)) {
+                        enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_SOMETHING;
+                    } else if (KEY_UNLOCK_SET_PIN.equals(key)) {
+                        enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_NUMERIC;
+                    } else if (KEY_UNLOCK_SET_PASSWORD.equals(key)) {
+                        enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_COMPLEX;
+                    }
+                    if (!enabled) {
+                        pref.setSummary(R.string.unlock_set_unlock_disabled_summary);
+                        pref.setEnabled(false);
+                    }
+                }
+            }
+        }
+
+        /**
+         * Invokes an activity to change the user's pattern, password or PIN based on given quality
+         * and minimum quality specified by DevicePolicyManager. If quality is
+         * {@link DevicePolicyManager#PASSWORD_QUALITY_UNSPECIFIED}, password is cleared.
+         *
+         * @param quality the desired quality. Ignored if DevicePolicyManager requires more security.
+         * @param disabled whether or not to show LockScreen at all. Only meaningful when quality is
+         * {@link DevicePolicyManager#PASSWORD_QUALITY_UNSPECIFIED}
+         */
+        void updateUnlockMethodAndFinish(int quality, boolean disabled) {
+            // Sanity check. We should never get here without confirming user's existing password first.
+            if (!mPasswordConfirmed) {
+                throw new IllegalStateException("Tried to update password without confirming first");
+            }
+
+            // Compare minimum allowed password quality and launch appropriate security setting method
+            int minQuality = mDPM.getPasswordQuality(null);
+            if (quality < minQuality) {
+                quality = minQuality;
+            }
+            if (quality >= DevicePolicyManager.PASSWORD_QUALITY_NUMERIC) {
+                int minLength = mDPM.getPasswordMinimumLength(null);
+                if (minLength < MIN_PASSWORD_LENGTH) {
+                    minLength = MIN_PASSWORD_LENGTH;
+                }
+                final int maxLength = mDPM.getPasswordMaximumLength(quality);
+                Intent intent = new Intent().setClass(getActivity(), ChooseLockPassword.class);
+                intent.putExtra(LockPatternUtils.PASSWORD_TYPE_KEY, quality);
+                intent.putExtra(ChooseLockPassword.PASSWORD_MIN_KEY, minLength);
+                intent.putExtra(ChooseLockPassword.PASSWORD_MAX_KEY, maxLength);
+                intent.putExtra(CONFIRM_CREDENTIALS, false);
+                intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
+                startActivity(intent);
+            } else if (quality == DevicePolicyManager.PASSWORD_QUALITY_SOMETHING) {
+                boolean showTutorial = !mChooseLockSettingsHelper.utils().isPatternEverChosen();
+                Intent intent = new Intent();
+                intent.setClass(getActivity(), showTutorial
+                        ? ChooseLockPatternTutorial.class
+                        : ChooseLockPattern.class);
+                intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
+                intent.putExtra("key_lock_method", "pattern");
+                intent.putExtra(CONFIRM_CREDENTIALS, false);
+                startActivity(intent);
+            } else if (quality == DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED) {
+                mChooseLockSettingsHelper.utils().clearLock();
+                mChooseLockSettingsHelper.utils().setLockScreenDisabled(disabled);
+                getActivity().setResult(Activity.RESULT_OK);
+            }
             finish();
         }
     }
-
-    @Override
-    protected void onSaveInstanceState(Bundle outState) {
-        super.onSaveInstanceState(outState);
-        // Saved so we don't force user to re-enter their password if configuration changes
-        outState.putBoolean(PASSWORD_CONFIRMED, mPasswordConfirmed);
-    }
-
-    private void updatePreferencesOrFinish() {
-        int quality = getIntent().getIntExtra(LockPatternUtils.PASSWORD_TYPE_KEY, -1);
-        if (quality == -1) {
-            // If caller didn't specify password quality, show the UI and allow the user to choose.
-            quality = mChooseLockSettingsHelper.utils().getKeyguardStoredPasswordQuality();
-            final PreferenceScreen prefScreen = getPreferenceScreen();
-            if (prefScreen != null) {
-                prefScreen.removeAll();
-            }
-            addPreferencesFromResource(R.xml.security_settings_picker);
-            disableUnusablePreferences(mDPM.getPasswordQuality(null));
-        } else {
-            updateUnlockMethodAndFinish(quality, false);
-        }
-    }
-
-    /***
-     * Disables preferences that are less secure than required quality.
-     *
-     * @param quality the requested quality.
-     */
-    private void disableUnusablePreferences(final int quality) {
-        final Preference picker = getPreferenceScreen().findPreference("security_picker_category");
-        final PreferenceCategory cat = (PreferenceCategory) picker;
-        final int preferenceCount = cat.getPreferenceCount();
-        for (int i = 0; i < preferenceCount; i++) {
-            Preference pref = cat.getPreference(i);
-            if (pref instanceof PreferenceScreen) {
-                final String key = ((PreferenceScreen) pref).getKey();
-                boolean enabled = true;
-                if (KEY_UNLOCK_SET_OFF.equals(key)) {
-                    enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
-                } else if (KEY_UNLOCK_SET_NONE.equals(key)) {
-                    enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
-                } else if (KEY_UNLOCK_SET_PATTERN.equals(key)) {
-                    enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_SOMETHING;
-                } else if (KEY_UNLOCK_SET_PIN.equals(key)) {
-                    enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_NUMERIC;
-                } else if (KEY_UNLOCK_SET_PASSWORD.equals(key)) {
-                    enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_COMPLEX;
-                }
-                if (!enabled) {
-                    pref.setSummary(R.string.unlock_set_unlock_disabled_summary);
-                    pref.setEnabled(false);
-                }
-            }
-        }
-    }
-
-    /**
-     * Invokes an activity to change the user's pattern, password or PIN based on given quality
-     * and minimum quality specified by DevicePolicyManager. If quality is
-     * {@link DevicePolicyManager#PASSWORD_QUALITY_UNSPECIFIED}, password is cleared.
-     *
-     * @param quality the desired quality. Ignored if DevicePolicyManager requires more security.
-     * @param disabled whether or not to show LockScreen at all. Only meaningful when quality is
-     * {@link DevicePolicyManager#PASSWORD_QUALITY_UNSPECIFIED}
-     */
-    void updateUnlockMethodAndFinish(int quality, boolean disabled) {
-        // Sanity check. We should never get here without confirming user's existing password first.
-        if (!mPasswordConfirmed) {
-            throw new IllegalStateException("Tried to update password without confirming first");
-        }
-
-        // Compare minimum allowed password quality and launch appropriate security setting method
-        int minQuality = mDPM.getPasswordQuality(null);
-        if (quality < minQuality) {
-            quality = minQuality;
-        }
-        if (quality >= DevicePolicyManager.PASSWORD_QUALITY_NUMERIC) {
-            int minLength = mDPM.getPasswordMinimumLength(null);
-            if (minLength < MIN_PASSWORD_LENGTH) {
-                minLength = MIN_PASSWORD_LENGTH;
-            }
-            final int maxLength = mDPM.getPasswordMaximumLength(quality);
-            Intent intent = new Intent().setClass(this, ChooseLockPassword.class);
-            intent.putExtra(LockPatternUtils.PASSWORD_TYPE_KEY, quality);
-            intent.putExtra(ChooseLockPassword.PASSWORD_MIN_KEY, minLength);
-            intent.putExtra(ChooseLockPassword.PASSWORD_MAX_KEY, maxLength);
-            intent.putExtra(CONFIRM_CREDENTIALS, false);
-            intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
-            startActivity(intent);
-        } else if (quality == DevicePolicyManager.PASSWORD_QUALITY_SOMETHING) {
-            boolean showTutorial = !mChooseLockSettingsHelper.utils().isPatternEverChosen();
-            Intent intent = new Intent();
-            intent.setClass(this, showTutorial
-                    ? ChooseLockPatternTutorial.class
-                    : ChooseLockPattern.class);
-            intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
-            intent.putExtra("key_lock_method", "pattern");
-            intent.putExtra(CONFIRM_CREDENTIALS, false);
-            startActivity(intent);
-        } else if (quality == DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED) {
-            mChooseLockSettingsHelper.utils().clearLock();
-            mChooseLockSettingsHelper.utils().setLockScreenDisabled(disabled);
-            setResult(RESULT_OK);
-        }
-        finish();
-    }
 }
diff --git a/src/com/android/settings/ChooseLockPassword.java b/src/com/android/settings/ChooseLockPassword.java
index 4d447f4..08e382c 100644
--- a/src/com/android/settings/ChooseLockPassword.java
+++ b/src/com/android/settings/ChooseLockPassword.java
@@ -21,19 +21,22 @@
 import com.android.internal.widget.PasswordEntryKeyboardView;
 
 import android.app.Activity;
+import android.app.Fragment;
 import android.app.admin.DevicePolicyManager;
 import android.content.Intent;
 import android.inputmethodservice.KeyboardView;
 import android.os.Bundle;
 import android.os.Handler;
+import android.preference.PreferenceActivity;
 import android.text.Editable;
 import android.text.Selection;
 import android.text.Spannable;
 import android.text.TextUtils;
 import android.text.TextWatcher;
 import android.view.KeyEvent;
+import android.view.LayoutInflater;
 import android.view.View;
-import android.view.WindowManager;
+import android.view.ViewGroup;
 import android.view.View.OnClickListener;
 import android.view.inputmethod.EditorInfo;
 import android.widget.Button;
@@ -41,30 +44,7 @@
 import android.widget.TextView.OnEditorActionListener;
 
 
-public class ChooseLockPassword extends Activity implements OnClickListener, OnEditorActionListener,
-        TextWatcher {
-    private static final String KEY_FIRST_PIN = "first_pin";
-    private static final String KEY_UI_STAGE = "ui_stage";
-    private TextView mPasswordEntry;
-    private int mPasswordMinLength = 4;
-    private int mPasswordMaxLength = 16;
-    private int mPasswordMinLetters = 0;
-    private int mPasswordMinUpperCase = 0;
-    private int mPasswordMinLowerCase = 0;
-    private int mPasswordMinSymbols = 0;
-    private int mPasswordMinNumeric = 0;
-    private int mPasswordMinNonLetter = 0;
-    private LockPatternUtils mLockPatternUtils;
-    private int mRequestedQuality = DevicePolicyManager.PASSWORD_QUALITY_NUMERIC;
-    private ChooseLockSettingsHelper mChooseLockSettingsHelper;
-    private com.android.settings.ChooseLockPassword.Stage mUiStage = Stage.Introduction;
-    private TextView mHeaderText;
-    private String mFirstPin;
-    private KeyboardView mKeyboardView;
-    private PasswordEntryKeyboardHelper mKeyboardHelper;
-    private boolean mIsAlphaMode;
-    private Button mCancelButton;
-    private Button mNextButton;
+public class ChooseLockPassword extends PreferenceActivity {
     public static final String PASSWORD_MIN_KEY = "lockscreen.password_min";
     public static final String PASSWORD_MAX_KEY = "lockscreen.password_max";
     public static final String PASSWORD_MIN_LETTERS_KEY = "lockscreen.password_min_letters";
@@ -73,345 +53,393 @@
     public static final String PASSWORD_MIN_NUMERIC_KEY = "lockscreen.password_min_numeric";
     public static final String PASSWORD_MIN_SYMBOLS_KEY = "lockscreen.password_min_symbols";
     public static final String PASSWORD_MIN_NONLETTER_KEY = "lockscreen.password_min_nonletter";
-    private static Handler mHandler = new Handler();
-    private static final int CONFIRM_EXISTING_REQUEST = 58;
-    static final int RESULT_FINISHED = RESULT_FIRST_USER;
-    private static final long ERROR_MESSAGE_TIMEOUT = 3000;
 
-    /**
-     * Keep track internally of where the user is in choosing a pattern.
-     */
-    protected enum Stage {
+    @Override
+    public Intent getIntent() {
+        Intent modIntent = new Intent(super.getIntent());
+        modIntent.putExtra(EXTRA_SHOW_FRAGMENT, ChooseLockPasswordFragment.class.getName());
+        modIntent.putExtra(EXTRA_NO_HEADERS, true);
+        return modIntent;
+    }
 
-        Introduction(R.string.lockpassword_choose_your_password_header,
-                R.string.lockpassword_choose_your_pin_header,
-                R.string.lockpassword_continue_label),
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        // TODO: Fix on phones
+        // Disable IME on our window since we provide our own keyboard
+        //getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
+                //WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
+        super.onCreate(savedInstanceState);
+    }
 
-        NeedToConfirm(R.string.lockpassword_confirm_your_password_header,
-                R.string.lockpassword_confirm_your_pin_header,
-                R.string.lockpassword_ok_label),
-
-        ConfirmWrong(R.string.lockpassword_confirm_passwords_dont_match,
-                R.string.lockpassword_confirm_pins_dont_match,
-                R.string.lockpassword_continue_label);
+    public static class ChooseLockPasswordFragment extends Fragment
+            implements OnClickListener, OnEditorActionListener,  TextWatcher {
+        private static final String KEY_FIRST_PIN = "first_pin";
+        private static final String KEY_UI_STAGE = "ui_stage";
+        private TextView mPasswordEntry;
+        private int mPasswordMinLength = 4;
+        private int mPasswordMaxLength = 16;
+        private int mPasswordMinLetters = 0;
+        private int mPasswordMinUpperCase = 0;
+        private int mPasswordMinLowerCase = 0;
+        private int mPasswordMinSymbols = 0;
+        private int mPasswordMinNumeric = 0;
+        private int mPasswordMinNonLetter = 0;
+        private LockPatternUtils mLockPatternUtils;
+        private int mRequestedQuality = DevicePolicyManager.PASSWORD_QUALITY_NUMERIC;
+        private ChooseLockSettingsHelper mChooseLockSettingsHelper;
+        private Stage mUiStage = Stage.Introduction;
+        private TextView mHeaderText;
+        private String mFirstPin;
+        private KeyboardView mKeyboardView;
+        private PasswordEntryKeyboardHelper mKeyboardHelper;
+        private boolean mIsAlphaMode;
+        private Button mCancelButton;
+        private Button mNextButton;
+        private static Handler mHandler = new Handler();
+        private static final int CONFIRM_EXISTING_REQUEST = 58;
+        static final int RESULT_FINISHED = RESULT_FIRST_USER;
+        private static final long ERROR_MESSAGE_TIMEOUT = 3000;
 
         /**
-         * @param headerMessage The message displayed at the top.
+         * Keep track internally of where the user is in choosing a pattern.
          */
-        Stage(int hintInAlpha, int hintInNumeric, int nextButtonText) {
-            this.alphaHint = hintInAlpha;
-            this.numericHint = hintInNumeric;
-            this.buttonText = nextButtonText;
-        }
+        protected enum Stage {
 
-        public final int alphaHint;
-        public final int numericHint;
-        public final int buttonText;
-    }
+            Introduction(R.string.lockpassword_choose_your_password_header,
+                    R.string.lockpassword_choose_your_pin_header,
+                    R.string.lockpassword_continue_label),
 
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        mLockPatternUtils = new LockPatternUtils(this);
-        mRequestedQuality = Math.max(getIntent().getIntExtra(LockPatternUtils.PASSWORD_TYPE_KEY,
-                mRequestedQuality), mLockPatternUtils.getRequestedPasswordQuality());
-        mPasswordMinLength = Math.max(
-                getIntent().getIntExtra(PASSWORD_MIN_KEY, mPasswordMinLength), mLockPatternUtils
-                        .getRequestedMinimumPasswordLength());
-        mPasswordMaxLength = getIntent().getIntExtra(PASSWORD_MAX_KEY, mPasswordMaxLength);
-        mPasswordMinLetters = Math.max(getIntent().getIntExtra(PASSWORD_MIN_LETTERS_KEY,
-                mPasswordMinLetters), mLockPatternUtils.getRequestedPasswordMinimumLetters());
-        mPasswordMinUpperCase = Math.max(getIntent().getIntExtra(PASSWORD_MIN_UPPERCASE_KEY,
-                mPasswordMinUpperCase), mLockPatternUtils.getRequestedPasswordMinimumUpperCase());
-        mPasswordMinLowerCase = Math.max(getIntent().getIntExtra(PASSWORD_MIN_LOWERCASE_KEY,
-                mPasswordMinLowerCase), mLockPatternUtils.getRequestedPasswordMinimumLowerCase());
-        mPasswordMinNumeric = Math.max(getIntent().getIntExtra(PASSWORD_MIN_NUMERIC_KEY,
-                mPasswordMinNumeric), mLockPatternUtils.getRequestedPasswordMinimumNumeric());
-        mPasswordMinSymbols = Math.max(getIntent().getIntExtra(PASSWORD_MIN_SYMBOLS_KEY,
-                mPasswordMinSymbols), mLockPatternUtils.getRequestedPasswordMinimumSymbols());
-        mPasswordMinNonLetter = Math.max(getIntent().getIntExtra(PASSWORD_MIN_NONLETTER_KEY,
-                mPasswordMinNonLetter), mLockPatternUtils.getRequestedPasswordMinimumNonLetter());
-        final boolean confirmCredentials = getIntent().getBooleanExtra("confirm_credentials", true);
+            NeedToConfirm(R.string.lockpassword_confirm_your_password_header,
+                    R.string.lockpassword_confirm_your_pin_header,
+                    R.string.lockpassword_ok_label),
 
+            ConfirmWrong(R.string.lockpassword_confirm_passwords_dont_match,
+                    R.string.lockpassword_confirm_pins_dont_match,
+                    R.string.lockpassword_continue_label);
 
-        initViews();
-        mChooseLockSettingsHelper = new ChooseLockSettingsHelper(this);
-        if (savedInstanceState == null) {
-            updateStage(Stage.Introduction);
-            if (confirmCredentials) {
-                mChooseLockSettingsHelper.launchConfirmationActivity(CONFIRM_EXISTING_REQUEST,
-                        null, null);
+            /**
+             * @param headerMessage The message displayed at the top.
+             */
+            Stage(int hintInAlpha, int hintInNumeric, int nextButtonText) {
+                this.alphaHint = hintInAlpha;
+                this.numericHint = hintInNumeric;
+                this.buttonText = nextButtonText;
             }
+
+            public final int alphaHint;
+            public final int numericHint;
+            public final int buttonText;
         }
-    }
 
-    private void initViews() {
-        setContentView(R.layout.choose_lock_password);
-        // Disable IME on our window since we provide our own keyboard
-        getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
-                WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
+        // required constructor for fragments
+        public ChooseLockPasswordFragment() {
 
-        mCancelButton = (Button) findViewById(R.id.cancel_button);
-        mCancelButton.setOnClickListener(this);
-        mNextButton = (Button) findViewById(R.id.next_button);
-        mNextButton.setOnClickListener(this);
+        }
 
-        mKeyboardView = (PasswordEntryKeyboardView) findViewById(R.id.keyboard);
-        mPasswordEntry = (TextView) findViewById(R.id.password_entry);
-        mPasswordEntry.setOnEditorActionListener(this);
-        mPasswordEntry.addTextChangedListener(this);
+        @Override
+        public void onCreate(Bundle savedInstanceState) {
+            super.onCreate(savedInstanceState);
+            mLockPatternUtils = new LockPatternUtils(getActivity());
+            Intent intent = getActivity().getIntent();
+            mRequestedQuality = Math.max(intent.getIntExtra(LockPatternUtils.PASSWORD_TYPE_KEY,
+                    mRequestedQuality), mLockPatternUtils.getRequestedPasswordQuality());
+            mPasswordMinLength = Math.max(
+                    intent.getIntExtra(PASSWORD_MIN_KEY, mPasswordMinLength), mLockPatternUtils
+                            .getRequestedMinimumPasswordLength());
+            mPasswordMaxLength = intent.getIntExtra(PASSWORD_MAX_KEY, mPasswordMaxLength);
+            mPasswordMinLetters = Math.max(intent.getIntExtra(PASSWORD_MIN_LETTERS_KEY,
+                    mPasswordMinLetters), mLockPatternUtils.getRequestedPasswordMinimumLetters());
+            mPasswordMinUpperCase = Math.max(intent.getIntExtra(PASSWORD_MIN_UPPERCASE_KEY,
+                    mPasswordMinUpperCase), mLockPatternUtils.getRequestedPasswordMinimumUpperCase());
+            mPasswordMinLowerCase = Math.max(intent.getIntExtra(PASSWORD_MIN_LOWERCASE_KEY,
+                    mPasswordMinLowerCase), mLockPatternUtils.getRequestedPasswordMinimumLowerCase());
+            mPasswordMinNumeric = Math.max(intent.getIntExtra(PASSWORD_MIN_NUMERIC_KEY,
+                    mPasswordMinNumeric), mLockPatternUtils.getRequestedPasswordMinimumNumeric());
+            mPasswordMinSymbols = Math.max(intent.getIntExtra(PASSWORD_MIN_SYMBOLS_KEY,
+                    mPasswordMinSymbols), mLockPatternUtils.getRequestedPasswordMinimumSymbols());
+            mPasswordMinNonLetter = Math.max(intent.getIntExtra(PASSWORD_MIN_NONLETTER_KEY,
+                    mPasswordMinNonLetter), mLockPatternUtils.getRequestedPasswordMinimumNonLetter());
 
-        mIsAlphaMode = DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC == mRequestedQuality
-                || DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC == mRequestedQuality
-                || DevicePolicyManager.PASSWORD_QUALITY_COMPLEX == mRequestedQuality;
-        mKeyboardHelper = new PasswordEntryKeyboardHelper(this, mKeyboardView, mPasswordEntry);
-        mKeyboardHelper.setKeyboardMode(mIsAlphaMode ?
-                PasswordEntryKeyboardHelper.KEYBOARD_MODE_ALPHA
-                : PasswordEntryKeyboardHelper.KEYBOARD_MODE_NUMERIC);
+            mChooseLockSettingsHelper = new ChooseLockSettingsHelper(getActivity());
+        }
 
-        mHeaderText = (TextView) findViewById(R.id.headerText);
-        mKeyboardView.requestFocus();
-    }
+        @Override
+        public View onCreateView(LayoutInflater inflater, ViewGroup container,
+                Bundle savedInstanceState) {
 
-    @Override
-    protected void onResume() {
-        super.onResume();
-        updateStage(mUiStage);
-        mKeyboardView.requestFocus();
-    }
+            View view = inflater.inflate(R.layout.choose_lock_password, null);
 
-    @Override
-    protected void onSaveInstanceState(Bundle outState) {
-        super.onSaveInstanceState(outState);
-        outState.putString(KEY_UI_STAGE, mUiStage.name());
-        outState.putString(KEY_FIRST_PIN, mFirstPin);
-    }
+            mCancelButton = (Button) view.findViewById(R.id.cancel_button);
+            mCancelButton.setOnClickListener(this);
+            mNextButton = (Button) view.findViewById(R.id.next_button);
+            mNextButton.setOnClickListener(this);
 
-    @Override
-    protected void onRestoreInstanceState(Bundle savedInstanceState) {
-        super.onRestoreInstanceState(savedInstanceState);
-        String state = savedInstanceState.getString(KEY_UI_STAGE);
-        mFirstPin = savedInstanceState.getString(KEY_FIRST_PIN);
-        if (state != null) {
-            mUiStage = Stage.valueOf(state);
+            mIsAlphaMode = DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC == mRequestedQuality
+                    || DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC == mRequestedQuality
+                    || DevicePolicyManager.PASSWORD_QUALITY_COMPLEX == mRequestedQuality;
+            mKeyboardView = (PasswordEntryKeyboardView) view.findViewById(R.id.keyboard);
+            mPasswordEntry = (TextView) view.findViewById(R.id.password_entry);
+            mPasswordEntry.setOnEditorActionListener(this);
+            mPasswordEntry.addTextChangedListener(this);
+
+            mKeyboardHelper = new PasswordEntryKeyboardHelper(getActivity(),
+                    mKeyboardView, mPasswordEntry);
+            mKeyboardHelper.setKeyboardMode(mIsAlphaMode ?
+                    PasswordEntryKeyboardHelper.KEYBOARD_MODE_ALPHA
+                    : PasswordEntryKeyboardHelper.KEYBOARD_MODE_NUMERIC);
+
+            mHeaderText = (TextView) view.findViewById(R.id.headerText);
+            mKeyboardView.requestFocus();
+
+            Intent intent = getActivity().getIntent();
+            final boolean confirmCredentials = intent.getBooleanExtra("confirm_credentials", true);
+            if (savedInstanceState == null) {
+                updateStage(Stage.Introduction);
+                if (confirmCredentials) {
+                    mChooseLockSettingsHelper.launchConfirmationActivity(CONFIRM_EXISTING_REQUEST,
+                            null, null);
+                }
+            } else {
+                mFirstPin = savedInstanceState.getString(KEY_FIRST_PIN);
+                final String state = savedInstanceState.getString(KEY_UI_STAGE);
+                if (state != null) {
+                    mUiStage = Stage.valueOf(state);
+                    updateStage(mUiStage);
+                }
+            }
+
+            return view;
+        }
+
+        @Override
+        public void onResume() {
+            super.onResume();
             updateStage(mUiStage);
+            mKeyboardView.requestFocus();
         }
-    }
 
-    @Override
-    protected void onActivityResult(int requestCode, int resultCode,
-            Intent data) {
-        super.onActivityResult(requestCode, resultCode, data);
-        switch (requestCode) {
-            case CONFIRM_EXISTING_REQUEST:
-                if (resultCode != Activity.RESULT_OK) {
-                    setResult(RESULT_FINISHED);
-                    finish();
-                }
-                break;
+        @Override
+        public void onSaveInstanceState(Bundle outState) {
+            super.onSaveInstanceState(outState);
+            outState.putString(KEY_UI_STAGE, mUiStage.name());
+            outState.putString(KEY_FIRST_PIN, mFirstPin);
         }
-    }
 
-    protected void updateStage(Stage stage) {
-        mUiStage = stage;
-        updateUi();
-    }
-
-    /**
-     * Validates PIN and returns a message to display if PIN fails test.
-     * @param password the raw password the user typed in
-     * @return error message to show to user or null if password is OK
-     */
-    private String validatePassword(String password) {
-        if (password.length() < mPasswordMinLength) {
-            return getString(mIsAlphaMode ?
-                    R.string.lockpassword_password_too_short
-                    : R.string.lockpassword_pin_too_short, mPasswordMinLength);
-        }
-        if (password.length() > mPasswordMaxLength) {
-            return getString(mIsAlphaMode ?
-                    R.string.lockpassword_password_too_long
-                    : R.string.lockpassword_pin_too_long, mPasswordMaxLength);
-        }
-        int letters = 0;
-        int numbers = 0;
-        int lowercase = 0;
-        int symbols = 0;
-        int uppercase = 0;
-        int nonletter = 0;
-        for (int i = 0; i < password.length(); i++) {
-            char c = password.charAt(i);
-            // allow non white space Latin-1 characters only
-            if (c <= 32 || c > 127) {
-                return getString(R.string.lockpassword_illegal_character);
-            }
-            if (c >= '0' && c <= '9') {
-                numbers++;
-                nonletter++;
-            } else if (c >= 'A' && c <= 'Z') {
-                letters++;
-                uppercase++;
-            } else if (c >= 'a' && c <= 'z') {
-                letters++;
-                lowercase++;
-            } else {
-                symbols++;
-                nonletter++;
+        @Override
+        public void onActivityResult(int requestCode, int resultCode,
+                Intent data) {
+            super.onActivityResult(requestCode, resultCode, data);
+            switch (requestCode) {
+                case CONFIRM_EXISTING_REQUEST:
+                    if (resultCode != Activity.RESULT_OK) {
+                        getActivity().setResult(RESULT_FINISHED);
+                        getActivity().finish();
+                    }
+                    break;
             }
         }
-        if (DevicePolicyManager.PASSWORD_QUALITY_NUMERIC == mRequestedQuality
-                && (letters > 0 || symbols > 0)) {
-            // This shouldn't be possible unless user finds some way to bring up
-            // soft keyboard
-            return getString(R.string.lockpassword_pin_contains_non_digits);
-        } else if (DevicePolicyManager.PASSWORD_QUALITY_COMPLEX == mRequestedQuality) {
-            if (letters < mPasswordMinLetters) {
-                return String.format(getResources().getQuantityString(
-                        R.plurals.lockpassword_password_requires_letters, mPasswordMinLetters),
-                        mPasswordMinLetters);
-            } else if (numbers < mPasswordMinNumeric) {
-                return String.format(getResources().getQuantityString(
-                        R.plurals.lockpassword_password_requires_numeric, mPasswordMinNumeric),
-                        mPasswordMinNumeric);
-            } else if (lowercase < mPasswordMinLowerCase) {
-                return String.format(getResources().getQuantityString(
-                        R.plurals.lockpassword_password_requires_lowercase, mPasswordMinLowerCase),
-                        mPasswordMinLowerCase);
-            } else if (uppercase < mPasswordMinUpperCase) {
-                return String.format(getResources().getQuantityString(
-                        R.plurals.lockpassword_password_requires_uppercase, mPasswordMinUpperCase),
-                        mPasswordMinUpperCase);
-            } else if (symbols < mPasswordMinSymbols) {
-                return String.format(getResources().getQuantityString(
-                        R.plurals.lockpassword_password_requires_symbols, mPasswordMinSymbols),
-                        mPasswordMinSymbols);
-            } else if (nonletter < mPasswordMinNonLetter) {
-                return String.format(getResources().getQuantityString(
-                        R.plurals.lockpassword_password_requires_nonletter, mPasswordMinNonLetter),
-                        mPasswordMinNonLetter);
-            }
-        } else {
-            final boolean alphabetic = DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC
-                    == mRequestedQuality;
-            final boolean alphanumeric = DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC
-                    == mRequestedQuality;
-            if ((alphabetic || alphanumeric) && letters == 0) {
-                return getString(R.string.lockpassword_password_requires_alpha);
-            }
-            if (alphanumeric && numbers == 0) {
-                return getString(R.string.lockpassword_password_requires_digit);
-            }
-        }
-        if(mLockPatternUtils.checkPasswordHistory(password)) {
-            return getString(mIsAlphaMode ? R.string.lockpassword_password_recently_used
-                    : R.string.lockpassword_pin_recently_used);
-        }
-        return null;
-    }
 
-    private void handleNext() {
-        final String pin = mPasswordEntry.getText().toString();
-        if (TextUtils.isEmpty(pin)) {
-            return;
+        protected void updateStage(Stage stage) {
+            mUiStage = stage;
+            updateUi();
         }
-        String errorMsg = null;
-        if (mUiStage == Stage.Introduction) {
-            errorMsg = validatePassword(pin);
-            if (errorMsg == null) {
-                mFirstPin = pin;
-                updateStage(Stage.NeedToConfirm);
-                mPasswordEntry.setText("");
-            }
-        } else if (mUiStage == Stage.NeedToConfirm) {
-            if (mFirstPin.equals(pin)) {
-                mLockPatternUtils.clearLock();
-                mLockPatternUtils.saveLockPassword(pin, mRequestedQuality);
-                finish();
-            } else {
-                updateStage(Stage.ConfirmWrong);
-                CharSequence tmp = mPasswordEntry.getText();
-                if (tmp != null) {
-                    Selection.setSelection((Spannable) tmp, 0, tmp.length());
-                }
-            }
-        }
-        if (errorMsg != null) {
-            showError(errorMsg, mUiStage);
-        }
-    }
 
-    public void onClick(View v) {
-        switch (v.getId()) {
-            case R.id.next_button:
-                handleNext();
-                break;
-
-            case R.id.cancel_button:
-                finish();
-                break;
-        }
-    }
-
-    private void showError(String msg, final Stage next) {
-        mHeaderText.setText(msg);
-        mHandler.postDelayed(new Runnable() {
-            public void run() {
-                updateStage(next);
-            }
-        }, ERROR_MESSAGE_TIMEOUT);
-    }
-
-    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
-        // Check if this was the result of hitting the enter key
-        if (actionId == EditorInfo.IME_NULL && event.getAction() == KeyEvent.ACTION_DOWN) {
-            handleNext();
-            return true;
-        }
-        return false;
-    }
-
-    /**
-     * Update the hint based on current Stage and length of password entry
-     */
-    private void updateUi() {
-        String password = mPasswordEntry.getText().toString();
-        final int length = password.length();
-        if (mUiStage == Stage.Introduction && length > 0) {
-            if (length < mPasswordMinLength) {
-                String msg = getString(mIsAlphaMode ? R.string.lockpassword_password_too_short
+        /**
+         * Validates PIN and returns a message to display if PIN fails test.
+         * @param password the raw password the user typed in
+         * @return error message to show to user or null if password is OK
+         */
+        private String validatePassword(String password) {
+            if (password.length() < mPasswordMinLength) {
+                return getString(mIsAlphaMode ?
+                        R.string.lockpassword_password_too_short
                         : R.string.lockpassword_pin_too_short, mPasswordMinLength);
-                mHeaderText.setText(msg);
-                mNextButton.setEnabled(false);
+            }
+            if (password.length() > mPasswordMaxLength) {
+                return getString(mIsAlphaMode ?
+                        R.string.lockpassword_password_too_long
+                        : R.string.lockpassword_pin_too_long, mPasswordMaxLength);
+            }
+            int letters = 0;
+            int numbers = 0;
+            int lowercase = 0;
+            int symbols = 0;
+            int uppercase = 0;
+            int nonletter = 0;
+            for (int i = 0; i < password.length(); i++) {
+                char c = password.charAt(i);
+                // allow non white space Latin-1 characters only
+                if (c <= 32 || c > 127) {
+                    return getString(R.string.lockpassword_illegal_character);
+                }
+                if (c >= '0' && c <= '9') {
+                    numbers++;
+                    nonletter++;
+                } else if (c >= 'A' && c <= 'Z') {
+                    letters++;
+                    uppercase++;
+                } else if (c >= 'a' && c <= 'z') {
+                    letters++;
+                    lowercase++;
+                } else {
+                    symbols++;
+                    nonletter++;
+                }
+            }
+            if (DevicePolicyManager.PASSWORD_QUALITY_NUMERIC == mRequestedQuality
+                    && (letters > 0 || symbols > 0)) {
+                // This shouldn't be possible unless user finds some way to bring up
+                // soft keyboard
+                return getString(R.string.lockpassword_pin_contains_non_digits);
+            } else if (DevicePolicyManager.PASSWORD_QUALITY_COMPLEX == mRequestedQuality) {
+                if (letters < mPasswordMinLetters) {
+                    return String.format(getResources().getQuantityString(
+                            R.plurals.lockpassword_password_requires_letters, mPasswordMinLetters),
+                            mPasswordMinLetters);
+                } else if (numbers < mPasswordMinNumeric) {
+                    return String.format(getResources().getQuantityString(
+                            R.plurals.lockpassword_password_requires_numeric, mPasswordMinNumeric),
+                            mPasswordMinNumeric);
+                } else if (lowercase < mPasswordMinLowerCase) {
+                    return String.format(getResources().getQuantityString(
+                            R.plurals.lockpassword_password_requires_lowercase, mPasswordMinLowerCase),
+                            mPasswordMinLowerCase);
+                } else if (uppercase < mPasswordMinUpperCase) {
+                    return String.format(getResources().getQuantityString(
+                            R.plurals.lockpassword_password_requires_uppercase, mPasswordMinUpperCase),
+                            mPasswordMinUpperCase);
+                } else if (symbols < mPasswordMinSymbols) {
+                    return String.format(getResources().getQuantityString(
+                            R.plurals.lockpassword_password_requires_symbols, mPasswordMinSymbols),
+                            mPasswordMinSymbols);
+                } else if (nonletter < mPasswordMinNonLetter) {
+                    return String.format(getResources().getQuantityString(
+                            R.plurals.lockpassword_password_requires_nonletter, mPasswordMinNonLetter),
+                            mPasswordMinNonLetter);
+                }
             } else {
-                String error = validatePassword(password);
-                if (error != null) {
-                    mHeaderText.setText(error);
+                final boolean alphabetic = DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC
+                        == mRequestedQuality;
+                final boolean alphanumeric = DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC
+                        == mRequestedQuality;
+                if ((alphabetic || alphanumeric) && letters == 0) {
+                    return getString(R.string.lockpassword_password_requires_alpha);
+                }
+                if (alphanumeric && numbers == 0) {
+                    return getString(R.string.lockpassword_password_requires_digit);
+                }
+            }
+            if(mLockPatternUtils.checkPasswordHistory(password)) {
+                return getString(mIsAlphaMode ? R.string.lockpassword_password_recently_used
+                        : R.string.lockpassword_pin_recently_used);
+            }
+            return null;
+        }
+
+        private void handleNext() {
+            final String pin = mPasswordEntry.getText().toString();
+            if (TextUtils.isEmpty(pin)) {
+                return;
+            }
+            String errorMsg = null;
+            if (mUiStage == Stage.Introduction) {
+                errorMsg = validatePassword(pin);
+                if (errorMsg == null) {
+                    mFirstPin = pin;
+                    updateStage(Stage.NeedToConfirm);
+                    mPasswordEntry.setText("");
+                }
+            } else if (mUiStage == Stage.NeedToConfirm) {
+                if (mFirstPin.equals(pin)) {
+                    mLockPatternUtils.clearLock();
+                    mLockPatternUtils.saveLockPassword(pin, mRequestedQuality);
+                    getActivity().finish();
+                } else {
+                    updateStage(Stage.ConfirmWrong);
+                    CharSequence tmp = mPasswordEntry.getText();
+                    if (tmp != null) {
+                        Selection.setSelection((Spannable) tmp, 0, tmp.length());
+                    }
+                }
+            }
+            if (errorMsg != null) {
+                showError(errorMsg, mUiStage);
+            }
+        }
+
+        public void onClick(View v) {
+            switch (v.getId()) {
+                case R.id.next_button:
+                    handleNext();
+                    break;
+
+                case R.id.cancel_button:
+                    getActivity().finish();
+                    break;
+            }
+        }
+
+        private void showError(String msg, final Stage next) {
+            mHeaderText.setText(msg);
+            mHandler.postDelayed(new Runnable() {
+                public void run() {
+                    updateStage(next);
+                }
+            }, ERROR_MESSAGE_TIMEOUT);
+        }
+
+        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
+            // Check if this was the result of hitting the enter key
+            if (actionId == EditorInfo.IME_NULL && event.getAction() == KeyEvent.ACTION_DOWN) {
+                handleNext();
+                return true;
+            }
+            return false;
+        }
+
+        /**
+         * Update the hint based on current Stage and length of password entry
+         */
+        private void updateUi() {
+            String password = mPasswordEntry.getText().toString();
+            final int length = password.length();
+            if (mUiStage == Stage.Introduction && length > 0) {
+                if (length < mPasswordMinLength) {
+                    String msg = getString(mIsAlphaMode ? R.string.lockpassword_password_too_short
+                            : R.string.lockpassword_pin_too_short, mPasswordMinLength);
+                    mHeaderText.setText(msg);
                     mNextButton.setEnabled(false);
                 } else {
-                    mHeaderText.setText(R.string.lockpassword_press_continue);
-                    mNextButton.setEnabled(true);
+                    String error = validatePassword(password);
+                    if (error != null) {
+                        mHeaderText.setText(error);
+                        mNextButton.setEnabled(false);
+                    } else {
+                        mHeaderText.setText(R.string.lockpassword_press_continue);
+                        mNextButton.setEnabled(true);
+                    }
                 }
+            } else {
+                mHeaderText.setText(mIsAlphaMode ? mUiStage.alphaHint : mUiStage.numericHint);
+                mNextButton.setEnabled(length > 0);
             }
-        } else {
-            mHeaderText.setText(mIsAlphaMode ? mUiStage.alphaHint : mUiStage.numericHint);
-            mNextButton.setEnabled(length > 0);
+            mNextButton.setText(mUiStage.buttonText);
         }
-        mNextButton.setText(mUiStage.buttonText);
-    }
 
-    public void afterTextChanged(Editable s) {
-        // Changing the text while error displayed resets to NeedToConfirm state
-        if (mUiStage == Stage.ConfirmWrong) {
-            mUiStage = Stage.NeedToConfirm;
+        public void afterTextChanged(Editable s) {
+            // Changing the text while error displayed resets to NeedToConfirm state
+            if (mUiStage == Stage.ConfirmWrong) {
+                mUiStage = Stage.NeedToConfirm;
+            }
+            updateUi();
         }
-        updateUi();
-    }
 
-    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
 
-    }
+        }
 
-    public void onTextChanged(CharSequence s, int start, int before, int count) {
+        public void onTextChanged(CharSequence s, int start, int before, int count) {
 
+        }
     }
 }
diff --git a/src/com/android/settings/ChooseLockPattern.java b/src/com/android/settings/ChooseLockPattern.java
index b5c0e80..70c625a 100644
--- a/src/com/android/settings/ChooseLockPattern.java
+++ b/src/com/android/settings/ChooseLockPattern.java
@@ -22,14 +22,18 @@
 import com.android.internal.widget.LockPatternUtils;
 import com.android.internal.widget.LockPatternView;
 import com.android.internal.widget.LockPatternView.Cell;
+
 import static com.android.internal.widget.LockPatternView.DisplayMode;
 
 import android.app.Activity;
+import android.app.Fragment;
 import android.content.Intent;
 import android.os.Bundle;
+import android.preference.PreferenceActivity;
 import android.view.KeyEvent;
+import android.view.LayoutInflater;
 import android.view.View;
-import android.view.Window;
+import android.view.ViewGroup;
 import android.widget.TextView;
 
 import java.util.ArrayList;
@@ -44,7 +48,7 @@
  * - asks for confirmation / restart
  * - saves chosen password when confirmed
  */
-public class ChooseLockPattern extends Activity implements View.OnClickListener{
+public class ChooseLockPattern extends PreferenceActivity {
     /**
      * Used by the choose lock pattern wizard to indicate the wizard is
      * finished, and each activity in the wizard should finish.
@@ -56,440 +60,461 @@
      */
     static final int RESULT_FINISHED = RESULT_FIRST_USER;
 
-    public static final int CONFIRM_EXISTING_REQUEST = 55;
-
-    // how long after a confirmation message is shown before moving on
-    static final int INFORMATION_MSG_TIMEOUT_MS = 3000;
-
-    // how long we wait to clear a wrong pattern
-    private static final int WRONG_PATTERN_CLEAR_TIMEOUT_MS = 2000;
-
-    private static final int ID_EMPTY_MESSAGE = -1;
-
-    protected TextView mHeaderText;
-    protected LockPatternView mLockPatternView;
-    protected TextView mFooterText;
-    private TextView mFooterLeftButton;
-    private TextView mFooterRightButton;
-    protected List<LockPatternView.Cell> mChosenPattern = null;
-
-    /**
-     * The patten used during the help screen to show how to draw a pattern.
-     */
-    private final List<LockPatternView.Cell> mAnimatePattern =
-            Collections.unmodifiableList(Lists.newArrayList(
-                    LockPatternView.Cell.of(0, 0),
-                    LockPatternView.Cell.of(0, 1),
-                    LockPatternView.Cell.of(1, 1),
-                    LockPatternView.Cell.of(2, 1)
-            ));
+    @Override
+    public Intent getIntent() {
+        Intent modIntent = new Intent(super.getIntent());
+        modIntent.putExtra(EXTRA_SHOW_FRAGMENT, ChooseLockPatternFragment.class.getName());
+        modIntent.putExtra(EXTRA_NO_HEADERS, true);
+        return modIntent;
+    }
 
     @Override
-    protected void onActivityResult(int requestCode, int resultCode,
-            Intent data) {
-        super.onActivityResult(requestCode, resultCode, data);
-        switch (requestCode) {
-            case CONFIRM_EXISTING_REQUEST:
-                if (resultCode != Activity.RESULT_OK) {
-                    setResult(RESULT_FINISHED);
-                    finish();
-                }
-                updateStage(Stage.Introduction);
-                break;
-        }
-    }
-
-    /**
-     * The pattern listener that responds according to a user choosing a new
-     * lock pattern.
-     */
-    protected LockPatternView.OnPatternListener mChooseNewLockPatternListener = new LockPatternView.OnPatternListener() {
-
-            public void onPatternStart() {
-                mLockPatternView.removeCallbacks(mClearPatternRunnable);
-                patternInProgress();
-            }
-
-            public void onPatternCleared() {
-                mLockPatternView.removeCallbacks(mClearPatternRunnable);
-            }
-
-            public void onPatternDetected(List<LockPatternView.Cell> pattern) {
-                if (mUiStage == Stage.NeedToConfirm || mUiStage == Stage.ConfirmWrong) {
-                    if (mChosenPattern == null) throw new IllegalStateException("null chosen pattern in stage 'need to confirm");
-                    if (mChosenPattern.equals(pattern)) {
-                        updateStage(Stage.ChoiceConfirmed);
-                    } else {
-                        updateStage(Stage.ConfirmWrong);
-                    }
-                } else if (mUiStage == Stage.Introduction || mUiStage == Stage.ChoiceTooShort){
-                    if (pattern.size() < LockPatternUtils.MIN_LOCK_PATTERN_SIZE) {
-                        updateStage(Stage.ChoiceTooShort);
-                    } else {
-                        mChosenPattern = new ArrayList<LockPatternView.Cell>(pattern);
-                        updateStage(Stage.FirstChoiceValid);
-                    }
-                } else {
-                    throw new IllegalStateException("Unexpected stage " + mUiStage + " when "
-                            + "entering the pattern.");
-                }
-            }
-
-            public void onPatternCellAdded(List<Cell> pattern) {
-
-            }
-
-            private void patternInProgress() {
-                mHeaderText.setText(R.string.lockpattern_recording_inprogress);
-                mFooterText.setText("");
-                mFooterLeftButton.setEnabled(false);
-                mFooterRightButton.setEnabled(false);
-            }
-     };
-
-
-    /**
-     * The states of the left footer button.
-     */
-    enum LeftButtonMode {
-        Cancel(R.string.cancel, true),
-        CancelDisabled(R.string.cancel, false),
-        Retry(R.string.lockpattern_retry_button_text, true),
-        RetryDisabled(R.string.lockpattern_retry_button_text, false),
-        Gone(ID_EMPTY_MESSAGE, false);
-
-
-        /**
-         * @param text The displayed text for this mode.
-         * @param enabled Whether the button should be enabled.
-         */
-        LeftButtonMode(int text, boolean enabled) {
-            this.text = text;
-            this.enabled = enabled;
-        }
-
-        final int text;
-        final boolean enabled;
-    }
-
-    /**
-     * The states of the right button.
-     */
-    enum RightButtonMode {
-        Continue(R.string.lockpattern_continue_button_text, true),
-        ContinueDisabled(R.string.lockpattern_continue_button_text, false),
-        Confirm(R.string.lockpattern_confirm_button_text, true),
-        ConfirmDisabled(R.string.lockpattern_confirm_button_text, false),
-        Ok(android.R.string.ok, true);
-
-        /**
-         * @param text The displayed text for this mode.
-         * @param enabled Whether the button should be enabled.
-         */
-        RightButtonMode(int text, boolean enabled) {
-            this.text = text;
-            this.enabled = enabled;
-        }
-
-        final int text;
-        final boolean enabled;
-    }
-
-    /**
-     * Keep track internally of where the user is in choosing a pattern.
-     */
-    protected enum Stage {
-
-        Introduction(
-                R.string.lockpattern_recording_intro_header,
-                LeftButtonMode.Cancel, RightButtonMode.ContinueDisabled,
-                R.string.lockpattern_recording_intro_footer, true),
-        HelpScreen(
-                R.string.lockpattern_settings_help_how_to_record,
-                LeftButtonMode.Gone, RightButtonMode.Ok, ID_EMPTY_MESSAGE, false),
-        ChoiceTooShort(
-                R.string.lockpattern_recording_incorrect_too_short,
-                LeftButtonMode.Retry, RightButtonMode.ContinueDisabled,
-                ID_EMPTY_MESSAGE, true),
-        FirstChoiceValid(
-                R.string.lockpattern_pattern_entered_header,
-                LeftButtonMode.Retry, RightButtonMode.Continue, ID_EMPTY_MESSAGE, false),
-        NeedToConfirm(
-                R.string.lockpattern_need_to_confirm,
-                LeftButtonMode.CancelDisabled, RightButtonMode.ConfirmDisabled,
-                ID_EMPTY_MESSAGE, true),
-        ConfirmWrong(
-                R.string.lockpattern_need_to_unlock_wrong,
-                LeftButtonMode.Cancel, RightButtonMode.ConfirmDisabled,
-                ID_EMPTY_MESSAGE, true),
-        ChoiceConfirmed(
-                R.string.lockpattern_pattern_confirmed_header,
-                LeftButtonMode.Cancel, RightButtonMode.Confirm, ID_EMPTY_MESSAGE, false);
-
-
-        /**
-         * @param headerMessage The message displayed at the top.
-         * @param leftMode The mode of the left button.
-         * @param rightMode The mode of the right button.
-         * @param footerMessage The footer message.
-         * @param patternEnabled Whether the pattern widget is enabled.
-         */
-        Stage(int headerMessage,
-                LeftButtonMode leftMode,
-                RightButtonMode rightMode,
-                int footerMessage, boolean patternEnabled) {
-            this.headerMessage = headerMessage;
-            this.leftMode = leftMode;
-            this.rightMode = rightMode;
-            this.footerMessage = footerMessage;
-            this.patternEnabled = patternEnabled;
-        }
-
-        final int headerMessage;
-        final LeftButtonMode leftMode;
-        final RightButtonMode rightMode;
-        final int footerMessage;
-        final boolean patternEnabled;
-    }
-
-    private Stage mUiStage = Stage.Introduction;
-
-    private Runnable mClearPatternRunnable = new Runnable() {
-        public void run() {
-            mLockPatternView.clearPattern();
-        }
-    };
-
-    private ChooseLockSettingsHelper mChooseLockSettingsHelper;
-
-    private static final String KEY_UI_STAGE = "uiStage";
-    private static final String KEY_PATTERN_CHOICE = "chosenPattern";
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
+    public void onCreate(Bundle savedInstanceState) {
+        // requestWindowFeature(Window.FEATURE_NO_TITLE);
         super.onCreate(savedInstanceState);
-        mChooseLockSettingsHelper = new ChooseLockSettingsHelper(this);
-        requestWindowFeature(Window.FEATURE_NO_TITLE);
-
-        setupViews();
-
-        // make it so unhandled touch events within the unlock screen go to the
-        // lock pattern view.
-        final LinearLayoutWithDefaultTouchRecepient topLayout
-                = (LinearLayoutWithDefaultTouchRecepient) findViewById(
-                R.id.topLayout);
-        topLayout.setDefaultTouchRecepient(mLockPatternView);
-
-        final boolean confirmCredentials = getIntent().getBooleanExtra("confirm_credentials", true);
-
-        if (savedInstanceState == null) {
-            if (confirmCredentials) {
-                // first launch. As a security measure, we're in NeedToConfirm mode until we know
-                // there isn't an existing password or the user confirms their password.
-                updateStage(Stage.NeedToConfirm);
-                boolean launchedConfirmationActivity =
-                    mChooseLockSettingsHelper.launchConfirmationActivity(CONFIRM_EXISTING_REQUEST,
-                            null, null);
-                if (!launchedConfirmationActivity) {
-                    updateStage(Stage.Introduction);
-                }
-            } else {
-                updateStage(Stage.Introduction);
-            }
-        } else {
-            // restore from previous state
-            final String patternString = savedInstanceState.getString(KEY_PATTERN_CHOICE);
-            if (patternString != null) {
-                mChosenPattern = LockPatternUtils.stringToPattern(patternString);
-            }
-            updateStage(Stage.values()[savedInstanceState.getInt(KEY_UI_STAGE)]);
-        }
-    }
-
-    /**
-     * Keep all "find view" related stuff confined to this function since in
-     * case someone needs to subclass and customize.
-     */
-    protected void setupViews() {
-        setContentView(R.layout.choose_lock_pattern);
-
-        mHeaderText = (TextView) findViewById(R.id.headerText);
-
-        mLockPatternView = (LockPatternView) findViewById(R.id.lockPattern);
-        mLockPatternView.setOnPatternListener(mChooseNewLockPatternListener);
-        mLockPatternView.setTactileFeedbackEnabled(
-                mChooseLockSettingsHelper.utils().isTactileFeedbackEnabled());
-
-        mFooterText = (TextView) findViewById(R.id.footerText);
-
-        mFooterLeftButton = (TextView) findViewById(R.id.footerLeftButton);
-        mFooterRightButton = (TextView) findViewById(R.id.footerRightButton);
-
-        mFooterLeftButton.setOnClickListener(this);
-        mFooterRightButton.setOnClickListener(this);
-    }
-
-    public void onClick(View v) {
-        if (v == mFooterLeftButton) {
-            if (mUiStage.leftMode == LeftButtonMode.Retry) {
-                mChosenPattern = null;
-                mLockPatternView.clearPattern();
-                updateStage(Stage.Introduction);
-            } else if (mUiStage.leftMode == LeftButtonMode.Cancel) {
-                // They are canceling the entire wizard
-                setResult(RESULT_FINISHED);
-                finish();
-            } else {
-                throw new IllegalStateException("left footer button pressed, but stage of " +
-                    mUiStage + " doesn't make sense");
-            }
-        } else if (v == mFooterRightButton) {
-
-            if (mUiStage.rightMode == RightButtonMode.Continue) {
-                if (mUiStage != Stage.FirstChoiceValid) {
-                    throw new IllegalStateException("expected ui stage " + Stage.FirstChoiceValid
-                            + " when button is " + RightButtonMode.Continue);
-                }
-                updateStage(Stage.NeedToConfirm);
-            } else if (mUiStage.rightMode == RightButtonMode.Confirm) {
-                if (mUiStage != Stage.ChoiceConfirmed) {
-                    throw new IllegalStateException("expected ui stage " + Stage.ChoiceConfirmed
-                            + " when button is " + RightButtonMode.Confirm);
-                }
-                saveChosenPatternAndFinish();
-            } else if (mUiStage.rightMode == RightButtonMode.Ok) {
-                if (mUiStage != Stage.HelpScreen) {
-                    throw new IllegalStateException("Help screen is only mode with ok button, but " +
-                            "stage is " + mUiStage);
-                }
-                mLockPatternView.clearPattern();
-                mLockPatternView.setDisplayMode(DisplayMode.Correct);
-                updateStage(Stage.Introduction);
-            }
-        }
     }
 
     @Override
     public boolean onKeyDown(int keyCode, KeyEvent event) {
-        if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
-            if (mUiStage == Stage.HelpScreen) {
-                updateStage(Stage.Introduction);
-                return true;
-            }
-        }
-        if (keyCode == KeyEvent.KEYCODE_MENU && mUiStage == Stage.Introduction) {
-            updateStage(Stage.HelpScreen);
-            return true;
-        }
-
+        // *** TODO ***
+        // chooseLockPatternFragment.onKeyDown(keyCode, event);
         return super.onKeyDown(keyCode, event);
     }
 
-    @Override
-    protected void onSaveInstanceState(Bundle outState) {
-        super.onSaveInstanceState(outState);
+    public static class ChooseLockPatternFragment extends Fragment
+            implements View.OnClickListener {
 
-        outState.putInt(KEY_UI_STAGE, mUiStage.ordinal());
-        if (mChosenPattern != null) {
-            outState.putString(KEY_PATTERN_CHOICE, LockPatternUtils.patternToString(mChosenPattern));
-        }
-    }
+        public static final int CONFIRM_EXISTING_REQUEST = 55;
 
+        // how long after a confirmation message is shown before moving on
+        static final int INFORMATION_MSG_TIMEOUT_MS = 3000;
 
-    /**
-     * Updates the messages and buttons appropriate to what stage the user
-     * is at in choosing a view.  This doesn't handle clearing out the pattern;
-     * the pattern is expected to be in the right state.
-     * @param stage
-     */
-    protected void updateStage(Stage stage) {
+        // how long we wait to clear a wrong pattern
+        private static final int WRONG_PATTERN_CLEAR_TIMEOUT_MS = 2000;
 
-        mUiStage = stage;
+        private static final int ID_EMPTY_MESSAGE = -1;
 
-        // header text, footer text, visibility and
-        // enabled state all known from the stage
-        if (stage == Stage.ChoiceTooShort) {
-            mHeaderText.setText(
-                    getResources().getString(
-                            stage.headerMessage,
-                            LockPatternUtils.MIN_LOCK_PATTERN_SIZE));
-        } else {
-            mHeaderText.setText(stage.headerMessage);
-        }
-        if (stage.footerMessage == ID_EMPTY_MESSAGE) {
-            mFooterText.setText("");
-        } else {
-            mFooterText.setText(stage.footerMessage);
+        protected TextView mHeaderText;
+        protected LockPatternView mLockPatternView;
+        protected TextView mFooterText;
+        private TextView mFooterLeftButton;
+        private TextView mFooterRightButton;
+        protected List<LockPatternView.Cell> mChosenPattern = null;
+
+        /**
+         * The patten used during the help screen to show how to draw a pattern.
+         */
+        private final List<LockPatternView.Cell> mAnimatePattern =
+                Collections.unmodifiableList(Lists.newArrayList(
+                        LockPatternView.Cell.of(0, 0),
+                        LockPatternView.Cell.of(0, 1),
+                        LockPatternView.Cell.of(1, 1),
+                        LockPatternView.Cell.of(2, 1)
+                ));
+
+        @Override
+        public void onActivityResult(int requestCode, int resultCode,
+                Intent data) {
+            super.onActivityResult(requestCode, resultCode, data);
+            switch (requestCode) {
+                case CONFIRM_EXISTING_REQUEST:
+                    if (resultCode != Activity.RESULT_OK) {
+                        getActivity().setResult(RESULT_FINISHED);
+                        getActivity().finish();
+                    }
+                    updateStage(Stage.Introduction);
+                    break;
+            }
         }
 
-        if (stage.leftMode == LeftButtonMode.Gone) {
-            mFooterLeftButton.setVisibility(View.GONE);
-        } else {
-            mFooterLeftButton.setVisibility(View.VISIBLE);
-            mFooterLeftButton.setText(stage.leftMode.text);
-            mFooterLeftButton.setEnabled(stage.leftMode.enabled);
+        /**
+         * The pattern listener that responds according to a user choosing a new
+         * lock pattern.
+         */
+        protected LockPatternView.OnPatternListener mChooseNewLockPatternListener =
+                new LockPatternView.OnPatternListener() {
+
+                public void onPatternStart() {
+                    mLockPatternView.removeCallbacks(mClearPatternRunnable);
+                    patternInProgress();
+                }
+
+                public void onPatternCleared() {
+                    mLockPatternView.removeCallbacks(mClearPatternRunnable);
+                }
+
+                public void onPatternDetected(List<LockPatternView.Cell> pattern) {
+                    if (mUiStage == Stage.NeedToConfirm || mUiStage == Stage.ConfirmWrong) {
+                        if (mChosenPattern == null) throw new IllegalStateException(
+                                "null chosen pattern in stage 'need to confirm");
+                        if (mChosenPattern.equals(pattern)) {
+                            updateStage(Stage.ChoiceConfirmed);
+                        } else {
+                            updateStage(Stage.ConfirmWrong);
+                        }
+                    } else if (mUiStage == Stage.Introduction || mUiStage == Stage.ChoiceTooShort){
+                        if (pattern.size() < LockPatternUtils.MIN_LOCK_PATTERN_SIZE) {
+                            updateStage(Stage.ChoiceTooShort);
+                        } else {
+                            mChosenPattern = new ArrayList<LockPatternView.Cell>(pattern);
+                            updateStage(Stage.FirstChoiceValid);
+                        }
+                    } else {
+                        throw new IllegalStateException("Unexpected stage " + mUiStage + " when "
+                                + "entering the pattern.");
+                    }
+                }
+
+                public void onPatternCellAdded(List<Cell> pattern) {
+
+                }
+
+                private void patternInProgress() {
+                    mHeaderText.setText(R.string.lockpattern_recording_inprogress);
+                    mFooterText.setText("");
+                    mFooterLeftButton.setEnabled(false);
+                    mFooterRightButton.setEnabled(false);
+                }
+         };
+
+
+        /**
+         * The states of the left footer button.
+         */
+        enum LeftButtonMode {
+            Cancel(R.string.cancel, true),
+            CancelDisabled(R.string.cancel, false),
+            Retry(R.string.lockpattern_retry_button_text, true),
+            RetryDisabled(R.string.lockpattern_retry_button_text, false),
+            Gone(ID_EMPTY_MESSAGE, false);
+
+
+            /**
+             * @param text The displayed text for this mode.
+             * @param enabled Whether the button should be enabled.
+             */
+            LeftButtonMode(int text, boolean enabled) {
+                this.text = text;
+                this.enabled = enabled;
+            }
+
+            final int text;
+            final boolean enabled;
         }
 
-        mFooterRightButton.setText(stage.rightMode.text);
-        mFooterRightButton.setEnabled(stage.rightMode.enabled);
+        /**
+         * The states of the right button.
+         */
+        enum RightButtonMode {
+            Continue(R.string.lockpattern_continue_button_text, true),
+            ContinueDisabled(R.string.lockpattern_continue_button_text, false),
+            Confirm(R.string.lockpattern_confirm_button_text, true),
+            ConfirmDisabled(R.string.lockpattern_confirm_button_text, false),
+            Ok(android.R.string.ok, true);
 
-        // same for whether the patten is enabled
-        if (stage.patternEnabled) {
-            mLockPatternView.enableInput();
-        } else {
-            mLockPatternView.disableInput();
+            /**
+             * @param text The displayed text for this mode.
+             * @param enabled Whether the button should be enabled.
+             */
+            RightButtonMode(int text, boolean enabled) {
+                this.text = text;
+                this.enabled = enabled;
+            }
+
+            final int text;
+            final boolean enabled;
         }
 
-        // the rest of the stuff varies enough that it is easier just to handle
-        // on a case by case basis.
-        mLockPatternView.setDisplayMode(DisplayMode.Correct);
+        /**
+         * Keep track internally of where the user is in choosing a pattern.
+         */
+        protected enum Stage {
 
-        switch (mUiStage) {
-            case Introduction:
+            Introduction(
+                    R.string.lockpattern_recording_intro_header,
+                    LeftButtonMode.Cancel, RightButtonMode.ContinueDisabled,
+                    R.string.lockpattern_recording_intro_footer, true),
+            HelpScreen(
+                    R.string.lockpattern_settings_help_how_to_record,
+                    LeftButtonMode.Gone, RightButtonMode.Ok, ID_EMPTY_MESSAGE, false),
+            ChoiceTooShort(
+                    R.string.lockpattern_recording_incorrect_too_short,
+                    LeftButtonMode.Retry, RightButtonMode.ContinueDisabled,
+                    ID_EMPTY_MESSAGE, true),
+            FirstChoiceValid(
+                    R.string.lockpattern_pattern_entered_header,
+                    LeftButtonMode.Retry, RightButtonMode.Continue, ID_EMPTY_MESSAGE, false),
+            NeedToConfirm(
+                    R.string.lockpattern_need_to_confirm,
+                    LeftButtonMode.CancelDisabled, RightButtonMode.ConfirmDisabled,
+                    ID_EMPTY_MESSAGE, true),
+            ConfirmWrong(
+                    R.string.lockpattern_need_to_unlock_wrong,
+                    LeftButtonMode.Cancel, RightButtonMode.ConfirmDisabled,
+                    ID_EMPTY_MESSAGE, true),
+            ChoiceConfirmed(
+                    R.string.lockpattern_pattern_confirmed_header,
+                    LeftButtonMode.Cancel, RightButtonMode.Confirm, ID_EMPTY_MESSAGE, false);
+
+
+            /**
+             * @param headerMessage The message displayed at the top.
+             * @param leftMode The mode of the left button.
+             * @param rightMode The mode of the right button.
+             * @param footerMessage The footer message.
+             * @param patternEnabled Whether the pattern widget is enabled.
+             */
+            Stage(int headerMessage,
+                    LeftButtonMode leftMode,
+                    RightButtonMode rightMode,
+                    int footerMessage, boolean patternEnabled) {
+                this.headerMessage = headerMessage;
+                this.leftMode = leftMode;
+                this.rightMode = rightMode;
+                this.footerMessage = footerMessage;
+                this.patternEnabled = patternEnabled;
+            }
+
+            final int headerMessage;
+            final LeftButtonMode leftMode;
+            final RightButtonMode rightMode;
+            final int footerMessage;
+            final boolean patternEnabled;
+        }
+
+        private Stage mUiStage = Stage.Introduction;
+
+        private Runnable mClearPatternRunnable = new Runnable() {
+            public void run() {
                 mLockPatternView.clearPattern();
-                break;
-            case HelpScreen:
-                mLockPatternView.setPattern(DisplayMode.Animate, mAnimatePattern);
-                break;
-            case ChoiceTooShort:
-                mLockPatternView.setDisplayMode(DisplayMode.Wrong);
-                postClearPatternRunnable();
-                break;
-            case FirstChoiceValid:
-                break;
-            case NeedToConfirm:
-                mLockPatternView.clearPattern();
-                break;
-            case ConfirmWrong:
-                mLockPatternView.setDisplayMode(DisplayMode.Wrong);
-                postClearPatternRunnable();
-                break;
-            case ChoiceConfirmed:
-                break;
-        }
-    }
+            }
+        };
 
+        private ChooseLockSettingsHelper mChooseLockSettingsHelper;
 
-    // clear the wrong pattern unless they have started a new one
-    // already
-    private void postClearPatternRunnable() {
-        mLockPatternView.removeCallbacks(mClearPatternRunnable);
-        mLockPatternView.postDelayed(mClearPatternRunnable, WRONG_PATTERN_CLEAR_TIMEOUT_MS);
-    }
+        private static final String KEY_UI_STAGE = "uiStage";
+        private static final String KEY_PATTERN_CHOICE = "chosenPattern";
 
-    private void saveChosenPatternAndFinish() {
-        LockPatternUtils utils = mChooseLockSettingsHelper.utils();
-        final boolean lockVirgin = !utils.isPatternEverChosen();
-
-        utils.saveLockPattern(mChosenPattern);
-        utils.setLockPatternEnabled(true);
-
-        if (lockVirgin) {
-            utils.setVisiblePatternEnabled(true);
-            utils.setTactileFeedbackEnabled(false);
+        @Override
+        public void onCreate(Bundle savedInstanceState) {
+            super.onCreate(savedInstanceState);
+            mChooseLockSettingsHelper = new ChooseLockSettingsHelper(getActivity());
         }
 
-        setResult(RESULT_FINISHED);
-        finish();
+        @Override
+        public View onCreateView(LayoutInflater inflater, ViewGroup container,
+                Bundle savedInstanceState) {
+
+            // setupViews()
+            View view = inflater.inflate(R.layout.choose_lock_pattern, null);
+            mHeaderText = (TextView) view.findViewById(R.id.headerText);
+            mLockPatternView = (LockPatternView) view.findViewById(R.id.lockPattern);
+            mLockPatternView.setOnPatternListener(mChooseNewLockPatternListener);
+            mLockPatternView.setTactileFeedbackEnabled(
+                    mChooseLockSettingsHelper.utils().isTactileFeedbackEnabled());
+
+            mFooterText = (TextView) view.findViewById(R.id.footerText);
+
+            mFooterLeftButton = (TextView) view.findViewById(R.id.footerLeftButton);
+            mFooterRightButton = (TextView) view.findViewById(R.id.footerRightButton);
+
+            mFooterLeftButton.setOnClickListener(this);
+            mFooterRightButton.setOnClickListener(this);
+
+            // make it so unhandled touch events within the unlock screen go to the
+            // lock pattern view.
+            final LinearLayoutWithDefaultTouchRecepient topLayout
+                    = (LinearLayoutWithDefaultTouchRecepient) view.findViewById(
+                    R.id.topLayout);
+            topLayout.setDefaultTouchRecepient(mLockPatternView);
+
+            final boolean confirmCredentials = getActivity().getIntent()
+                    .getBooleanExtra("confirm_credentials", true);
+
+            if (savedInstanceState == null) {
+                if (confirmCredentials) {
+                    // first launch. As a security measure, we're in NeedToConfirm mode until we
+                    // know there isn't an existing password or the user confirms their password.
+                    updateStage(Stage.NeedToConfirm);
+                    boolean launchedConfirmationActivity =
+                        mChooseLockSettingsHelper.launchConfirmationActivity(
+                                CONFIRM_EXISTING_REQUEST, null, null);
+                    if (!launchedConfirmationActivity) {
+                        updateStage(Stage.Introduction);
+                    }
+                } else {
+                    updateStage(Stage.Introduction);
+                }
+            } else {
+                // restore from previous state
+                final String patternString = savedInstanceState.getString(KEY_PATTERN_CHOICE);
+                if (patternString != null) {
+                    mChosenPattern = LockPatternUtils.stringToPattern(patternString);
+                }
+                updateStage(Stage.values()[savedInstanceState.getInt(KEY_UI_STAGE)]);
+            }
+            return view;
+        }
+
+        public void onClick(View v) {
+            if (v == mFooterLeftButton) {
+                if (mUiStage.leftMode == LeftButtonMode.Retry) {
+                    mChosenPattern = null;
+                    mLockPatternView.clearPattern();
+                    updateStage(Stage.Introduction);
+                } else if (mUiStage.leftMode == LeftButtonMode.Cancel) {
+                    // They are canceling the entire wizard
+                    getActivity().setResult(RESULT_FINISHED);
+                    getActivity().finish();
+                } else {
+                    throw new IllegalStateException("left footer button pressed, but stage of " +
+                        mUiStage + " doesn't make sense");
+                }
+            } else if (v == mFooterRightButton) {
+
+                if (mUiStage.rightMode == RightButtonMode.Continue) {
+                    if (mUiStage != Stage.FirstChoiceValid) {
+                        throw new IllegalStateException("expected ui stage " + Stage.FirstChoiceValid
+                                + " when button is " + RightButtonMode.Continue);
+                    }
+                    updateStage(Stage.NeedToConfirm);
+                } else if (mUiStage.rightMode == RightButtonMode.Confirm) {
+                    if (mUiStage != Stage.ChoiceConfirmed) {
+                        throw new IllegalStateException("expected ui stage " + Stage.ChoiceConfirmed
+                                + " when button is " + RightButtonMode.Confirm);
+                    }
+                    saveChosenPatternAndFinish();
+                } else if (mUiStage.rightMode == RightButtonMode.Ok) {
+                    if (mUiStage != Stage.HelpScreen) {
+                        throw new IllegalStateException("Help screen is only mode with ok button, but " +
+                                "stage is " + mUiStage);
+                    }
+                    mLockPatternView.clearPattern();
+                    mLockPatternView.setDisplayMode(DisplayMode.Correct);
+                    updateStage(Stage.Introduction);
+                }
+            }
+        }
+
+        public boolean onKeyDown(int keyCode, KeyEvent event) {
+            if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
+                if (mUiStage == Stage.HelpScreen) {
+                    updateStage(Stage.Introduction);
+                    return true;
+                }
+            }
+            if (keyCode == KeyEvent.KEYCODE_MENU && mUiStage == Stage.Introduction) {
+                updateStage(Stage.HelpScreen);
+                return true;
+            }
+            return false;
+        }
+
+        public void onSaveInstanceState(Bundle outState) {
+            super.onSaveInstanceState(outState);
+
+            outState.putInt(KEY_UI_STAGE, mUiStage.ordinal());
+            if (mChosenPattern != null) {
+                outState.putString(KEY_PATTERN_CHOICE,
+                        LockPatternUtils.patternToString(mChosenPattern));
+            }
+        }
+
+        /**
+         * Updates the messages and buttons appropriate to what stage the user
+         * is at in choosing a view.  This doesn't handle clearing out the pattern;
+         * the pattern is expected to be in the right state.
+         * @param stage
+         */
+        protected void updateStage(Stage stage) {
+
+            mUiStage = stage;
+
+            // header text, footer text, visibility and
+            // enabled state all known from the stage
+            if (stage == Stage.ChoiceTooShort) {
+                mHeaderText.setText(
+                        getResources().getString(
+                                stage.headerMessage,
+                                LockPatternUtils.MIN_LOCK_PATTERN_SIZE));
+            } else {
+                mHeaderText.setText(stage.headerMessage);
+            }
+            if (stage.footerMessage == ID_EMPTY_MESSAGE) {
+                mFooterText.setText("");
+            } else {
+                mFooterText.setText(stage.footerMessage);
+            }
+
+            if (stage.leftMode == LeftButtonMode.Gone) {
+                mFooterLeftButton.setVisibility(View.GONE);
+            } else {
+                mFooterLeftButton.setVisibility(View.VISIBLE);
+                mFooterLeftButton.setText(stage.leftMode.text);
+                mFooterLeftButton.setEnabled(stage.leftMode.enabled);
+            }
+
+            mFooterRightButton.setText(stage.rightMode.text);
+            mFooterRightButton.setEnabled(stage.rightMode.enabled);
+
+            // same for whether the patten is enabled
+            if (stage.patternEnabled) {
+                mLockPatternView.enableInput();
+            } else {
+                mLockPatternView.disableInput();
+            }
+
+            // the rest of the stuff varies enough that it is easier just to handle
+            // on a case by case basis.
+            mLockPatternView.setDisplayMode(DisplayMode.Correct);
+
+            switch (mUiStage) {
+                case Introduction:
+                    mLockPatternView.clearPattern();
+                    break;
+                case HelpScreen:
+                    mLockPatternView.setPattern(DisplayMode.Animate, mAnimatePattern);
+                    break;
+                case ChoiceTooShort:
+                    mLockPatternView.setDisplayMode(DisplayMode.Wrong);
+                    postClearPatternRunnable();
+                    break;
+                case FirstChoiceValid:
+                    break;
+                case NeedToConfirm:
+                    mLockPatternView.clearPattern();
+                    break;
+                case ConfirmWrong:
+                    mLockPatternView.setDisplayMode(DisplayMode.Wrong);
+                    postClearPatternRunnable();
+                    break;
+                case ChoiceConfirmed:
+                    break;
+            }
+        }
+
+
+        // clear the wrong pattern unless they have started a new one
+        // already
+        private void postClearPatternRunnable() {
+            mLockPatternView.removeCallbacks(mClearPatternRunnable);
+            mLockPatternView.postDelayed(mClearPatternRunnable, WRONG_PATTERN_CLEAR_TIMEOUT_MS);
+        }
+
+        private void saveChosenPatternAndFinish() {
+            LockPatternUtils utils = mChooseLockSettingsHelper.utils();
+            final boolean lockVirgin = !utils.isPatternEverChosen();
+
+            utils.saveLockPattern(mChosenPattern);
+            utils.setLockPatternEnabled(true);
+
+            if (lockVirgin) {
+                utils.setVisiblePatternEnabled(true);
+                utils.setTactileFeedbackEnabled(false);
+            }
+
+            getActivity().setResult(RESULT_FINISHED);
+            getActivity().finish();
+        }
     }
 }
diff --git a/src/com/android/settings/ChooseLockPatternExample.java b/src/com/android/settings/ChooseLockPatternExample.java
index 3c96d53..454c406 100644
--- a/src/com/android/settings/ChooseLockPatternExample.java
+++ b/src/com/android/settings/ChooseLockPatternExample.java
@@ -16,83 +16,100 @@
 
 package com.android.settings;
 
-import android.app.Activity;
+import android.app.Fragment;
 import android.content.Intent;
 import android.graphics.drawable.AnimationDrawable;
 import android.os.Bundle;
 import android.os.Handler;
+import android.preference.PreferenceActivity;
+import android.view.LayoutInflater;
 import android.view.View;
+import android.view.ViewGroup;
 import android.widget.ImageView;
 
-public class ChooseLockPatternExample extends Activity implements View.OnClickListener {
-    private static final long START_DELAY = 1000;
-    protected static final String TAG = "Settings";
-    private View mNextButton;
-    private View mSkipButton;
-    private View mImageView;
-    private AnimationDrawable mAnimation;
-    private Handler mHandler = new Handler();
-    private Runnable mRunnable = new Runnable() {
-        public void run() {
-            startAnimation(mAnimation);
+public class ChooseLockPatternExample extends PreferenceActivity {
+
+    // required constructor for fragments
+    public ChooseLockPatternExample() {
+
+    }
+
+    @Override
+    public Intent getIntent() {
+        Intent modIntent = new Intent(super.getIntent());
+        modIntent.putExtra(EXTRA_SHOW_FRAGMENT, ChooseLockPatternExampleFragment.class.getName());
+        modIntent.putExtra(EXTRA_NO_HEADERS, true);
+        return modIntent;
+    }
+
+    public static class ChooseLockPatternExampleFragment extends Fragment
+            implements View.OnClickListener {
+        private static final long START_DELAY = 1000;
+        protected static final String TAG = "Settings";
+        private View mNextButton;
+        private View mSkipButton;
+        private View mImageView;
+        private AnimationDrawable mAnimation;
+        private Handler mHandler = new Handler();
+        private Runnable mRunnable = new Runnable() {
+            public void run() {
+                startAnimation(mAnimation);
+            }
+        };
+
+        @Override
+        public View onCreateView(LayoutInflater inflater, ViewGroup container,
+                Bundle savedInstanceState) {
+            View view = inflater.inflate(R.layout.choose_lock_pattern_example, null);
+            mNextButton = view.findViewById(R.id.next_button);
+            mNextButton.setOnClickListener(this);
+
+            mSkipButton = view.findViewById(R.id.skip_button);
+            mSkipButton.setOnClickListener(this);
+
+            mImageView = (ImageView) view.findViewById(R.id.lock_anim);
+            mImageView.setBackgroundResource(R.drawable.lock_anim);
+            mImageView.setOnClickListener(this);
+            mAnimation = (AnimationDrawable) mImageView.getBackground();
+            return view;
         }
-    };
 
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.choose_lock_pattern_example);
-        initViews();
-    }
+        @Override
+        public void onResume() {
+            super.onResume();
+            mHandler.postDelayed(mRunnable, START_DELAY);
+        }
 
-    @Override
-    protected void onResume() {
-        super.onResume();
-        mHandler.postDelayed(mRunnable, START_DELAY);
-    }
-
-    @Override
-    protected void onPause() {
-        super.onPause();
-        stopAnimation(mAnimation);
-    }
-
-    public void onClick(View v) {
-        if (v == mSkipButton) {
-            // Canceling, so finish all
-            setResult(ChooseLockPattern.RESULT_FINISHED);
-            finish();
-        } else if (v == mNextButton) {
+        @Override
+        public void onPause() {
+            super.onPause();
             stopAnimation(mAnimation);
-            Intent intent = new Intent(this, ChooseLockPattern.class);
-            intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
-            intent.putExtra("confirm_credentials", false);
-            startActivity(intent);
-            finish();
         }
-    }
 
-    private void initViews() {
-        mNextButton = findViewById(R.id.next_button);
-        mNextButton.setOnClickListener(this);
-
-        mSkipButton = findViewById(R.id.skip_button);
-        mSkipButton.setOnClickListener(this);
-
-        mImageView = (ImageView) findViewById(R.id.lock_anim);
-        mImageView.setBackgroundResource(R.drawable.lock_anim);
-        mImageView.setOnClickListener(this);
-        mAnimation = (AnimationDrawable) mImageView.getBackground();
-    }
-
-    protected void startAnimation(final AnimationDrawable animation) {
-        if (animation != null && !animation.isRunning()) {
-            animation.run();
+        public void onClick(View v) {
+            if (v == mSkipButton) {
+                // Canceling, so finish all
+                getActivity().setResult(ChooseLockPattern.RESULT_FINISHED);
+                getActivity().finish();
+            } else if (v == mNextButton) {
+                stopAnimation(mAnimation);
+                Intent intent = new Intent(getActivity(), ChooseLockPattern.class);
+                intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
+                intent.putExtra("confirm_credentials", false);
+                startActivity(intent);
+                getActivity().finish();
+            }
         }
-    }
 
-    protected void stopAnimation(final AnimationDrawable animation) {
-        if (animation != null && animation.isRunning()) animation.stop();
+        protected void startAnimation(final AnimationDrawable animation) {
+            if (animation != null && !animation.isRunning()) {
+                animation.run();
+            }
+        }
+
+        protected void stopAnimation(final AnimationDrawable animation) {
+            if (animation != null && animation.isRunning()) animation.stop();
+        }
     }
 }
 
diff --git a/src/com/android/settings/ChooseLockPatternTutorial.java b/src/com/android/settings/ChooseLockPatternTutorial.java
index e699abf..da600c4 100644
--- a/src/com/android/settings/ChooseLockPatternTutorial.java
+++ b/src/com/android/settings/ChooseLockPatternTutorial.java
@@ -18,49 +18,70 @@
 
 import com.android.internal.widget.LockPatternUtils;
 
-import android.app.Activity;
+import android.app.Fragment;
 import android.content.Intent;
 import android.os.Bundle;
+import android.preference.PreferenceActivity;
+import android.view.LayoutInflater;
 import android.view.View;
+import android.view.ViewGroup;
 
-public class ChooseLockPatternTutorial extends Activity implements View.OnClickListener {
-    private View mNextButton;
-    private View mSkipButton;
+public class ChooseLockPatternTutorial extends PreferenceActivity {
+
+    // required constructor for fragments
+    public ChooseLockPatternTutorial() {
+
+    }
 
     @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        // Don't show the tutorial if the user has seen it before.
-        LockPatternUtils lockPatternUtils = new LockPatternUtils(this);
-        if (savedInstanceState == null && lockPatternUtils.isPatternEverChosen()) {
-            Intent intent = new Intent(this, ChooseLockPattern.class);
-            intent.setFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
-            intent.putExtra("confirm_credentials", false);
-            startActivity(intent);
-            finish();
-        } else {
-            initViews();
+    public Intent getIntent() {
+        Intent modIntent = new Intent(super.getIntent());
+        modIntent.putExtra(EXTRA_SHOW_FRAGMENT, ChooseLockPatternTutorialFragment.class.getName());
+        modIntent.putExtra(EXTRA_NO_HEADERS, true);
+        return modIntent;
+    }
+
+    public static class ChooseLockPatternTutorialFragment extends Fragment
+            implements View.OnClickListener {
+        private View mNextButton;
+        private View mSkipButton;
+
+        @Override
+        public void onCreate(Bundle savedInstanceState) {
+            super.onCreate(savedInstanceState);
+            // Don't show the tutorial if the user has seen it before.
+            LockPatternUtils lockPatternUtils = new LockPatternUtils(getActivity());
+            if (savedInstanceState == null && lockPatternUtils.isPatternEverChosen()) {
+                Intent intent = new Intent(getActivity(), ChooseLockPattern.class);
+                intent.setFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
+                intent.putExtra("confirm_credentials", false);
+                startActivity(intent);
+                getActivity().finish();
+            }
         }
-    }
 
-    private void initViews() {
-        setContentView(R.layout.choose_lock_pattern_tutorial);
-        mNextButton = findViewById(R.id.next_button);
-        mNextButton.setOnClickListener(this);
-        mSkipButton = findViewById(R.id.skip_button);
-        mSkipButton.setOnClickListener(this);
-    }
+        @Override
+        public View onCreateView(LayoutInflater inflater, ViewGroup container,
+                Bundle savedInstanceState) {
+            View view = inflater.inflate(R.layout.choose_lock_pattern_tutorial, null);
+            mNextButton = view.findViewById(R.id.next_button);
+            mNextButton.setOnClickListener(this);
+            mSkipButton = view.findViewById(R.id.skip_button);
+            mSkipButton.setOnClickListener(this);
+            return view;
+        }
 
-    public void onClick(View v) {
-        if (v == mSkipButton) {
-            // Canceling, so finish all
-            setResult(ChooseLockPattern.RESULT_FINISHED);
-            finish();
-        } else if (v == mNextButton) {
-            Intent intent = new Intent(this, ChooseLockPatternExample.class);
-            intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
-            startActivity(intent);
-            finish();
+        public void onClick(View v) {
+            if (v == mSkipButton) {
+                // Canceling, so finish all
+                getActivity().setResult(ChooseLockPattern.RESULT_FINISHED);
+                getActivity().finish();
+            } else if (v == mNextButton) {
+                Intent intent = new Intent(getActivity(), ChooseLockPatternExample.class);
+                intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
+                startActivity(intent);
+                getActivity().finish();
+            }
         }
     }
 }
diff --git a/src/com/android/settings/ConfirmLockPassword.java b/src/com/android/settings/ConfirmLockPassword.java
index 0e893fa..380e848 100644
--- a/src/com/android/settings/ConfirmLockPassword.java
+++ b/src/com/android/settings/ConfirmLockPassword.java
@@ -20,113 +20,140 @@
 import com.android.internal.widget.PasswordEntryKeyboardHelper;
 import com.android.internal.widget.PasswordEntryKeyboardView;
 
-import android.app.Activity;
+import android.app.Fragment;
 import android.app.admin.DevicePolicyManager;
+import android.content.Intent;
 import android.os.Bundle;
 import android.os.Handler;
-import android.text.Editable;
+import android.preference.PreferenceActivity;
 import android.view.KeyEvent;
+import android.view.LayoutInflater;
 import android.view.View;
-import android.view.WindowManager;
+import android.view.ViewGroup;
 import android.view.View.OnClickListener;
 import android.view.inputmethod.EditorInfo;
-import android.widget.Button;
 import android.widget.TextView;
 import android.widget.TextView.OnEditorActionListener;
 
-public class ConfirmLockPassword extends Activity implements OnClickListener,
-        OnEditorActionListener {
-    private static final long ERROR_MESSAGE_TIMEOUT = 3000;
-    private TextView mPasswordEntry;
-    private LockPatternUtils mLockPatternUtils;
-    private TextView mHeaderText;
-    private Handler mHandler = new Handler();
-    private PasswordEntryKeyboardHelper mKeyboardHelper;
-    private PasswordEntryKeyboardView mKeyboardView;
+public class ConfirmLockPassword extends PreferenceActivity {
 
     @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        mLockPatternUtils = new LockPatternUtils(this);
-        initViews();
+    public Intent getIntent() {
+        Intent modIntent = new Intent(super.getIntent());
+        modIntent.putExtra(EXTRA_SHOW_FRAGMENT, ConfirmLockPasswordFragment.class.getName());
+        modIntent.putExtra(EXTRA_NO_HEADERS, true);
+        return modIntent;
     }
 
-    private void initViews() {
-        final int storedQuality = mLockPatternUtils.getKeyguardStoredPasswordQuality();
-        setContentView(R.layout.confirm_lock_password);
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
         // Disable IME on our window since we provide our own keyboard
-        getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
-                WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
-
-        findViewById(R.id.cancel_button).setOnClickListener(this);
-        findViewById(R.id.next_button).setOnClickListener(this);
-        mPasswordEntry = (TextView) findViewById(R.id.password_entry);
-        mPasswordEntry.setOnEditorActionListener(this);
-        mKeyboardView = (PasswordEntryKeyboardView) findViewById(R.id.keyboard);
-        mHeaderText = (TextView) findViewById(R.id.headerText);
-        final boolean isAlpha = DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC == storedQuality
-                || DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC == storedQuality
-                || DevicePolicyManager.PASSWORD_QUALITY_COMPLEX == storedQuality;
-        mHeaderText.setText(isAlpha ? R.string.lockpassword_confirm_your_password_header
-                : R.string.lockpassword_confirm_your_pin_header);
-        mKeyboardHelper = new PasswordEntryKeyboardHelper(this, mKeyboardView, mPasswordEntry);
-        mKeyboardHelper.setKeyboardMode(isAlpha ? PasswordEntryKeyboardHelper.KEYBOARD_MODE_ALPHA
-                : PasswordEntryKeyboardHelper.KEYBOARD_MODE_NUMERIC);
-        mKeyboardView.requestFocus();
+        //getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
+                //WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
+        super.onCreate(savedInstanceState);
     }
 
-    @Override
-    protected void onPause() {
-        super.onPause();
-        mKeyboardView.requestFocus();
-    }
+    public static class ConfirmLockPasswordFragment extends Fragment implements OnClickListener,
+            OnEditorActionListener {
+        private static final long ERROR_MESSAGE_TIMEOUT = 3000;
+        private TextView mPasswordEntry;
+        private LockPatternUtils mLockPatternUtils;
+        private TextView mHeaderText;
+        private Handler mHandler = new Handler();
+        private PasswordEntryKeyboardHelper mKeyboardHelper;
+        private PasswordEntryKeyboardView mKeyboardView;
 
-    @Override
-    protected void onResume() {
-        // TODO Auto-generated method stub
-        super.onResume();
-        mKeyboardView.requestFocus();
-    }
 
-    private void handleNext() {
-        final String pin = mPasswordEntry.getText().toString();
-        if (mLockPatternUtils.checkPassword(pin)) {
-            setResult(RESULT_OK);
-            finish();
-        } else {
-            showError(R.string.lockpattern_need_to_unlock_wrong);
+        // required constructor for fragments
+        public ConfirmLockPasswordFragment() {
+
         }
-    }
 
-    public void onClick(View v) {
-        switch (v.getId()) {
-            case R.id.next_button:
-                handleNext();
-                break;
-
-            case R.id.cancel_button:
-                setResult(RESULT_CANCELED);
-                finish();
-                break;
+        @Override
+        public void onCreate(Bundle savedInstanceState) {
+            super.onCreate(savedInstanceState);
+            mLockPatternUtils = new LockPatternUtils(getActivity());
         }
-    }
 
-    private void showError(int msg) {
-        mHeaderText.setText(msg);
-        mPasswordEntry.setText(null);
-        mHandler.postDelayed(new Runnable() {
-            public void run() {
-                mHeaderText.setText(R.string.lockpassword_confirm_your_password_header);
+        @Override
+        public View onCreateView(LayoutInflater inflater, ViewGroup container,
+                Bundle savedInstanceState) {
+            final int storedQuality = mLockPatternUtils.getKeyguardStoredPasswordQuality();
+            View view = inflater.inflate(R.layout.confirm_lock_password, null);
+            // Disable IME on our window since we provide our own keyboard
+
+            view.findViewById(R.id.cancel_button).setOnClickListener(this);
+            view.findViewById(R.id.next_button).setOnClickListener(this);
+            mPasswordEntry = (TextView) view.findViewById(R.id.password_entry);
+            mPasswordEntry.setOnEditorActionListener(this);
+            mKeyboardView = (PasswordEntryKeyboardView) view.findViewById(R.id.keyboard);
+            mHeaderText = (TextView) view.findViewById(R.id.headerText);
+            final boolean isAlpha = DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC == storedQuality
+                    || DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC == storedQuality
+                    || DevicePolicyManager.PASSWORD_QUALITY_COMPLEX == storedQuality;
+            mHeaderText.setText(isAlpha ? R.string.lockpassword_confirm_your_password_header
+                    : R.string.lockpassword_confirm_your_pin_header);
+            mKeyboardHelper = new PasswordEntryKeyboardHelper(getActivity(),
+                        mKeyboardView, mPasswordEntry);
+            mKeyboardHelper.setKeyboardMode(isAlpha ? PasswordEntryKeyboardHelper.KEYBOARD_MODE_ALPHA
+                    : PasswordEntryKeyboardHelper.KEYBOARD_MODE_NUMERIC);
+            mKeyboardView.requestFocus();
+            return view;
+        }
+
+        @Override
+        public void onPause() {
+            super.onPause();
+            mKeyboardView.requestFocus();
+        }
+
+        @Override
+        public void onResume() {
+            // TODO Auto-generated method stub
+            super.onResume();
+            mKeyboardView.requestFocus();
+        }
+
+        private void handleNext() {
+            final String pin = mPasswordEntry.getText().toString();
+            if (mLockPatternUtils.checkPassword(pin)) {
+                getActivity().setResult(RESULT_OK);
+                getActivity().finish();
+            } else {
+                showError(R.string.lockpattern_need_to_unlock_wrong);
             }
-        }, ERROR_MESSAGE_TIMEOUT);
-    }
-
-    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
-        // Check if this was the result of hitting the enter key
-        if (actionId == EditorInfo.IME_NULL) {
-            handleNext();
-            return true;
         }
-        return false;
+
+        public void onClick(View v) {
+            switch (v.getId()) {
+                case R.id.next_button:
+                    handleNext();
+                    break;
+
+                case R.id.cancel_button:
+                    getActivity().setResult(RESULT_CANCELED);
+                    getActivity().finish();
+                    break;
+            }
+        }
+
+        private void showError(int msg) {
+            mHeaderText.setText(msg);
+            mPasswordEntry.setText(null);
+            mHandler.postDelayed(new Runnable() {
+                public void run() {
+                    mHeaderText.setText(R.string.lockpassword_confirm_your_password_header);
+                }
+            }, ERROR_MESSAGE_TIMEOUT);
+        }
+
+        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
+            // Check if this was the result of hitting the enter key
+            if (actionId == EditorInfo.IME_NULL) {
+                handleNext();
+                return true;
+            }
+            return false;
+        }
     }
 }
diff --git a/src/com/android/settings/ConfirmLockPattern.java b/src/com/android/settings/ConfirmLockPattern.java
index 8d44875..25e8370 100644
--- a/src/com/android/settings/ConfirmLockPattern.java
+++ b/src/com/android/settings/ConfirmLockPattern.java
@@ -22,12 +22,16 @@
 import com.android.internal.widget.LockPatternView.Cell;
 
 import android.app.Activity;
+import android.app.Fragment;
 import android.content.Intent;
 import android.os.CountDownTimer;
 import android.os.SystemClock;
 import android.os.Bundle;
+import android.preference.PreferenceActivity;
 import android.widget.TextView;
-import android.view.Window;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
 
 import java.util.List;
 
@@ -37,7 +41,7 @@
  * Sets an activity result of {@link Activity#RESULT_OK} when the user
  * successfully confirmed their pattern.
  */
-public class ConfirmLockPattern extends Activity {
+public class ConfirmLockPattern extends PreferenceActivity {
 
     /**
      * Names of {@link CharSequence} fields within the originating {@link Intent}
@@ -45,30 +49,11 @@
      * The view will use the system-defined resource strings for any labels that
      * the caller does not supply.
      */
-    public static final String HEADER_TEXT = "com.android.settings.ConfirmLockPattern.header";
-    public static final String FOOTER_TEXT = "com.android.settings.ConfirmLockPattern.footer";
-    public static final String HEADER_WRONG_TEXT = "com.android.settings.ConfirmLockPattern.header_wrong";
-    public static final String FOOTER_WRONG_TEXT = "com.android.settings.ConfirmLockPattern.footer_wrong";
-
-    // how long we wait to clear a wrong pattern
-    private static final int WRONG_PATTERN_CLEAR_TIMEOUT_MS = 2000;
-
-    private static final String KEY_NUM_WRONG_ATTEMPTS = "num_wrong_attempts";
-
-    private LockPatternView mLockPatternView;
-    private LockPatternUtils mLockPatternUtils;
-    private int mNumWrongConfirmAttempts;
-    private CountDownTimer mCountdownTimer;
-
-    private TextView mHeaderTextView;
-    private TextView mFooterTextView;
-
-    // caller-supplied text for various prompts
-    private CharSequence mHeaderText;
-    private CharSequence mFooterText;
-    private CharSequence mHeaderWrongText;
-    private CharSequence mFooterWrongText;
-
+    public static final String PACKAGE = "com.android.settings";
+    public static final String HEADER_TEXT = PACKAGE + ".ConfirmLockPattern.header";
+    public static final String FOOTER_TEXT = PACKAGE + ".ConfirmLockPattern.footer";
+    public static final String HEADER_WRONG_TEXT = PACKAGE + ".ConfirmLockPattern.header_wrong";
+    public static final String FOOTER_WRONG_TEXT = PACKAGE + ".ConfirmLockPattern.footer_wrong";
 
     private enum Stage {
         NeedToUnlock,
@@ -77,194 +62,232 @@
     }
 
     @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
+    public Intent getIntent() {
+        Intent modIntent = new Intent(super.getIntent());
+        modIntent.putExtra(EXTRA_SHOW_FRAGMENT, ConfirmLockPatternFragment.class.getName());
+        modIntent.putExtra(EXTRA_NO_HEADERS, true);
+        return modIntent;
+    }
 
-        mLockPatternUtils = new LockPatternUtils(this);
+    public static class ConfirmLockPatternFragment extends Fragment {
 
-        requestWindowFeature(Window.FEATURE_NO_TITLE);
-        setContentView(R.layout.confirm_lock_pattern);
+        // how long we wait to clear a wrong pattern
+        private static final int WRONG_PATTERN_CLEAR_TIMEOUT_MS = 2000;
 
-        mHeaderTextView = (TextView) findViewById(R.id.headerText);
-        mLockPatternView = (LockPatternView) findViewById(R.id.lockPattern);
-        mFooterTextView = (TextView) findViewById(R.id.footerText);
+        private static final String KEY_NUM_WRONG_ATTEMPTS = "num_wrong_attempts";
 
-        // make it so unhandled touch events within the unlock screen go to the
-        // lock pattern view.
-        final LinearLayoutWithDefaultTouchRecepient topLayout
-                = (LinearLayoutWithDefaultTouchRecepient) findViewById(
-                R.id.topLayout);
-        topLayout.setDefaultTouchRecepient(mLockPatternView);
+        private LockPatternView mLockPatternView;
+        private LockPatternUtils mLockPatternUtils;
+        private int mNumWrongConfirmAttempts;
+        private CountDownTimer mCountdownTimer;
 
-        Intent intent = getIntent();
-        if (intent != null) {
-            mHeaderText = intent.getCharSequenceExtra(HEADER_TEXT);
-            mFooterText = intent.getCharSequenceExtra(FOOTER_TEXT);
-            mHeaderWrongText = intent.getCharSequenceExtra(HEADER_WRONG_TEXT);
-            mFooterWrongText = intent.getCharSequenceExtra(FOOTER_WRONG_TEXT);
+        private TextView mHeaderTextView;
+        private TextView mFooterTextView;
+
+        // caller-supplied text for various prompts
+        private CharSequence mHeaderText;
+        private CharSequence mFooterText;
+        private CharSequence mHeaderWrongText;
+        private CharSequence mFooterWrongText;
+
+        // required constructor for fragments
+        public ConfirmLockPatternFragment() {
+
         }
 
-        mLockPatternView.setTactileFeedbackEnabled(mLockPatternUtils.isTactileFeedbackEnabled());
-        mLockPatternView.setOnPatternListener(mConfirmExistingLockPatternListener);
-        updateStage(Stage.NeedToUnlock);
+        @Override
+        public void onCreate(Bundle savedInstanceState) {
+            super.onCreate(savedInstanceState);
+            mLockPatternUtils = new LockPatternUtils(getActivity());
+        }
 
-        if (savedInstanceState != null) {
-            mNumWrongConfirmAttempts = savedInstanceState.getInt(KEY_NUM_WRONG_ATTEMPTS);
-        } else {
-            // on first launch, if no lock pattern is set, then finish with
-            // success (don't want user to get stuck confirming something that
-            // doesn't exist).
-            if (!mLockPatternUtils.savedPatternExists()) {
-                setResult(RESULT_OK);
-                finish();
+        @Override
+        public View onCreateView(LayoutInflater inflater, ViewGroup container,
+                Bundle savedInstanceState) {
+            View view = inflater.inflate(R.layout.confirm_lock_pattern, null);
+            mHeaderTextView = (TextView) view.findViewById(R.id.headerText);
+            mLockPatternView = (LockPatternView) view.findViewById(R.id.lockPattern);
+            mFooterTextView = (TextView) view.findViewById(R.id.footerText);
+
+            // make it so unhandled touch events within the unlock screen go to the
+            // lock pattern view.
+            final LinearLayoutWithDefaultTouchRecepient topLayout
+                    = (LinearLayoutWithDefaultTouchRecepient) view.findViewById(R.id.topLayout);
+            topLayout.setDefaultTouchRecepient(mLockPatternView);
+
+            Intent intent = getActivity().getIntent();
+            if (intent != null) {
+                mHeaderText = intent.getCharSequenceExtra(HEADER_TEXT);
+                mFooterText = intent.getCharSequenceExtra(FOOTER_TEXT);
+                mHeaderWrongText = intent.getCharSequenceExtra(HEADER_WRONG_TEXT);
+                mFooterWrongText = intent.getCharSequenceExtra(FOOTER_WRONG_TEXT);
             }
-        }
-    }
 
-    @Override
-    protected void onSaveInstanceState(Bundle outState) {
-        // deliberately not calling super since we are managing this in full
-        outState.putInt(KEY_NUM_WRONG_ATTEMPTS, mNumWrongConfirmAttempts);
-    }
-
-    @Override
-    protected void onPause() {
-        super.onPause();
-
-        if (mCountdownTimer != null) {
-            mCountdownTimer.cancel();
-        }
-    }
-
-    @Override
-    protected void onResume() {
-        super.onResume();
-
-        // if the user is currently locked out, enforce it.
-        long deadline = mLockPatternUtils.getLockoutAttemptDeadline();
-        if (deadline != 0) {
-            handleAttemptLockout(deadline);
-        } else if (!mLockPatternView.isEnabled()) {
-            // The deadline has passed, but the timer was cancelled...
-            // Need to clean up.
-            mNumWrongConfirmAttempts = 0;
+            mLockPatternView.setTactileFeedbackEnabled(mLockPatternUtils.isTactileFeedbackEnabled());
+            mLockPatternView.setOnPatternListener(mConfirmExistingLockPatternListener);
             updateStage(Stage.NeedToUnlock);
-        }
-    }
 
-    private void updateStage(Stage stage) {
-
-        switch (stage) {
-            case NeedToUnlock:
-                if (mHeaderText != null) {
-                    mHeaderTextView.setText(mHeaderText);
-                } else {
-                    mHeaderTextView.setText(R.string.lockpattern_need_to_unlock);
-                }
-                if (mFooterText != null) {
-                    mFooterTextView.setText(mFooterText);
-                } else {
-                    mFooterTextView.setText(R.string.lockpattern_need_to_unlock_footer);
-                }
-
-                mLockPatternView.setEnabled(true);
-                mLockPatternView.enableInput();
-                break;
-            case NeedToUnlockWrong:
-                if (mHeaderWrongText != null) {
-                    mHeaderTextView.setText(mHeaderWrongText);
-                } else {
-                    mHeaderTextView.setText(R.string.lockpattern_need_to_unlock_wrong);
-                }
-                if (mFooterWrongText != null) {
-                    mFooterTextView.setText(mFooterWrongText);
-                } else {
-                    mFooterTextView.setText(R.string.lockpattern_need_to_unlock_wrong_footer);
-                }
-
-                mLockPatternView.setDisplayMode(LockPatternView.DisplayMode.Wrong);
-                mLockPatternView.setEnabled(true);
-                mLockPatternView.enableInput();
-                break;
-            case LockedOut:
-                mLockPatternView.clearPattern();
-                // enabled = false means: disable input, and have the
-                // appearance of being disabled.
-                mLockPatternView.setEnabled(false); // appearance of being disabled
-                break;
-        }
-    }
-
-    private Runnable mClearPatternRunnable = new Runnable() {
-        public void run() {
-            mLockPatternView.clearPattern();
-        }
-    };
-
-    // clear the wrong pattern unless they have started a new one
-    // already
-    private void postClearPatternRunnable() {
-        mLockPatternView.removeCallbacks(mClearPatternRunnable);
-        mLockPatternView.postDelayed(mClearPatternRunnable, WRONG_PATTERN_CLEAR_TIMEOUT_MS);
-    }
-
-    /**
-     * The pattern listener that responds according to a user confirming
-     * an existing lock pattern.
-     */
-    private LockPatternView.OnPatternListener mConfirmExistingLockPatternListener = new LockPatternView.OnPatternListener()  {
-
-        public void onPatternStart() {
-            mLockPatternView.removeCallbacks(mClearPatternRunnable);
-        }
-
-        public void onPatternCleared() {
-            mLockPatternView.removeCallbacks(mClearPatternRunnable);
-        }
-
-        public void onPatternCellAdded(List<Cell> pattern) {
-
-        }
-
-        public void onPatternDetected(List<LockPatternView.Cell> pattern) {
-            if (mLockPatternUtils.checkPattern(pattern)) {
-                setResult(RESULT_OK);
-                finish();
+            if (savedInstanceState != null) {
+                mNumWrongConfirmAttempts = savedInstanceState.getInt(KEY_NUM_WRONG_ATTEMPTS);
             } else {
-                if (pattern.size() >= LockPatternUtils.MIN_PATTERN_REGISTER_FAIL &&
-                        ++mNumWrongConfirmAttempts >= LockPatternUtils.FAILED_ATTEMPTS_BEFORE_TIMEOUT) {
-                    long deadline = mLockPatternUtils.setLockoutAttemptDeadline();
-                    handleAttemptLockout(deadline);
-                } else {
-                    updateStage(Stage.NeedToUnlockWrong);
-                    postClearPatternRunnable();
+                // on first launch, if no lock pattern is set, then finish with
+                // success (don't want user to get stuck confirming something that
+                // doesn't exist).
+                if (!mLockPatternUtils.savedPatternExists()) {
+                    getActivity().setResult(Activity.RESULT_OK);
+                    getActivity().finish();
                 }
             }
+            return view;
         }
-    };
 
+        @Override
+        public void onSaveInstanceState(Bundle outState) {
+            // deliberately not calling super since we are managing this in full
+            outState.putInt(KEY_NUM_WRONG_ATTEMPTS, mNumWrongConfirmAttempts);
+        }
 
-    private void handleAttemptLockout(long elapsedRealtimeDeadline) {
-        updateStage(Stage.LockedOut);
-        long elapsedRealtime = SystemClock.elapsedRealtime();
-        mCountdownTimer = new CountDownTimer(
-                elapsedRealtimeDeadline - elapsedRealtime,
-                LockPatternUtils.FAILED_ATTEMPT_COUNTDOWN_INTERVAL_MS) {
+        @Override
+        public void onPause() {
+            super.onPause();
 
-            @Override
-            public void onTick(long millisUntilFinished) {
-                mHeaderTextView.setText(R.string.lockpattern_too_many_failed_confirmation_attempts_header);
-                final int secondsCountdown = (int) (millisUntilFinished / 1000);
-                mFooterTextView.setText(getString(
-                        R.string.lockpattern_too_many_failed_confirmation_attempts_footer,
-                        secondsCountdown));
+            if (mCountdownTimer != null) {
+                mCountdownTimer.cancel();
             }
+        }
 
-            @Override
-            public void onFinish() {
+        @Override
+        public void onResume() {
+            super.onResume();
+
+            // if the user is currently locked out, enforce it.
+            long deadline = mLockPatternUtils.getLockoutAttemptDeadline();
+            if (deadline != 0) {
+                handleAttemptLockout(deadline);
+            } else if (!mLockPatternView.isEnabled()) {
+                // The deadline has passed, but the timer was cancelled...
+                // Need to clean up.
                 mNumWrongConfirmAttempts = 0;
                 updateStage(Stage.NeedToUnlock);
             }
-        }.start();
+        }
+
+        private void updateStage(Stage stage) {
+
+            switch (stage) {
+                case NeedToUnlock:
+                    if (mHeaderText != null) {
+                        mHeaderTextView.setText(mHeaderText);
+                    } else {
+                        mHeaderTextView.setText(R.string.lockpattern_need_to_unlock);
+                    }
+                    if (mFooterText != null) {
+                        mFooterTextView.setText(mFooterText);
+                    } else {
+                        mFooterTextView.setText(R.string.lockpattern_need_to_unlock_footer);
+                    }
+
+                    mLockPatternView.setEnabled(true);
+                    mLockPatternView.enableInput();
+                    break;
+                case NeedToUnlockWrong:
+                    if (mHeaderWrongText != null) {
+                        mHeaderTextView.setText(mHeaderWrongText);
+                    } else {
+                        mHeaderTextView.setText(R.string.lockpattern_need_to_unlock_wrong);
+                    }
+                    if (mFooterWrongText != null) {
+                        mFooterTextView.setText(mFooterWrongText);
+                    } else {
+                        mFooterTextView.setText(R.string.lockpattern_need_to_unlock_wrong_footer);
+                    }
+
+                    mLockPatternView.setDisplayMode(LockPatternView.DisplayMode.Wrong);
+                    mLockPatternView.setEnabled(true);
+                    mLockPatternView.enableInput();
+                    break;
+                case LockedOut:
+                    mLockPatternView.clearPattern();
+                    // enabled = false means: disable input, and have the
+                    // appearance of being disabled.
+                    mLockPatternView.setEnabled(false); // appearance of being disabled
+                    break;
+            }
+        }
+
+        private Runnable mClearPatternRunnable = new Runnable() {
+            public void run() {
+                mLockPatternView.clearPattern();
+            }
+        };
+
+        // clear the wrong pattern unless they have started a new one
+        // already
+        private void postClearPatternRunnable() {
+            mLockPatternView.removeCallbacks(mClearPatternRunnable);
+            mLockPatternView.postDelayed(mClearPatternRunnable, WRONG_PATTERN_CLEAR_TIMEOUT_MS);
+        }
+
+        /**
+         * The pattern listener that responds according to a user confirming
+         * an existing lock pattern.
+         */
+        private LockPatternView.OnPatternListener mConfirmExistingLockPatternListener
+                = new LockPatternView.OnPatternListener()  {
+
+            public void onPatternStart() {
+                mLockPatternView.removeCallbacks(mClearPatternRunnable);
+            }
+
+            public void onPatternCleared() {
+                mLockPatternView.removeCallbacks(mClearPatternRunnable);
+            }
+
+            public void onPatternCellAdded(List<Cell> pattern) {
+
+            }
+
+            public void onPatternDetected(List<LockPatternView.Cell> pattern) {
+                if (mLockPatternUtils.checkPattern(pattern)) {
+                    getActivity().setResult(Activity.RESULT_OK);
+                    getActivity().finish();
+                } else {
+                    if (pattern.size() >= LockPatternUtils.MIN_PATTERN_REGISTER_FAIL &&
+                            ++mNumWrongConfirmAttempts
+                            >= LockPatternUtils.FAILED_ATTEMPTS_BEFORE_TIMEOUT) {
+                        long deadline = mLockPatternUtils.setLockoutAttemptDeadline();
+                        handleAttemptLockout(deadline);
+                    } else {
+                        updateStage(Stage.NeedToUnlockWrong);
+                        postClearPatternRunnable();
+                    }
+                }
+            }
+        };
+
+
+        private void handleAttemptLockout(long elapsedRealtimeDeadline) {
+            updateStage(Stage.LockedOut);
+            long elapsedRealtime = SystemClock.elapsedRealtime();
+            mCountdownTimer = new CountDownTimer(
+                    elapsedRealtimeDeadline - elapsedRealtime,
+                    LockPatternUtils.FAILED_ATTEMPT_COUNTDOWN_INTERVAL_MS) {
+
+                @Override
+                public void onTick(long millisUntilFinished) {
+                    mHeaderTextView.setText(R.string.lockpattern_too_many_failed_confirmation_attempts_header);
+                    final int secondsCountdown = (int) (millisUntilFinished / 1000);
+                    mFooterTextView.setText(getString(
+                            R.string.lockpattern_too_many_failed_confirmation_attempts_footer,
+                            secondsCountdown));
+                }
+
+                @Override
+                public void onFinish() {
+                    mNumWrongConfirmAttempts = 0;
+                    updateStage(Stage.NeedToUnlock);
+                }
+            }.start();
+        }
     }
 }
diff --git a/src/com/android/settings/DeviceAdminAdd.java b/src/com/android/settings/DeviceAdminAdd.java
index 005196e..93814af 100644
--- a/src/com/android/settings/DeviceAdminAdd.java
+++ b/src/com/android/settings/DeviceAdminAdd.java
@@ -81,6 +81,7 @@
     final ArrayList<View> mActivePolicies = new ArrayList<View>();
     
     boolean mAdding;
+    boolean mRefreshing;
     
     @Override
     protected void onCreate(Bundle icicle) {
@@ -91,7 +92,7 @@
         mDPM = (DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE);
 
         if ((getIntent().getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {
-            Log.w(TAG, "Can now start ADD_DEVICE_ADMIN as a new task");
+            Log.w(TAG, "Cannot start ADD_DEVICE_ADMIN as a new task");
             finish();
             return;
         }
@@ -103,20 +104,10 @@
             finish();
             return;
         }
-        if (DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN.equals(getIntent().getAction())) {
-            // If this was an add request, then just exit immediately if the
-            // given component is already added.
-            if (mDPM.isAdminActive(cn)) {
-                setResult(Activity.RESULT_OK);
-                finish();
-                return;
-            }
-        }
         
         ActivityInfo ai;
         try {
-            ai = getPackageManager().getReceiverInfo(cn,
-                    PackageManager.GET_META_DATA);
+            ai = getPackageManager().getReceiverInfo(cn, PackageManager.GET_META_DATA);
         } catch (PackageManager.NameNotFoundException e) {
             Log.w(TAG, "Unable to retrieve device policy " + cn, e);
             finish();
@@ -126,7 +117,7 @@
         ResolveInfo ri = new ResolveInfo();
         ri.activityInfo = ai;
         try {
-            mDeviceAdmin= new DeviceAdminInfo(this, ri);
+            mDeviceAdmin = new DeviceAdminInfo(this, ri);
         } catch (XmlPullParserException e) {
             Log.w(TAG, "Unable to retrieve device policy " + cn, e);
             finish();
@@ -137,8 +128,29 @@
             return;
         }
         
-        mAddMsgText = getIntent().getCharSequenceExtra(
-                DevicePolicyManager.EXTRA_ADD_EXPLANATION);
+        // This admin already exists, an we have two options at this point.  If new policy
+        // bits are set, show the user the new list.  If nothing has changed, simply return
+        // "OK" immediately.
+        if (DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN.equals(getIntent().getAction())) {
+            mRefreshing = false;
+            if (mDPM.isAdminActive(cn)) {
+                ArrayList<DeviceAdminInfo.PolicyInfo> newPolicies = mDeviceAdmin.getUsedPolicies();
+                for (int i = 0; i < newPolicies.size(); i++) {
+                    DeviceAdminInfo.PolicyInfo pi = newPolicies.get(i);
+                    if (!mDPM.hasGrantedPolicy(cn, pi.ident)) {
+                        mRefreshing = true;
+                        break;
+                    }
+                }
+                if (!mRefreshing) {
+                    // Nothing changed (or policies were removed) - return immediately
+                    setResult(Activity.RESULT_OK);
+                    finish();
+                    return;
+                }
+            }
+        }
+        mAddMsgText = getIntent().getCharSequenceExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION);
         
         setContentView(R.layout.device_admin_add);
         
@@ -170,7 +182,7 @@
             public void onClick(View v) {
                 if (mAdding) {
                     try {
-                        mDPM.setActiveAdmin(mDeviceAdmin.getComponent());
+                        mDPM.setActiveAdmin(mDeviceAdmin.getComponent(), mRefreshing);
                         setResult(Activity.RESULT_OK);
                     } catch (RuntimeException e) {
                         // Something bad happened...  could be that it was
@@ -260,7 +272,7 @@
         } else {
             mAddMsg.setVisibility(View.GONE);
         }
-        if (mDPM.isAdminActive(mDeviceAdmin.getComponent())) {
+        if (!mRefreshing && mDPM.isAdminActive(mDeviceAdmin.getComponent())) {
             if (mActivePolicies.size() == 0) {
                 ArrayList<DeviceAdminInfo.PolicyInfo> policies = mDeviceAdmin.getUsedPolicies();
                 for (int i=0; i<policies.size(); i++) {
diff --git a/src/com/android/settings/PrivacySettings.java b/src/com/android/settings/PrivacySettings.java
index 3f62f19..4132507 100644
--- a/src/com/android/settings/PrivacySettings.java
+++ b/src/com/android/settings/PrivacySettings.java
@@ -22,6 +22,7 @@
 import android.content.ContentResolver;
 import android.content.Context;
 import android.content.DialogInterface;
+import android.content.Intent;
 import android.os.Bundle;
 import android.os.RemoteException;
 import android.os.ServiceManager;
@@ -41,9 +42,12 @@
     private static final String BACKUP_CATEGORY = "backup_category";
     private static final String BACKUP_DATA = "backup_data";
     private static final String AUTO_RESTORE = "auto_restore";
+    private static final String CONFIGURE_TRANSPORT = "configure_transport";
+    private IBackupManager mBackupManager;
     private CheckBoxPreference mBackup;
     private CheckBoxPreference mAutoRestore;
     private Dialog mConfirmDialog;
+    private PreferenceScreen mConfigure;
 
     private static final int DIALOG_ERASE_BACKUP = 2;
     private int     mDialogType;
@@ -54,8 +58,12 @@
         addPreferencesFromResource(R.xml.privacy_settings);
         final PreferenceScreen screen = getPreferenceScreen();
 
+        mBackupManager = IBackupManager.Stub.asInterface(
+                ServiceManager.getService(Context.BACKUP_SERVICE));
+
         mBackup = (CheckBoxPreference) screen.findPreference(BACKUP_DATA);
         mAutoRestore = (CheckBoxPreference) screen.findPreference(AUTO_RESTORE);
+        mConfigure = (PreferenceScreen) screen.findPreference(CONFIGURE_TRANSPORT);
 
         // Vendor specific
         if (getActivity().getPackageManager().
@@ -121,13 +129,31 @@
     private void updateToggles() {
         ContentResolver res = getContentResolver();
 
-        final boolean backupEnabled = Settings.Secure.getInt(res,
-                Settings.Secure.BACKUP_ENABLED, 0) == 1;
+        boolean backupEnabled = false;
+        Intent configIntent = null;
+        String configSummary = null;
+        try {
+            backupEnabled = mBackupManager.isBackupEnabled();
+            String transport = mBackupManager.getCurrentTransport();
+            configIntent = mBackupManager.getConfigurationIntent(transport);
+            configSummary = mBackupManager.getDestinationString(transport);
+        } catch (RemoteException e) {
+            // leave it 'false' and disable the UI; there's no backup manager
+            mBackup.setEnabled(false);
+        }
         mBackup.setChecked(backupEnabled);
 
         mAutoRestore.setChecked(Settings.Secure.getInt(res,
                 Settings.Secure.BACKUP_AUTO_RESTORE, 1) == 1);
         mAutoRestore.setEnabled(backupEnabled);
+
+        mConfigure.setEnabled(configIntent != null);
+        mConfigure.setIntent(configIntent);
+        if (configSummary != null) {
+            mConfigure.setSummary(configSummary);
+        } else {
+            mConfigure.setSummary(R.string.backup_configure_transport_default_summary);
+        }
     }
 
     public void onClick(DialogInterface dialog, int which) {
@@ -151,11 +177,9 @@
      * @param enable whether to enable backup
      */
     private void setBackupEnabled(boolean enable) {
-        IBackupManager bm = IBackupManager.Stub.asInterface(
-                ServiceManager.getService(Context.BACKUP_SERVICE));
-        if (bm != null) {
+        if (mBackupManager != null) {
             try {
-                bm.setBackupEnabled(enable);
+                mBackupManager.setBackupEnabled(enable);
             } catch (RemoteException e) {
                 mBackup.setChecked(!enable);
                 mAutoRestore.setEnabled(!enable);
diff --git a/src/com/android/settings/SecuritySettings.java b/src/com/android/settings/SecuritySettings.java
index 8666d64..eea98b4 100644
--- a/src/com/android/settings/SecuritySettings.java
+++ b/src/com/android/settings/SecuritySettings.java
@@ -90,6 +90,8 @@
     private static final int SET_OR_CHANGE_LOCK_METHOD_REQUEST = 123;
     private static final int FALLBACK_LOCK_AFTER_TIMEOUT_VALUE = 5000; // compatible with pre-Froyo
 
+    private static final String TAG = "SecuritySettings";
+
     // Credential storage
     private final CredentialStorage mCredentialStorage = new CredentialStorage();
 
@@ -359,8 +361,8 @@
 
         final LockPatternUtils lockPatternUtils = mChooseLockSettingsHelper.utils();
         if (KEY_UNLOCK_SET_OR_CHANGE.equals(key)) {
-            Intent intent = new Intent(getActivity(), ChooseLockGeneric.class);
-            startActivityForResult(intent, SET_OR_CHANGE_LOCK_METHOD_REQUEST);
+            startFragment(this, "com.android.settings.ChooseLockGeneric$ChooseLockGenericFragment",
+                    SET_OR_CHANGE_LOCK_METHOD_REQUEST, null);
         } else if (KEY_LOCK_ENABLED.equals(key)) {
             lockPatternUtils.setLockPatternEnabled(isToggled(preference));
         } else if (KEY_VISIBLE_PATTERN.equals(key)) {
diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java
index a47fa56..09584ad 100644
--- a/src/com/android/settings/Settings.java
+++ b/src/com/android/settings/Settings.java
@@ -49,8 +49,12 @@
         getMetaData();
         super.onCreate(savedInstanceState);
 
-        // TODO: Do this only if 2-pane mode
-        highlightHeader();
+        if (!onIsHidingHeaders() && onIsMultiPane()) {
+            highlightHeader();
+            // Force the title so that it doesn't get overridden by a direct launch of
+            // a specific settings screen.
+            setTitle(R.string.settings_label);
+        }
     }
 
     @Override
diff --git a/src/com/android/settings/TetherSettings.java b/src/com/android/settings/TetherSettings.java
index f632a02..bc27dc0 100644
--- a/src/com/android/settings/TetherSettings.java
+++ b/src/com/android/settings/TetherSettings.java
@@ -131,6 +131,7 @@
                 mBluetoothSettings.setEnabled(false);
             }
         }
+        /* Don't change the title for two-pane settings
         if (wifiAvailable && usbAvailable && bluetoothAvailable){
             activity.setTitle(R.string.tether_settings_title_all);
         } else if (wifiAvailable && usbAvailable){
@@ -146,6 +147,7 @@
         } else {
             activity.setTitle(R.string.tether_settings_title_bluetooth);
         }
+        */
         mWifiApEnabler = new WifiApEnabler(activity, mEnableWifiAp);
         mView = new WebView(activity);
     }
diff --git a/src/com/android/settings/accounts/ManageAccountsSettings.java b/src/com/android/settings/accounts/ManageAccountsSettings.java
index 8f61516..4efe62b 100644
--- a/src/com/android/settings/accounts/ManageAccountsSettings.java
+++ b/src/com/android/settings/accounts/ManageAccountsSettings.java
@@ -216,8 +216,12 @@
 
     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
-        onAddAccountClicked();
-        return true;
+        if (item.getItemId() == MENU_ADD_ACCOUNT) {
+            onAddAccountClicked();
+            return true;
+        } else {
+            return super.onOptionsItemSelected(item);
+        }
     }
 
     private void setBackgroundDataInt(boolean enabled) {
