Merge "New assets for action bar"
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 9d5381a..0e28ae8 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -16,15 +16,16 @@
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="com.android.contacts"
-    android:sharedUserId="android.uid.shared"
-    android:sharedUserLabel="@string/sharedUserLabel"
->
+    android:sharedUserId="android.uid.shared">
 
     <original-package android:name="com.android.contacts" />
 
     <uses-permission android:name="android.permission.CALL_PRIVILEGED" />
     <uses-permission android:name="android.permission.READ_CONTACTS" />
     <uses-permission android:name="android.permission.WRITE_CONTACTS" />
+    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
+    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
+    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
     <uses-permission android:name="android.permission.READ_PROFILE" />
     <uses-permission android:name="android.permission.WRITE_PROFILE" />
     <uses-permission android:name="android.permission.INTERNET" />
@@ -48,7 +49,6 @@
         android:name="com.android.contacts.ContactsApplication"
         android:label="@string/contactsList"
         android:icon="@mipmap/ic_launcher_contacts"
-        android:process="android.process.acore"
         android:taskAffinity="android.task.contacts"
         android:hardwareAccelerated="true"
     >
@@ -389,7 +389,7 @@
         <!-- Create a new or edit an existing group -->
         <activity
             android:name=".activities.GroupEditorActivity"
-            android:theme="@style/ContactEditorActivityTheme"
+            android:theme="@style/EditorActivityTheme"
             android:windowSoftInputMode="adjustResize" />
 
         <!-- Used to show QuickContact window over a translucent activity, which is a
@@ -503,7 +503,7 @@
         <!-- Create a new or edit an existing contact -->
         <activity
             android:name=".activities.ContactEditorActivity"
-            android:theme="@style/ContactEditorActivityTheme"
+            android:theme="@style/EditorActivityTheme"
             android:uiOptions="splitActionBarWhenNarrow"
             android:windowSoftInputMode="adjustResize">
 
diff --git a/res/drawable-hdpi/change_photo_box_focused_holo_light.9.png b/res/drawable-hdpi/change_photo_box_focused_holo_light.9.png
deleted file mode 100644
index 5254473..0000000
--- a/res/drawable-hdpi/change_photo_box_focused_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/change_photo_box_normal_holo_light.9.png b/res/drawable-hdpi/change_photo_box_normal_holo_light.9.png
deleted file mode 100644
index f026cc8..0000000
--- a/res/drawable-hdpi/change_photo_box_normal_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/change_photo_box_pressed_holo_light.9.png b/res/drawable-hdpi/change_photo_box_pressed_holo_light.9.png
deleted file mode 100644
index a0770ea..0000000
--- a/res/drawable-hdpi/change_photo_box_pressed_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/dial_background_texture.png b/res/drawable-hdpi/dial_background_texture.png
index 5b299fd..7ed0984 100644
--- a/res/drawable-hdpi/dial_background_texture.png
+++ b/res/drawable-hdpi/dial_background_texture.png
Binary files differ
diff --git a/res/drawable-hdpi/dial_num_0_wht.png b/res/drawable-hdpi/dial_num_0_wht.png
index a0720f3..9d7fc62 100644
--- a/res/drawable-hdpi/dial_num_0_wht.png
+++ b/res/drawable-hdpi/dial_num_0_wht.png
Binary files differ
diff --git a/res/drawable-hdpi/dial_num_1_wht.png b/res/drawable-hdpi/dial_num_1_wht.png
index 0c79720..e941c52 100644
--- a/res/drawable-hdpi/dial_num_1_wht.png
+++ b/res/drawable-hdpi/dial_num_1_wht.png
Binary files differ
diff --git a/res/drawable-hdpi/dial_num_2_wht.png b/res/drawable-hdpi/dial_num_2_wht.png
index ab90531..fc5540b 100644
--- a/res/drawable-hdpi/dial_num_2_wht.png
+++ b/res/drawable-hdpi/dial_num_2_wht.png
Binary files differ
diff --git a/res/drawable-hdpi/dial_num_3_wht.png b/res/drawable-hdpi/dial_num_3_wht.png
index 956cba9..45637b9 100644
--- a/res/drawable-hdpi/dial_num_3_wht.png
+++ b/res/drawable-hdpi/dial_num_3_wht.png
Binary files differ
diff --git a/res/drawable-hdpi/dial_num_4_wht.png b/res/drawable-hdpi/dial_num_4_wht.png
index 34e157c..af8c8aa 100644
--- a/res/drawable-hdpi/dial_num_4_wht.png
+++ b/res/drawable-hdpi/dial_num_4_wht.png
Binary files differ
diff --git a/res/drawable-hdpi/dial_num_5_wht.png b/res/drawable-hdpi/dial_num_5_wht.png
index 4a3560a..20ab0b1 100644
--- a/res/drawable-hdpi/dial_num_5_wht.png
+++ b/res/drawable-hdpi/dial_num_5_wht.png
Binary files differ
diff --git a/res/drawable-hdpi/dial_num_6_wht.png b/res/drawable-hdpi/dial_num_6_wht.png
index a60420b..8811b4b 100644
--- a/res/drawable-hdpi/dial_num_6_wht.png
+++ b/res/drawable-hdpi/dial_num_6_wht.png
Binary files differ
diff --git a/res/drawable-hdpi/dial_num_7_wht.png b/res/drawable-hdpi/dial_num_7_wht.png
index 95e4cff..ed6d749 100644
--- a/res/drawable-hdpi/dial_num_7_wht.png
+++ b/res/drawable-hdpi/dial_num_7_wht.png
Binary files differ
diff --git a/res/drawable-hdpi/dial_num_8_wht.png b/res/drawable-hdpi/dial_num_8_wht.png
index 4b17084..6844aeb 100644
--- a/res/drawable-hdpi/dial_num_8_wht.png
+++ b/res/drawable-hdpi/dial_num_8_wht.png
Binary files differ
diff --git a/res/drawable-hdpi/dial_num_9_wht.png b/res/drawable-hdpi/dial_num_9_wht.png
index f772901..df294be 100644
--- a/res/drawable-hdpi/dial_num_9_wht.png
+++ b/res/drawable-hdpi/dial_num_9_wht.png
Binary files differ
diff --git a/res/drawable-hdpi/dial_num_pound_wht.png b/res/drawable-hdpi/dial_num_pound_wht.png
index 1d7f55a..46316e5 100644
--- a/res/drawable-hdpi/dial_num_pound_wht.png
+++ b/res/drawable-hdpi/dial_num_pound_wht.png
Binary files differ
diff --git a/res/drawable-hdpi/dial_num_star_wht.png b/res/drawable-hdpi/dial_num_star_wht.png
index 2add63b..c36e31c 100644
--- a/res/drawable-hdpi/dial_num_star_wht.png
+++ b/res/drawable-hdpi/dial_num_star_wht.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_dial_action_delete.png b/res/drawable-hdpi/ic_dial_action_delete.png
index f93a308..0bf8563 100644
--- a/res/drawable-hdpi/ic_dial_action_delete.png
+++ b/res/drawable-hdpi/ic_dial_action_delete.png
Binary files differ
diff --git a/res/drawable-hdpi/list_activated_holo.9.png b/res/drawable-hdpi/list_activated_holo.9.png
index 36ccb79..7b89319 100644
--- a/res/drawable-hdpi/list_activated_holo.9.png
+++ b/res/drawable-hdpi/list_activated_holo.9.png
Binary files differ
diff --git a/res/drawable-hdpi/list_focused_holo.9.png b/res/drawable-hdpi/list_focused_holo.9.png
index 54c5c2d..e962ce8 100644
--- a/res/drawable-hdpi/list_focused_holo.9.png
+++ b/res/drawable-hdpi/list_focused_holo.9.png
Binary files differ
diff --git a/res/drawable-hdpi/list_pressed_holo.9.png b/res/drawable-hdpi/list_pressed_holo.9.png
index 423fa4b..dd183c0 100644
--- a/res/drawable-hdpi/list_pressed_holo.9.png
+++ b/res/drawable-hdpi/list_pressed_holo.9.png
Binary files differ
diff --git a/res/drawable-hdpi/sym_action_audiochat_holo_dark.png b/res/drawable-hdpi/sym_action_audiochat_holo_dark.png
new file mode 100644
index 0000000..d4e3329
--- /dev/null
+++ b/res/drawable-hdpi/sym_action_audiochat_holo_dark.png
Binary files differ
diff --git a/res/drawable-hdpi/sym_action_videochat_holo_dark.png b/res/drawable-hdpi/sym_action_videochat_holo_dark.png
new file mode 100644
index 0000000..821940a
--- /dev/null
+++ b/res/drawable-hdpi/sym_action_videochat_holo_dark.png
Binary files differ
diff --git a/res/drawable-mdpi/change_photo_box_focused_holo_light.9.png b/res/drawable-mdpi/change_photo_box_focused_holo_light.9.png
deleted file mode 100644
index 47fb773..0000000
--- a/res/drawable-mdpi/change_photo_box_focused_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/change_photo_box_normal_holo_light.9.png b/res/drawable-mdpi/change_photo_box_normal_holo_light.9.png
deleted file mode 100644
index 591e6d5..0000000
--- a/res/drawable-mdpi/change_photo_box_normal_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/change_photo_box_pressed_holo_light.9.png b/res/drawable-mdpi/change_photo_box_pressed_holo_light.9.png
deleted file mode 100644
index 5d5eee2..0000000
--- a/res/drawable-mdpi/change_photo_box_pressed_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/dial_background_texture.png b/res/drawable-mdpi/dial_background_texture.png
index 881f3a0..f0ba700 100644
--- a/res/drawable-mdpi/dial_background_texture.png
+++ b/res/drawable-mdpi/dial_background_texture.png
Binary files differ
diff --git a/res/drawable-mdpi/dial_num_0_wht.png b/res/drawable-mdpi/dial_num_0_wht.png
index 5391fb3..96a0dcd 100644
--- a/res/drawable-mdpi/dial_num_0_wht.png
+++ b/res/drawable-mdpi/dial_num_0_wht.png
Binary files differ
diff --git a/res/drawable-mdpi/dial_num_1_wht.png b/res/drawable-mdpi/dial_num_1_wht.png
index ff8f125..56dbca3 100644
--- a/res/drawable-mdpi/dial_num_1_wht.png
+++ b/res/drawable-mdpi/dial_num_1_wht.png
Binary files differ
diff --git a/res/drawable-mdpi/dial_num_2_wht.png b/res/drawable-mdpi/dial_num_2_wht.png
index 041bafb..4c0991c 100644
--- a/res/drawable-mdpi/dial_num_2_wht.png
+++ b/res/drawable-mdpi/dial_num_2_wht.png
Binary files differ
diff --git a/res/drawable-mdpi/dial_num_3_wht.png b/res/drawable-mdpi/dial_num_3_wht.png
index b91b4f5..81bf770 100644
--- a/res/drawable-mdpi/dial_num_3_wht.png
+++ b/res/drawable-mdpi/dial_num_3_wht.png
Binary files differ
diff --git a/res/drawable-mdpi/dial_num_4_wht.png b/res/drawable-mdpi/dial_num_4_wht.png
index 912b4cb..5f07476 100644
--- a/res/drawable-mdpi/dial_num_4_wht.png
+++ b/res/drawable-mdpi/dial_num_4_wht.png
Binary files differ
diff --git a/res/drawable-mdpi/dial_num_5_wht.png b/res/drawable-mdpi/dial_num_5_wht.png
index efd385f..5cf9c7a 100644
--- a/res/drawable-mdpi/dial_num_5_wht.png
+++ b/res/drawable-mdpi/dial_num_5_wht.png
Binary files differ
diff --git a/res/drawable-mdpi/dial_num_6_wht.png b/res/drawable-mdpi/dial_num_6_wht.png
index c0f47c5..ceffb29 100644
--- a/res/drawable-mdpi/dial_num_6_wht.png
+++ b/res/drawable-mdpi/dial_num_6_wht.png
Binary files differ
diff --git a/res/drawable-mdpi/dial_num_7_wht.png b/res/drawable-mdpi/dial_num_7_wht.png
index 5644f2b..022ef9c 100644
--- a/res/drawable-mdpi/dial_num_7_wht.png
+++ b/res/drawable-mdpi/dial_num_7_wht.png
Binary files differ
diff --git a/res/drawable-mdpi/dial_num_8_wht.png b/res/drawable-mdpi/dial_num_8_wht.png
index d0c517d..c470e68 100644
--- a/res/drawable-mdpi/dial_num_8_wht.png
+++ b/res/drawable-mdpi/dial_num_8_wht.png
Binary files differ
diff --git a/res/drawable-mdpi/dial_num_9_wht.png b/res/drawable-mdpi/dial_num_9_wht.png
index fb443ec..27d94ef 100644
--- a/res/drawable-mdpi/dial_num_9_wht.png
+++ b/res/drawable-mdpi/dial_num_9_wht.png
Binary files differ
diff --git a/res/drawable-mdpi/dial_num_pound_wht.png b/res/drawable-mdpi/dial_num_pound_wht.png
index 11751ec..68908c3 100644
--- a/res/drawable-mdpi/dial_num_pound_wht.png
+++ b/res/drawable-mdpi/dial_num_pound_wht.png
Binary files differ
diff --git a/res/drawable-mdpi/dial_num_star_wht.png b/res/drawable-mdpi/dial_num_star_wht.png
index 61b24c1..cb8aa28 100644
--- a/res/drawable-mdpi/dial_num_star_wht.png
+++ b/res/drawable-mdpi/dial_num_star_wht.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_dial_action_delete.png b/res/drawable-mdpi/ic_dial_action_delete.png
index 32b0022..98341e9 100644
--- a/res/drawable-mdpi/ic_dial_action_delete.png
+++ b/res/drawable-mdpi/ic_dial_action_delete.png
Binary files differ
diff --git a/res/drawable-mdpi/list_activated_holo.9.png b/res/drawable-mdpi/list_activated_holo.9.png
index f7cd24e..4d98919 100644
--- a/res/drawable-mdpi/list_activated_holo.9.png
+++ b/res/drawable-mdpi/list_activated_holo.9.png
Binary files differ
diff --git a/res/drawable-mdpi/list_focused_holo.9.png b/res/drawable-mdpi/list_focused_holo.9.png
index 32cb628..6e041f3 100644
--- a/res/drawable-mdpi/list_focused_holo.9.png
+++ b/res/drawable-mdpi/list_focused_holo.9.png
Binary files differ
diff --git a/res/drawable-mdpi/list_pressed_holo.9.png b/res/drawable-mdpi/list_pressed_holo.9.png
index 7ea8666..9358dd8 100644
--- a/res/drawable-mdpi/list_pressed_holo.9.png
+++ b/res/drawable-mdpi/list_pressed_holo.9.png
Binary files differ
diff --git a/res/drawable-mdpi/sym_action_audiochat_holo_dark.png b/res/drawable-mdpi/sym_action_audiochat_holo_dark.png
new file mode 100644
index 0000000..848404d
--- /dev/null
+++ b/res/drawable-mdpi/sym_action_audiochat_holo_dark.png
Binary files differ
diff --git a/res/drawable-mdpi/sym_action_videochat_holo_dark.png b/res/drawable-mdpi/sym_action_videochat_holo_dark.png
new file mode 100644
index 0000000..9112e87
--- /dev/null
+++ b/res/drawable-mdpi/sym_action_videochat_holo_dark.png
Binary files differ
diff --git a/res/drawable-xhdpi/bg_status_contact_widget.9.png b/res/drawable-xhdpi/bg_status_contact_widget.9.png
index db34bf4..ced5296 100644
--- a/res/drawable-xhdpi/bg_status_contact_widget.9.png
+++ b/res/drawable-xhdpi/bg_status_contact_widget.9.png
Binary files differ
diff --git a/res/drawable-xhdpi/change_photo_box_focused_holo_light.9.png b/res/drawable-xhdpi/change_photo_box_focused_holo_light.9.png
deleted file mode 100644
index 7dbd1e6..0000000
--- a/res/drawable-xhdpi/change_photo_box_focused_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/change_photo_box_normal_holo_light.9.png b/res/drawable-xhdpi/change_photo_box_normal_holo_light.9.png
deleted file mode 100644
index 7e1e97f..0000000
--- a/res/drawable-xhdpi/change_photo_box_normal_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/change_photo_box_pressed_holo_light.9.png b/res/drawable-xhdpi/change_photo_box_pressed_holo_light.9.png
deleted file mode 100644
index e98266f..0000000
--- a/res/drawable-xhdpi/change_photo_box_pressed_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/contacts_widget_preview.png b/res/drawable-xhdpi/contacts_widget_preview.png
index 65ac914..1f42ca0 100644
--- a/res/drawable-xhdpi/contacts_widget_preview.png
+++ b/res/drawable-xhdpi/contacts_widget_preview.png
Binary files differ
diff --git a/res/drawable-xhdpi/dial_background_texture.png b/res/drawable-xhdpi/dial_background_texture.png
index 4c8617a..3d6e8c7 100644
--- a/res/drawable-xhdpi/dial_background_texture.png
+++ b/res/drawable-xhdpi/dial_background_texture.png
Binary files differ
diff --git a/res/drawable-xhdpi/dial_num_0_wht.png b/res/drawable-xhdpi/dial_num_0_wht.png
index 99aca70..f6f96cc 100644
--- a/res/drawable-xhdpi/dial_num_0_wht.png
+++ b/res/drawable-xhdpi/dial_num_0_wht.png
Binary files differ
diff --git a/res/drawable-xhdpi/dial_num_1_wht.png b/res/drawable-xhdpi/dial_num_1_wht.png
index 5a54bfd..8333aba 100644
--- a/res/drawable-xhdpi/dial_num_1_wht.png
+++ b/res/drawable-xhdpi/dial_num_1_wht.png
Binary files differ
diff --git a/res/drawable-xhdpi/dial_num_2_wht.png b/res/drawable-xhdpi/dial_num_2_wht.png
index 3407d79..02f8fdf 100644
--- a/res/drawable-xhdpi/dial_num_2_wht.png
+++ b/res/drawable-xhdpi/dial_num_2_wht.png
Binary files differ
diff --git a/res/drawable-xhdpi/dial_num_3_wht.png b/res/drawable-xhdpi/dial_num_3_wht.png
index dd16bbb..44383b5 100644
--- a/res/drawable-xhdpi/dial_num_3_wht.png
+++ b/res/drawable-xhdpi/dial_num_3_wht.png
Binary files differ
diff --git a/res/drawable-xhdpi/dial_num_4_wht.png b/res/drawable-xhdpi/dial_num_4_wht.png
index 98f8773..f90cb73 100644
--- a/res/drawable-xhdpi/dial_num_4_wht.png
+++ b/res/drawable-xhdpi/dial_num_4_wht.png
Binary files differ
diff --git a/res/drawable-xhdpi/dial_num_5_wht.png b/res/drawable-xhdpi/dial_num_5_wht.png
index 12a92bf..c41c615 100644
--- a/res/drawable-xhdpi/dial_num_5_wht.png
+++ b/res/drawable-xhdpi/dial_num_5_wht.png
Binary files differ
diff --git a/res/drawable-xhdpi/dial_num_6_wht.png b/res/drawable-xhdpi/dial_num_6_wht.png
index 39c3eda..4c7a235 100644
--- a/res/drawable-xhdpi/dial_num_6_wht.png
+++ b/res/drawable-xhdpi/dial_num_6_wht.png
Binary files differ
diff --git a/res/drawable-xhdpi/dial_num_7_wht.png b/res/drawable-xhdpi/dial_num_7_wht.png
index 5e3a0b0..fabca99 100644
--- a/res/drawable-xhdpi/dial_num_7_wht.png
+++ b/res/drawable-xhdpi/dial_num_7_wht.png
Binary files differ
diff --git a/res/drawable-xhdpi/dial_num_8_wht.png b/res/drawable-xhdpi/dial_num_8_wht.png
index d68142d..7bd70b0 100644
--- a/res/drawable-xhdpi/dial_num_8_wht.png
+++ b/res/drawable-xhdpi/dial_num_8_wht.png
Binary files differ
diff --git a/res/drawable-xhdpi/dial_num_9_wht.png b/res/drawable-xhdpi/dial_num_9_wht.png
index b34bc1d..207276c 100644
--- a/res/drawable-xhdpi/dial_num_9_wht.png
+++ b/res/drawable-xhdpi/dial_num_9_wht.png
Binary files differ
diff --git a/res/drawable-xhdpi/dial_num_pound_wht.png b/res/drawable-xhdpi/dial_num_pound_wht.png
index a4ead0a..b2cac17 100644
--- a/res/drawable-xhdpi/dial_num_pound_wht.png
+++ b/res/drawable-xhdpi/dial_num_pound_wht.png
Binary files differ
diff --git a/res/drawable-xhdpi/dial_num_star_wht.png b/res/drawable-xhdpi/dial_num_star_wht.png
index ba0a787..2862c45 100644
--- a/res/drawable-xhdpi/dial_num_star_wht.png
+++ b/res/drawable-xhdpi/dial_num_star_wht.png
Binary files differ
diff --git a/res/drawable-xhdpi/frame_thumbnail_contact_widget_focused_holo.png b/res/drawable-xhdpi/frame_thumbnail_contact_widget_focused_holo.png
index a05ca8a..157ef56 100644
--- a/res/drawable-xhdpi/frame_thumbnail_contact_widget_focused_holo.png
+++ b/res/drawable-xhdpi/frame_thumbnail_contact_widget_focused_holo.png
Binary files differ
diff --git a/res/drawable-xhdpi/frame_thumbnail_contact_widget_holo.png b/res/drawable-xhdpi/frame_thumbnail_contact_widget_holo.png
index bf2e4a8..7719710 100644
--- a/res/drawable-xhdpi/frame_thumbnail_contact_widget_holo.png
+++ b/res/drawable-xhdpi/frame_thumbnail_contact_widget_holo.png
Binary files differ
diff --git a/res/drawable-xhdpi/frame_thumbnail_contact_widget_pressed_holo.png b/res/drawable-xhdpi/frame_thumbnail_contact_widget_pressed_holo.png
index 6541c62..8c5008b 100644
--- a/res/drawable-xhdpi/frame_thumbnail_contact_widget_pressed_holo.png
+++ b/res/drawable-xhdpi/frame_thumbnail_contact_widget_pressed_holo.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_dial_action_delete.png b/res/drawable-xhdpi/ic_dial_action_delete.png
index 9c0b4f0..989e8b1 100644
--- a/res/drawable-xhdpi/ic_dial_action_delete.png
+++ b/res/drawable-xhdpi/ic_dial_action_delete.png
Binary files differ
diff --git a/res/drawable-xhdpi/list_activated_holo.9.png b/res/drawable-xhdpi/list_activated_holo.9.png
index bb9a7f9..4e13add 100644
--- a/res/drawable-xhdpi/list_activated_holo.9.png
+++ b/res/drawable-xhdpi/list_activated_holo.9.png
Binary files differ
diff --git a/res/drawable-xhdpi/list_focused_holo.9.png b/res/drawable-xhdpi/list_focused_holo.9.png
index 6051708..9c90c2b 100644
--- a/res/drawable-xhdpi/list_focused_holo.9.png
+++ b/res/drawable-xhdpi/list_focused_holo.9.png
Binary files differ
diff --git a/res/drawable-xhdpi/list_pressed_holo.9.png b/res/drawable-xhdpi/list_pressed_holo.9.png
index f4b4c38..d0fc7e0 100644
--- a/res/drawable-xhdpi/list_pressed_holo.9.png
+++ b/res/drawable-xhdpi/list_pressed_holo.9.png
Binary files differ
diff --git a/res/drawable-xhdpi/sym_action_audiochat_holo_dark.png b/res/drawable-xhdpi/sym_action_audiochat_holo_dark.png
new file mode 100644
index 0000000..216d34f
--- /dev/null
+++ b/res/drawable-xhdpi/sym_action_audiochat_holo_dark.png
Binary files differ
diff --git a/res/drawable-xhdpi/sym_action_videochat_holo_dark.png b/res/drawable-xhdpi/sym_action_videochat_holo_dark.png
new file mode 100644
index 0000000..5011489
--- /dev/null
+++ b/res/drawable-xhdpi/sym_action_videochat_holo_dark.png
Binary files differ
diff --git a/res/drawable/change_photo_box_holo_light.xml b/res/drawable/change_photo_box_holo_light.xml
deleted file mode 100644
index f08beb0..0000000
--- a/res/drawable/change_photo_box_holo_light.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2009 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-    <item android:state_window_focused="false"
-        android:drawable="@drawable/change_photo_box_normal_holo_light" />
-    <item android:state_pressed="true"
-        android:drawable="@drawable/change_photo_box_pressed_holo_light" />
-    <item android:state_focused="true"
-        android:drawable="@drawable/change_photo_box_focused_holo_light" />
-    <item
-        android:drawable="@drawable/change_photo_box_normal_holo_light" />
-</selector>
diff --git a/res/layout-sw580dp/event_field_editor_view.xml b/res/layout-sw580dp/event_field_editor_view.xml
index f31b283..822de37 100644
--- a/res/layout-sw580dp/event_field_editor_view.xml
+++ b/res/layout-sw580dp/event_field_editor_view.xml
@@ -39,7 +39,6 @@
         <include
             android:id="@+id/spinner"
             layout="@layout/edit_spinner"
-            android:paddingTop="15dip"
             android:visibility="gone" />
 
         <include
diff --git a/res/layout-sw580dp/external_raw_contact_editor_view.xml b/res/layout-sw580dp/external_raw_contact_editor_view.xml
index b185c8a..fba5220 100644
--- a/res/layout-sw580dp/external_raw_contact_editor_view.xml
+++ b/res/layout-sw580dp/external_raw_contact_editor_view.xml
@@ -22,8 +22,7 @@
     android:orientation="vertical">
 
     <include
-        layout="@layout/raw_contact_editor_header"
-        android:id="@+id/header" />
+        layout="@layout/editor_account_header" />
 
     <LinearLayout
         android:id="@+id/body"
diff --git a/res/layout-sw580dp/raw_contact_editor_header.xml b/res/layout-sw580dp/raw_contact_editor_header.xml
deleted file mode 100644
index 498998d..0000000
--- a/res/layout-sw580dp/raw_contact_editor_header.xml
+++ /dev/null
@@ -1,68 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-
-<!-- Account info header -->
-<FrameLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_height="64dip"
-    android:layout_width="match_parent">
-
-    <RelativeLayout
-        android:id="@+id/account"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:background="?android:attr/selectableItemBackground">
-
-        <ImageView
-            android:id="@+id/account_icon"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginLeft="7dip"
-            android:layout_marginRight="7dip"
-            android:layout_centerVertical="true"
-            android:layout_alignParentRight="true"
-            android:layout_below="@id/header_color_bar" />
-
-        <TextView
-            android:id="@+id/account_type"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_toLeftOf="@+id/account_icon"
-            android:layout_alignTop="@id/account_icon"
-            android:layout_marginTop="-4dip"
-            android:textAppearance="?android:attr/textAppearanceMedium"
-            android:textColor="?android:attr/textColorPrimary"
-            android:singleLine="true" />
-
-        <TextView
-            android:id="@+id/account_name"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_toLeftOf="@+id/account_icon"
-            android:layout_alignBottom="@+id/account_icon"
-            android:layout_marginBottom="2dip"
-
-            android:textAppearance="?android:attr/textAppearanceSmall"
-            android:textColor="?android:attr/textColorPrimary"
-            android:singleLine="true" />
-
-        <include
-              android:id="@+id/divider"
-              android:layout_alignParentBottom="true"
-              layout="@layout/edit_divider" />
-    </RelativeLayout>
-</FrameLayout>
\ No newline at end of file
diff --git a/res/layout-sw580dp/raw_contact_editor_view.xml b/res/layout-sw580dp/raw_contact_editor_view.xml
index 9c3f708..11fc161 100644
--- a/res/layout-sw580dp/raw_contact_editor_view.xml
+++ b/res/layout-sw580dp/raw_contact_editor_view.xml
@@ -21,14 +21,8 @@
     android:layout_height="wrap_content"
     android:orientation="vertical">
 
-    <FrameLayout
-        android:id="@+id/anchor_for_account_switcher"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content">
-        <include
-            layout="@layout/raw_contact_editor_header"
-            android:id="@+id/header" />
-    </FrameLayout>
+    <include
+        layout="@layout/editor_account_header" />
 
     <LinearLayout
         android:id="@+id/body"
@@ -124,8 +118,8 @@
         <com.android.contacts.widget.InterpolatingLayout
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:layout_marginTop="10dip"
-            android:layout_marginBottom="42dip">
+            android:layout_marginTop="16dip"
+            android:layout_marginBottom="32dip">
             <Button
                 android:id="@+id/button_add_field"
                 android:text="@string/add_field"
diff --git a/res/layout/edit_add_field.xml b/res/layout/edit_add_field.xml
index 31ea05d..b17185d 100644
--- a/res/layout/edit_add_field.xml
+++ b/res/layout/edit_add_field.xml
@@ -17,7 +17,8 @@
 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:paddingLeft="13dip"
+    android:minHeight="48dip"
+    android:paddingLeft="16dip"
     android:background="?android:attr/selectableItemBackground">
     <TextView
         android:id="@+id/add_text"
@@ -26,6 +27,6 @@
         android:layout_height="wrap_content"
         android:duplicateParentState="true"
         android:textAppearance="?android:attr/textAppearanceMedium"
-        android:textColor="?android:attr/textColorTertiary"
+        android:textColor="?android:attr/textColorSecondary"
         android:text="@string/add_new_entry_for_section" />
 </FrameLayout>
\ No newline at end of file
diff --git a/res/layout/edit_date_picker.xml b/res/layout/edit_date_picker.xml
index c18d607..5122bbe 100644
--- a/res/layout/edit_date_picker.xml
+++ b/res/layout/edit_date_picker.xml
@@ -19,10 +19,11 @@
 <Button
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@+id/date_view"
+    style="?android:attr/spinnerStyle"
     android:layout_width="0dip"
     android:layout_height="wrap_content"
     android:layout_weight="1"
     android:layout_marginLeft="@dimen/editor_field_left_padding"
     android:layout_marginRight="@dimen/editor_field_right_padding"
     android:textAppearance="?android:attr/textAppearanceMedium"
-    style="@android:style/Widget.Holo.Light.Spinner" />
\ No newline at end of file
+    android:paddingLeft="16dip" />
\ No newline at end of file
diff --git a/res/layout/edit_expansion_view.xml b/res/layout/edit_expansion_view.xml
index 96fe8de..267593d 100644
--- a/res/layout/edit_expansion_view.xml
+++ b/res/layout/edit_expansion_view.xml
@@ -19,12 +19,12 @@
 <FrameLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="wrap_content"
-    android:layout_height="wrap_content"
-    android:layout_gravity="top">
+    android:layout_height="match_parent">
     <ImageView
         android:id="@+id/expansion_view"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
+        android:layout_gravity="top"
         android:duplicateParentState="true"
         android:background="?android:attr/selectableItemBackground"
         android:paddingLeft="@dimen/editor_round_button_padding_left"
diff --git a/res/layout/edit_kind_title.xml b/res/layout/edit_kind_title.xml
index 619ba49..0f755ee 100644
--- a/res/layout/edit_kind_title.xml
+++ b/res/layout/edit_kind_title.xml
@@ -21,22 +21,23 @@
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:paddingLeft="@dimen/editor_field_left_padding"
-    android:paddingRight="@dimen/editor_field_right_padding"
+    android:minHeight="24dip"
+    android:paddingLeft="8dip"
+    android:paddingRight="8dip"
     android:orientation="vertical">
 
     <TextView
         android:id="@+id/kind_title"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:paddingLeft="@dimen/editor_field_left_padding"
+        android:paddingLeft="8dip"
         android:textAppearance="?android:attr/textAppearanceMedium"
         android:textColor="@color/people_app_theme_color"
         android:textStyle="bold"
+        android:textAllCaps="true"
         android:singleLine="true"
         android:ellipsize="end"
-        android:paddingTop="5dip"
-        android:paddingBottom="2dip" />
+        android:layout_gravity="center_vertical" />
 
     <ImageView
         android:id="@+id/divider"
diff --git a/res/layout/edit_spinner.xml b/res/layout/edit_spinner.xml
index 325eb50..37edcbd 100644
--- a/res/layout/edit_spinner.xml
+++ b/res/layout/edit_spinner.xml
@@ -20,8 +20,8 @@
 <Spinner
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@+id/spinner"
+    android:layout_gravity="top"
     android:layout_width="@dimen/editor_type_label_width"
     android:layout_height="wrap_content"
     android:paddingLeft="5dip"
-    android:paddingRight="20dip"
-    android:textAppearance="?android:attr/textAppearanceSmall"/>
\ No newline at end of file
+    android:paddingRight="20dip"/>
\ No newline at end of file
diff --git a/res/layout/editor_account_header.xml b/res/layout/editor_account_header.xml
index fbce1f9..5181708 100644
--- a/res/layout/editor_account_header.xml
+++ b/res/layout/editor_account_header.xml
@@ -16,11 +16,16 @@
 
 <LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/account_container"
     android:layout_height="wrap_content"
     android:layout_width="match_parent"
+    android:minHeight="48dip"
+    android:background="#EEEEEE"
     android:orientation="horizontal"
-    android:paddingLeft="10dip"
-    android:paddingRight="10dip">
+    android:paddingTop="8dip"
+    android:paddingBottom="8dip"
+    android:paddingLeft="16dip"
+    android:paddingRight="16dip">
 
     <LinearLayout
         android:id="@+id/account"
@@ -53,8 +58,8 @@
 
         <ImageView
              android:id="@+id/account_icon"
-             android:layout_width="45dip"
-             android:layout_height="45dip"
+             android:layout_width="32dip"
+             android:layout_height="32dip"
              android:layout_gravity="center_vertical" />
 
     </FrameLayout>
diff --git a/res/layout/event_field_editor_view.xml b/res/layout/event_field_editor_view.xml
index 0dceafc..6903772 100644
--- a/res/layout/event_field_editor_view.xml
+++ b/res/layout/event_field_editor_view.xml
@@ -35,10 +35,14 @@
             android:id="@+id/date_view"
             layout="@layout/edit_date_picker" />
 
-        <include
+        <Spinner
             android:id="@+id/spinner"
-            layout="@layout/edit_spinner"
-            android:visibility="gone" />
+            android:layout_width="@dimen/editor_type_label_width"
+            android:layout_height="wrap_content"
+            android:paddingLeft="5dip"
+            android:paddingRight="20dip"
+            android:layout_gravity="bottom"
+            android:visibility="gone"/>
 
         <include
             android:id="@+id/delete_button_container"
diff --git a/res/layout/external_raw_contact_editor_view.xml b/res/layout/external_raw_contact_editor_view.xml
index 661371d..6f39b34 100644
--- a/res/layout/external_raw_contact_editor_view.xml
+++ b/res/layout/external_raw_contact_editor_view.xml
@@ -19,90 +19,54 @@
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:orientation="horizontal"
-    android:paddingBottom="10dip">
+    android:orientation="vertical">
 
-    <!-- Left side color bar -->
-    <ImageView
-        android:id="@+id/color_bar"
-        android:layout_width="4dip"
-        android:layout_height="match_parent"
-        android:visibility="gone"/>
+    <include
+        layout="@layout/editor_account_header" />
 
-    <!-- The content -->
     <LinearLayout
-        android:layout_width="0dip"
         android:layout_height="wrap_content"
-        android:layout_weight="1"
-        android:orientation="vertical">
+        android:layout_width="match_parent"
+        android:orientation="horizontal"
+        android:paddingLeft="16dip"
+        android:paddingRight="16dip">
 
-        <!-- Account info header -->
-        <ImageView android:id="@+id/header_color_bar"
-            android:layout_width="match_parent"
-            android:layout_height="4dip"
-            android:layout_marginBottom="5dip"
-            android:background="@color/edit_divider"/>
+        <TextView android:id="@+id/read_only_name"
+            android:layout_width="0dip"
+            android:layout_height="match_parent"
+            android:layout_weight="1"
+            android:gravity="center_vertical"
+            android:singleLine="true"
+            android:ellipsize="end"
+            android:textAppearance="?android:attr/textAppearanceMedium"
+            android:textColor="?android:attr/textColorSecondary"
+            android:textStyle="bold"/>
 
-        <TextView
-            android:id="@+id/read_only_warning"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:paddingTop="10dip"
-            android:paddingLeft="10dip"
-            android:paddingRight="10dip"
-            android:textAppearance="?android:attr/textAppearanceSmall"
-            android:textColor="?android:attr/textColorTertiary"/>
+        <FrameLayout
+            android:id="@+id/stub_photo"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content">
 
-        <include
-            android:id="@+id/account_header"
-            layout="@layout/editor_account_header" />
+            <include
+                android:id="@+id/edit_photo"
+                layout="@layout/item_photo_editor" />
 
-        <LinearLayout
-            android:layout_height="wrap_content"
-            android:layout_width="match_parent"
-            android:orientation="horizontal"
-            android:paddingTop="20dip"
-            android:paddingLeft="10dip"
-            android:paddingRight="10dip">
-
-            <TextView android:id="@+id/read_only_name"
-                android:layout_width="0dip"
-                android:layout_height="match_parent"
-                android:layout_weight="1"
-                android:gravity="center_vertical"
-                android:singleLine="true"
-                android:ellipsize="end"
-                android:textAppearance="?android:attr/textAppearanceMedium"
-                android:textColor="?android:attr/textColorTertiary"
-                android:textStyle="bold"/>
-
-            <FrameLayout
-                android:id="@+id/stub_photo"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content">
-
-                <include
-                    android:id="@+id/edit_photo"
-                    layout="@layout/item_photo_editor" />
-
-            </FrameLayout>
-
-        </LinearLayout>
-
-        <Button
-            android:id="@+id/button_edit_externally"
-            android:text="@string/edit_contact"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_marginTop="13dip"
-            android:layout_marginBottom="13dip"
-            android:layout_marginLeft="13dip"/>
-
-        <LinearLayout android:id="@+id/sect_general"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:orientation="vertical"/>
+        </FrameLayout>
 
     </LinearLayout>
 
+    <Button
+        android:id="@+id/button_edit_externally"
+        android:text="@string/edit_contact"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="13dip"
+        android:layout_marginBottom="13dip"
+        android:layout_marginLeft="13dip"/>
+
+    <LinearLayout android:id="@+id/sect_general"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="vertical"/>
+
 </com.android.contacts.editor.ExternalRawContactEditorView>
diff --git a/res/layout/group_browse_list_item.xml b/res/layout/group_browse_list_item.xml
index b9b272c..6f5fcef 100644
--- a/res/layout/group_browse_list_item.xml
+++ b/res/layout/group_browse_list_item.xml
@@ -86,26 +86,22 @@
                     android:id="@+id/icon_1"
                     android:layout_width="@dimen/group_list_icon_size"
                     android:layout_height="@dimen/group_list_icon_size"
-                    android:layout_marginRight="1dip"
-                    android:src="@drawable/ic_contact_picture" />
+                    android:layout_marginRight="1dip" />
                 <ImageView
                     android:id="@+id/icon_2"
                     android:layout_width="@dimen/group_list_icon_size"
-                    android:layout_height="@dimen/group_list_icon_size"
-                    android:src="@drawable/ic_contact_picture" />
+                    android:layout_height="@dimen/group_list_icon_size" />
             </TableRow>
             <TableRow>
                 <ImageView
                     android:id="@+id/icon_3"
                     android:layout_width="@dimen/group_list_icon_size"
                     android:layout_height="@dimen/group_list_icon_size"
-                    android:layout_marginRight="1dip"
-                    android:src="@drawable/ic_contact_picture" />
+                    android:layout_marginRight="1dip" />
                 <ImageView
                     android:id="@+id/icon_4"
                     android:layout_width="@dimen/group_list_icon_size"
-                    android:layout_height="@dimen/group_list_icon_size"
-                    android:src="@drawable/ic_contact_picture" />
+                    android:layout_height="@dimen/group_list_icon_size" />
             </TableRow>
 
         </TableLayout>
diff --git a/res/layout/item_group_membership.xml b/res/layout/item_group_membership.xml
index 62d06ea..b6d11f2 100644
--- a/res/layout/item_group_membership.xml
+++ b/res/layout/item_group_membership.xml
@@ -34,6 +34,6 @@
         android:gravity="left|center_vertical"
         android:ellipsize="end"
         android:focusable="true"
-        android:paddingLeft="@dimen/editor_field_left_padding" />
+        android:paddingLeft="16dip" />
 
 </com.android.contacts.editor.GroupMembershipView>
diff --git a/res/layout/item_kind_section.xml b/res/layout/item_kind_section.xml
index 0b6017c..157ca1c 100644
--- a/res/layout/item_kind_section.xml
+++ b/res/layout/item_kind_section.xml
@@ -20,7 +20,6 @@
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:paddingBottom="@dimen/editor_field_bottom_padding"
     android:orientation="vertical">
 
     <include
diff --git a/res/layout/item_photo_editor.xml b/res/layout/item_photo_editor.xml
index 3590963..2e73cb2 100644
--- a/res/layout/item_photo_editor.xml
+++ b/res/layout/item_photo_editor.xml
@@ -36,6 +36,6 @@
         android:clickable="true"
         android:focusable="true"
         android:contentDescription="@string/description_contact_photo"
-        android:background="@drawable/change_photo_box_holo_light"
+        android:background="?android:attr/selectableItemBackground"
     />
 </view>
diff --git a/res/layout/item_read_only_field.xml b/res/layout/item_read_only_field.xml
index 9e0967e..03778cc 100644
--- a/res/layout/item_read_only_field.xml
+++ b/res/layout/item_read_only_field.xml
@@ -16,37 +16,20 @@
 
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
-    android:layout_height="?android:attr/listPreferredItemHeight"
+    android:layout_height="wrap_content"
+    android:orientation="vertical">
 
-    android:orientation="vertical"
->
-
-    <TextView android:id="@+id/label"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginLeft="10dip"
-        android:layout_marginTop="2dip"
-
-        android:textAppearance="?android:attr/textAppearanceLarge"
-        android:singleLine="true"
-    />
+    <include
+        android:id="@+id/kind_title_layout"
+        layout="@layout/edit_kind_title" />
 
     <TextView android:id="@+id/data"
         android:layout_width="wrap_content"
         android:layout_height="0px"
         android:layout_weight="1"
-        android:layout_marginLeft="10dip"
-        android:layout_marginBottom="4dip"
-
+        android:layout_marginLeft="16dip"
         android:textAppearance="?android:attr/textAppearanceMedium"
-        android:singleLine="true"
-    />
-
-    <View
-        android:layout_width="match_parent"
-        android:layout_height="1px"
-
-        android:background="?android:attr/listDivider"
-    />
+        android:textColor="?android:attr/textColorSecondary"
+        android:singleLine="true"/>
 
 </LinearLayout>
\ No newline at end of file
diff --git a/res/layout/organization_editor_view_switcher.xml b/res/layout/organization_editor_view_switcher.xml
index c6e16ae..fb21626 100644
--- a/res/layout/organization_editor_view_switcher.xml
+++ b/res/layout/organization_editor_view_switcher.xml
@@ -23,19 +23,22 @@
 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:paddingLeft="@dimen/editor_field_left_padding"
-    android:paddingRight="@dimen/editor_field_right_padding"
+    android:minHeight="48dip"
     android:background="?android:attr/selectableItemBackground">
 
     <TextView
         android:id="@+id/add_organization_button"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:paddingLeft="@dimen/editor_field_left_padding"
+        android:paddingLeft="16dip"
+        android:paddingRight="16dip"
+        android:layout_gravity="center_vertical"
+        android:duplicateParentState="true"
         android:textAppearance="?android:attr/textAppearanceMedium"
-        android:text="@string/organizationLabelsGroup"
-        android:duplicateParentState="true"/>
+        android:textColor="?android:attr/textColorSecondary"
+        android:text="@string/add_organization"/>
 
+    <!-- This is later populated with the actual editable text fields for "organization" -->
     <FrameLayout
         android:id="@+id/container"
         android:layout_width="match_parent"
diff --git a/res/layout/phonetic_name_editor_view.xml b/res/layout/phonetic_name_editor_view.xml
index 832ca2c..6084d3f 100644
--- a/res/layout/phonetic_name_editor_view.xml
+++ b/res/layout/phonetic_name_editor_view.xml
@@ -18,7 +18,6 @@
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:paddingBottom="@dimen/editor_field_bottom_padding"
     android:orientation="vertical">
 
     <include
@@ -29,7 +28,6 @@
     <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:layout_weight="1"
         android:orientation="horizontal"
         android:gravity="center_vertical"
         android:focusable="true"
diff --git a/res/layout/playback_layout.xml b/res/layout/playback_layout.xml
index 45e7ad9..05b3e43 100644
--- a/res/layout/playback_layout.xml
+++ b/res/layout/playback_layout.xml
@@ -77,6 +77,16 @@
                 android:layout_centerHorizontal="true"
                 android:layout_marginTop="10dip"
             />
+            <TextView
+                android:id="@+id/playback_speed_text"
+                android:layout_height="wrap_content"
+                android:layout_width="wrap_content"
+                android:textSize="14sp"
+                android:layout_alignParentTop="true"
+                android:layout_centerHorizontal="true"
+                android:layout_marginTop="10dip"
+                android:alpha="0"
+            />
             <ImageButton
                 android:id="@+id/rate_decrease_button"
                 android:src="@drawable/ic_minus_holo_dark"
diff --git a/res/layout/raw_contact_editor_view.xml b/res/layout/raw_contact_editor_view.xml
index 79183cd..b4aa766 100644
--- a/res/layout/raw_contact_editor_view.xml
+++ b/res/layout/raw_contact_editor_view.xml
@@ -20,58 +20,8 @@
     android:layout_height="wrap_content"
     android:orientation="vertical">
 
-    <LinearLayout
-        android:id="@+id/anchor_for_account_switcher"
-        android:layout_height="wrap_content"
-        android:layout_width="match_parent"
-        android:padding="@dimen/account_header_padding"
-        android:orientation="horizontal">
-
-        <!--
-          TODO: Make this "?android:attr/spinnerStyle" but disable the style if this is not a new
-          contact. Since styles aren't easily toggled dynamically, it's easier to just create a
-          drawable with the spinner triangle as a background asset and just toggle the background.
-        -->
-        <LinearLayout
-            android:id="@+id/account"
-            android:layout_height="wrap_content"
-            android:layout_width="0dip"
-            android:layout_weight="1"
-            android:orientation="vertical"
-            android:background="?android:attr/selectableItemBackground">
-
-            <TextView
-                android:id="@+id/account_type"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:textAppearance="?android:attr/textAppearanceMedium"
-                android:singleLine="true" />
-
-            <TextView
-                 android:id="@+id/account_name"
-                 android:layout_width="wrap_content"
-                 android:layout_height="wrap_content"
-                 android:textAppearance="?android:attr/textAppearanceSmall"
-                 android:textColor="?android:attr/textColorTertiary"
-                 android:singleLine="true" />
-
-        </LinearLayout>
-
-        <FrameLayout
-            android:layout_width="wrap_content"
-            android:layout_height="match_parent">
-
-            <ImageView
-                 android:id="@+id/account_icon"
-                 android:layout_width="32dip"
-                 android:layout_height="32dip"
-                 android:layout_marginLeft="24dip"
-                 android:layout_marginRight="24dip"
-                 android:layout_gravity="center_vertical" />
-
-        </FrameLayout>
-
-    </LinearLayout>
+    <include
+        layout="@layout/editor_account_header" />
 
     <LinearLayout
         android:id="@+id/body"
@@ -82,18 +32,30 @@
         <LinearLayout
             android:layout_height="wrap_content"
             android:layout_width="match_parent"
-            android:layout_marginRight="4dip"
-            android:orientation="horizontal">
+            android:orientation="horizontal"
+            android:paddingTop="8dip">
 
-            <include
-                android:id="@+id/edit_name"
-                layout="@layout/structured_name_editor_view" />
+            <LinearLayout
+                android:layout_height="wrap_content"
+                android:layout_width="0dip"
+                android:layout_weight="1"
+                android:orientation="vertical">
+
+                <include
+                    android:id="@+id/edit_name"
+                    layout="@layout/structured_name_editor_view" />
+
+                <include
+                    android:id="@+id/edit_phonetic_name"
+                    layout="@layout/phonetic_name_editor_view" />
+
+            </LinearLayout>
 
             <FrameLayout
                 android:id="@+id/stub_photo"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:layout_marginRight="16dip">
+                android:layout_marginRight="8dip">
 
                 <include
                     android:id="@+id/edit_photo"
@@ -103,10 +65,6 @@
 
         </LinearLayout>
 
-        <include
-            android:id="@+id/edit_phonetic_name"
-            layout="@layout/phonetic_name_editor_view" />
-
         <ViewStub android:id="@+id/aggregation_suggestion_stub"
             android:inflatedId="@+id/aggregation_suggestion"
             android:layout="@layout/aggregation_suggestions"
@@ -126,8 +84,8 @@
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_gravity="center"
-            android:layout_marginTop="10dip"
-            android:layout_marginBottom="10dip"/>
+            android:layout_marginTop="16dip"
+            android:layout_marginBottom="32dip"/>
 
     </LinearLayout>
 </com.android.contacts.editor.RawContactEditorView>
diff --git a/res/layout/structured_name_editor_view.xml b/res/layout/structured_name_editor_view.xml
index 3a66d5e..979a0f3 100644
--- a/res/layout/structured_name_editor_view.xml
+++ b/res/layout/structured_name_editor_view.xml
@@ -16,9 +16,8 @@
 
 <com.android.contacts.editor.StructuredNameEditorView
     xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="0dip"
+    android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:layout_weight="1"
     android:orientation="vertical">
 
     <include
@@ -29,7 +28,6 @@
     <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:layout_weight="1"
         android:orientation="horizontal"
         android:focusable="true"
         android:clickable="true">
diff --git a/res/layout/text_fields_editor_view.xml b/res/layout/text_fields_editor_view.xml
index c8d35a4..89970c6 100644
--- a/res/layout/text_fields_editor_view.xml
+++ b/res/layout/text_fields_editor_view.xml
@@ -34,13 +34,13 @@
             layout="@layout/edit_field_list" />
 
         <include
-            android:id="@+id/spinner"
-            layout="@layout/edit_spinner"
+            android:id="@+id/expansion_view_container"
+            layout="@layout/edit_expansion_view"
             android:visibility="gone" />
 
         <include
-            android:id="@+id/expansion_view_container"
-            layout="@layout/edit_expansion_view"
+            android:id="@+id/spinner"
+            layout="@layout/edit_spinner"
             android:visibility="gone" />
 
         <include
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index 02246ea..577e933 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -16,7 +16,6 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="sharedUserLabel" msgid="7965035505237135241">"Android-kernprogramme"</string>
     <string name="launcherDialer" msgid="8636288196618486553">"Foon"</string>
     <!-- no translation found for people (1048457247435785074) -->
     <skip />
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index a439aa3..f9e98ec 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -16,7 +16,6 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="sharedUserLabel" msgid="7965035505237135241">"Android ኮር ትግበራ"</string>
     <string name="launcherDialer" msgid="8636288196618486553">"ስልክ"</string>
     <!-- no translation found for people (1048457247435785074) -->
     <skip />
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index 7e8bd7c..3c690ec 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -16,7 +16,6 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="sharedUserLabel" msgid="7965035505237135241">"تطبيقات Android المركزية"</string>
     <string name="launcherDialer" msgid="8636288196618486553">"الهاتف"</string>
     <string name="people" msgid="1048457247435785074">"أشخاص"</string>
     <string name="contactsList" msgid="8661624236494819731">"جهات الاتصال"</string>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index 445d4bf..98ca370 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -16,7 +16,6 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="sharedUserLabel" msgid="7965035505237135241">"Основни приложения на Android"</string>
     <string name="launcherDialer" msgid="8636288196618486553">"Телефон"</string>
     <string name="people" msgid="1048457247435785074">"Хора"</string>
     <string name="contactsList" msgid="8661624236494819731">"Контакти"</string>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index 87179d8..6bd1768 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -16,7 +16,6 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="sharedUserLabel" msgid="7965035505237135241">"Aplicacions bàsiques d\'Android"</string>
     <string name="launcherDialer" msgid="8636288196618486553">"Telèfon"</string>
     <string name="people" msgid="1048457247435785074">"Persones"</string>
     <string name="contactsList" msgid="8661624236494819731">"Contactes"</string>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index 097b093..a949e4c 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -16,7 +16,6 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="sharedUserLabel" msgid="7965035505237135241">"Android Core Apps"</string>
     <string name="launcherDialer" msgid="8636288196618486553">"Telefon"</string>
     <string name="people" msgid="1048457247435785074">"Lidé"</string>
     <string name="contactsList" msgid="8661624236494819731">"Kontakty"</string>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index d7c9249..c7bba00 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -16,7 +16,6 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="sharedUserLabel" msgid="7965035505237135241">"Android-kerneprogrammer"</string>
     <string name="launcherDialer" msgid="8636288196618486553">"Telefon"</string>
     <string name="people" msgid="1048457247435785074">"Personer"</string>
     <string name="contactsList" msgid="8661624236494819731">"Kontakter"</string>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 4a580a9..5bc6fdc 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -16,7 +16,6 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="sharedUserLabel" msgid="7965035505237135241">"Android Core Apps"</string>
     <string name="launcherDialer" msgid="8636288196618486553">"Telefon"</string>
     <string name="people" msgid="1048457247435785074">"Kontakte"</string>
     <string name="contactsList" msgid="8661624236494819731">"Kontakte"</string>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index 6a1d856..7c7f619 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -16,7 +16,6 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="sharedUserLabel" msgid="7965035505237135241">"Βασικές εφαρμογές Android"</string>
     <string name="launcherDialer" msgid="8636288196618486553">"Τηλέφωνο"</string>
     <string name="people" msgid="1048457247435785074">"Άτομα"</string>
     <string name="contactsList" msgid="8661624236494819731">"Επαφές"</string>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index 6e0d9b6..c0452c4 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -16,7 +16,6 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="sharedUserLabel" msgid="7965035505237135241">"Android Core Apps"</string>
     <string name="launcherDialer" msgid="8636288196618486553">"Phone"</string>
     <string name="people" msgid="1048457247435785074">"People"</string>
     <string name="contactsList" msgid="8661624236494819731">"Contacts"</string>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index 121d64e..61c39cd 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -16,7 +16,6 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="sharedUserLabel" msgid="7965035505237135241">"Aplicaciones del núcleo de Android"</string>
     <string name="launcherDialer" msgid="8636288196618486553">"Teléfono"</string>
     <string name="people" msgid="1048457247435785074">"Personas"</string>
     <string name="contactsList" msgid="8661624236494819731">"Contactos"</string>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index 9ff7139..cc10d1e 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -16,7 +16,6 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="sharedUserLabel" msgid="7965035505237135241">"Aplicaciones básicas"</string>
     <string name="launcherDialer" msgid="8636288196618486553">"Teléfono"</string>
     <string name="people" msgid="1048457247435785074">"Contactos"</string>
     <string name="contactsList" msgid="8661624236494819731">"Contactos"</string>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index d498cb6..da4b404 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -16,7 +16,6 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="sharedUserLabel" msgid="7965035505237135241">"برنامه های Android Core"</string>
     <string name="launcherDialer" msgid="8636288196618486553">"تلفن"</string>
     <string name="people" msgid="1048457247435785074">"افراد"</string>
     <string name="contactsList" msgid="8661624236494819731">"مخاطبین"</string>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index bfd0fc2..899e394 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -16,7 +16,6 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="sharedUserLabel" msgid="7965035505237135241">"Androidin ydinsovellukset"</string>
     <string name="launcherDialer" msgid="8636288196618486553">"Puhelin"</string>
     <string name="people" msgid="1048457247435785074">"Henkilöt"</string>
     <string name="contactsList" msgid="8661624236494819731">"Yhteystiedot"</string>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index e77604d..ae55c7a 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -16,7 +16,6 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="sharedUserLabel" msgid="7965035505237135241">"Applications de base Android"</string>
     <string name="launcherDialer" msgid="8636288196618486553">"Téléphone"</string>
     <string name="people" msgid="1048457247435785074">"Contacts"</string>
     <string name="contactsList" msgid="8661624236494819731">"Contacts"</string>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index 0880d6a..8c170d9 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -16,7 +16,6 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="sharedUserLabel" msgid="7965035505237135241">"Matične aplikacije za Android"</string>
     <string name="launcherDialer" msgid="8636288196618486553">"Telefon"</string>
     <string name="people" msgid="1048457247435785074">"Osobe"</string>
     <string name="contactsList" msgid="8661624236494819731">"Kontakti"</string>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index 822e926..600e893 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -16,7 +16,6 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="sharedUserLabel" msgid="7965035505237135241">"Alap Android-alkalmazások"</string>
     <string name="launcherDialer" msgid="8636288196618486553">"Telefon"</string>
     <string name="people" msgid="1048457247435785074">"Személyek"</string>
     <string name="contactsList" msgid="8661624236494819731">"Címtár"</string>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index 46f2939..9d9683c 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -16,7 +16,6 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="sharedUserLabel" msgid="7965035505237135241">"Aplikasi Inti Android"</string>
     <string name="launcherDialer" msgid="8636288196618486553">"Telepon"</string>
     <string name="people" msgid="1048457247435785074">"Orang"</string>
     <string name="contactsList" msgid="8661624236494819731">"Kenalan"</string>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 5ed9401..bcb810a 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -16,7 +16,6 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="sharedUserLabel" msgid="7965035505237135241">"Android Core Apps"</string>
     <string name="launcherDialer" msgid="8636288196618486553">"Telefono"</string>
     <string name="people" msgid="1048457247435785074">"Persone"</string>
     <string name="contactsList" msgid="8661624236494819731">"Contatti"</string>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index e4d9610..3889f14 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -16,7 +16,6 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="sharedUserLabel" msgid="7965035505237135241">"Android Core Apps"</string>
     <string name="launcherDialer" msgid="8636288196618486553">"טלפון"</string>
     <string name="people" msgid="1048457247435785074">"אנשים"</string>
     <string name="contactsList" msgid="8661624236494819731">"אנשי קשר"</string>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index c809e43..0c372cd 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -16,7 +16,6 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="sharedUserLabel" msgid="7965035505237135241">"Android Core Apps"</string>
     <string name="launcherDialer" msgid="8636288196618486553">"電話"</string>
     <string name="people" msgid="1048457247435785074">"ユーザー"</string>
     <string name="contactsList" msgid="8661624236494819731">"連絡先"</string>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index dfabf75..ebdea4a 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -16,7 +16,6 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="sharedUserLabel" msgid="7965035505237135241">"Android Core 애플리케이션"</string>
     <string name="launcherDialer" msgid="8636288196618486553">"휴대전화"</string>
     <string name="people" msgid="1048457247435785074">"인물"</string>
     <string name="contactsList" msgid="8661624236494819731">"주소록"</string>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index 626e9de..0bad711 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -16,7 +16,6 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="sharedUserLabel" msgid="7965035505237135241">"Pagrindinės „Android“ programos"</string>
     <string name="launcherDialer" msgid="8636288196618486553">"Telefonas"</string>
     <string name="people" msgid="1048457247435785074">"Žmonės"</string>
     <string name="contactsList" msgid="8661624236494819731">"Adresinė"</string>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index 8132389..d6bdd52 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -16,7 +16,6 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="sharedUserLabel" msgid="7965035505237135241">"Android Core Apps"</string>
     <string name="launcherDialer" msgid="8636288196618486553">"Tālrunis"</string>
     <string name="people" msgid="1048457247435785074">"People"</string>
     <string name="contactsList" msgid="8661624236494819731">"Kontaktpersonas"</string>
diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml
index ecac3ec..1508a1a 100644
--- a/res/values-ms/strings.xml
+++ b/res/values-ms/strings.xml
@@ -16,7 +16,6 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="sharedUserLabel" msgid="7965035505237135241">"Apl Teras Android"</string>
     <string name="launcherDialer" msgid="8636288196618486553">"Telefon"</string>
     <string name="people" msgid="1048457247435785074">"Orang"</string>
     <string name="contactsList" msgid="8661624236494819731">"Kenalan"</string>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 6c23418..9fc6205 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -16,7 +16,6 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="sharedUserLabel" msgid="7965035505237135241">"Kjerneprogrammer for Android"</string>
     <string name="launcherDialer" msgid="8636288196618486553">"Telefon"</string>
     <string name="people" msgid="1048457247435785074">"Personer"</string>
     <string name="contactsList" msgid="8661624236494819731">"Kontakter"</string>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index be644e3..8222c2d 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -16,7 +16,6 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="sharedUserLabel" msgid="7965035505237135241">"Android-kerntoepassingen"</string>
     <string name="launcherDialer" msgid="8636288196618486553">"Telefoon"</string>
     <string name="people" msgid="1048457247435785074">"Personen"</string>
     <string name="contactsList" msgid="8661624236494819731">"Contacten"</string>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 665ab3e..ffaa9a6 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -16,7 +16,6 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="sharedUserLabel" msgid="7965035505237135241">"Aplikacje główne systemu Android"</string>
     <string name="launcherDialer" msgid="8636288196618486553">"Telefon"</string>
     <string name="people" msgid="1048457247435785074">"Osoby"</string>
     <string name="contactsList" msgid="8661624236494819731">"Kontakty"</string>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index 342b8e2..6a71e93 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -16,7 +16,6 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="sharedUserLabel" msgid="7965035505237135241">"Principais aplicativos do Android"</string>
     <string name="launcherDialer" msgid="8636288196618486553">"Telefone"</string>
     <string name="people" msgid="1048457247435785074">"Pessoas"</string>
     <string name="contactsList" msgid="8661624236494819731">"Contatos"</string>
diff --git a/res/values-rm/strings.xml b/res/values-rm/strings.xml
index 52f907a..477c4de 100644
--- a/res/values-rm/strings.xml
+++ b/res/values-rm/strings.xml
@@ -16,7 +16,6 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="sharedUserLabel" msgid="7965035505237135241">"Applicaziuns da basa dad Android"</string>
     <string name="launcherDialer" msgid="8636288196618486553">"Telefon"</string>
     <!-- no translation found for people (1048457247435785074) -->
     <skip />
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index 8c00e5d..a7da905 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -16,7 +16,6 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="sharedUserLabel" msgid="7965035505237135241">"Android Core Apps"</string>
     <string name="launcherDialer" msgid="8636288196618486553">"Telefon"</string>
     <string name="people" msgid="1048457247435785074">"Persoane"</string>
     <string name="contactsList" msgid="8661624236494819731">"Agendă"</string>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 90184f7..e590dc3 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -16,7 +16,6 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="sharedUserLabel" msgid="7965035505237135241">"Основные приложения Android"</string>
     <string name="launcherDialer" msgid="8636288196618486553">"Телефон"</string>
     <string name="people" msgid="1048457247435785074">"Люди"</string>
     <string name="contactsList" msgid="8661624236494819731">"Контакты"</string>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index 29cfafa..4deca50 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -16,7 +16,6 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="sharedUserLabel" msgid="7965035505237135241">"Android Core Apps"</string>
     <string name="launcherDialer" msgid="8636288196618486553">"Telefón"</string>
     <string name="people" msgid="1048457247435785074">"Ľudia"</string>
     <string name="contactsList" msgid="8661624236494819731">"Kontakty"</string>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index 174601f..2de3255 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -16,7 +16,6 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="sharedUserLabel" msgid="7965035505237135241">"Osnovni programi Android"</string>
     <string name="launcherDialer" msgid="8636288196618486553">"Telefon"</string>
     <string name="people" msgid="1048457247435785074">"Ljudje"</string>
     <string name="contactsList" msgid="8661624236494819731">"Stiki"</string>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index 0d9f415..74efc4a 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -16,7 +16,6 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="sharedUserLabel" msgid="7965035505237135241">"Android Core апликације"</string>
     <string name="launcherDialer" msgid="8636288196618486553">"Телефон"</string>
     <string name="people" msgid="1048457247435785074">"Особе"</string>
     <string name="contactsList" msgid="8661624236494819731">"Контакти"</string>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index 1bbc85e..e04ac17 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -16,7 +16,6 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="sharedUserLabel" msgid="7965035505237135241">"Android Core Apps"</string>
     <string name="launcherDialer" msgid="8636288196618486553">"Telefon"</string>
     <string name="people" msgid="1048457247435785074">"Personer"</string>
     <string name="contactsList" msgid="8661624236494819731">"Kontakter"</string>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index ddb776c..5506f31 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -16,7 +16,6 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="sharedUserLabel" msgid="7965035505237135241">"Programu Msingi za Android"</string>
     <string name="launcherDialer" msgid="8636288196618486553">"Simu"</string>
     <!-- no translation found for people (1048457247435785074) -->
     <skip />
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index 14035ff..690e42e 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -16,7 +16,6 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="sharedUserLabel" msgid="7965035505237135241">"แอปพลิเคชันหลักของ Android"</string>
     <string name="launcherDialer" msgid="8636288196618486553">"โทรศัพท์"</string>
     <string name="people" msgid="1048457247435785074">"บุคคล"</string>
     <string name="contactsList" msgid="8661624236494819731">"รายชื่อในสมุดโทรศัพท์"</string>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index 2f65b74..46b1d1d 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -16,7 +16,6 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="sharedUserLabel" msgid="7965035505237135241">"Android Core Apps"</string>
     <string name="launcherDialer" msgid="8636288196618486553">"Telepono"</string>
     <string name="people" msgid="1048457247435785074">"Mga Tao"</string>
     <string name="contactsList" msgid="8661624236494819731">"Mga Contact"</string>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index 29b3107..7e3e623 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -16,7 +16,6 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="sharedUserLabel" msgid="7965035505237135241">"Android Core Apps"</string>
     <string name="launcherDialer" msgid="8636288196618486553">"Telefon"</string>
     <string name="people" msgid="1048457247435785074">"Kişiler"</string>
     <string name="contactsList" msgid="8661624236494819731">"Kişiler"</string>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index 1a90340..01b4919 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -16,7 +16,6 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="sharedUserLabel" msgid="7965035505237135241">"Служби Android Core"</string>
     <string name="launcherDialer" msgid="8636288196618486553">"Телеф."</string>
     <string name="people" msgid="1048457247435785074">"Люди"</string>
     <string name="contactsList" msgid="8661624236494819731">"Контакти"</string>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index 63e83fc..92a8a97 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -16,7 +16,6 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="sharedUserLabel" msgid="7965035505237135241">"Ứng dụng Lõi Android"</string>
     <string name="launcherDialer" msgid="8636288196618486553">"Điện thoại"</string>
     <string name="people" msgid="1048457247435785074">"Mọi người"</string>
     <string name="contactsList" msgid="8661624236494819731">"Danh bạ"</string>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index ef0b222..c496165 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -16,7 +16,6 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="sharedUserLabel" msgid="7965035505237135241">"Android 核心应用程序"</string>
     <string name="launcherDialer" msgid="8636288196618486553">"拨号"</string>
     <string name="people" msgid="1048457247435785074">"用户"</string>
     <string name="contactsList" msgid="8661624236494819731">"通讯录"</string>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index 92aeef5..e13e5b6 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -16,7 +16,6 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="sharedUserLabel" msgid="7965035505237135241">"Android 核心應用程式"</string>
     <string name="launcherDialer" msgid="8636288196618486553">"電話"</string>
     <string name="people" msgid="1048457247435785074">"使用者"</string>
     <string name="contactsList" msgid="8661624236494819731">"聯絡人"</string>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index 9bb4ff8..b369466 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -16,7 +16,6 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="sharedUserLabel" msgid="7965035505237135241">"Izinhlelo Zokusebenza ze-Android Core"</string>
     <string name="launcherDialer" msgid="8636288196618486553">"Ifoni"</string>
     <!-- no translation found for people (1048457247435785074) -->
     <skip />
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index a4a6112..ae2bed5 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -25,7 +25,6 @@
 
     <dimen name="aggregation_suggestion_icon_size">40dip</dimen>
 
-    <dimen name="account_header_padding">10dip</dimen>
     <dimen name="account_selector_popup_width">400dip</dimen>
 
     <dimen name="photo_action_popup_width">400dip</dimen>
@@ -37,17 +36,17 @@
     <!-- Padding of the rounded plus/minus/expand/collapse buttons in the editor  -->
     <dimen name="editor_round_button_padding_left">2dip</dimen>
     <dimen name="editor_round_button_padding_right">2dip</dimen>
-    <dimen name="editor_round_button_padding_top">8dip</dimen>
-    <dimen name="editor_round_button_padding_bottom">8dip</dimen>
+    <dimen name="editor_round_button_padding_top">4dip</dimen>
+    <dimen name="editor_round_button_padding_bottom">4dip</dimen>
 
     <!-- Width of the Type-Label in the Editor -->
     <dimen name="editor_type_label_width">100dip</dimen>
 
     <!-- Left padding of a field in the Editor -->
-    <dimen name="editor_field_left_padding">5dip</dimen>
+    <dimen name="editor_field_left_padding">4dip</dimen>
 
     <!-- Right padding of a field in the Editor -->
-    <dimen name="editor_field_right_padding">5dip</dimen>
+    <dimen name="editor_field_right_padding">4dip</dimen>
 
     <!-- Top padding of a field in the Editor -->
     <dimen name="editor_field_top_padding">10dip</dimen>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 5bb6c2b..0c9893b 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -14,10 +14,6 @@
      limitations under the License.
 -->
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- Label for this app's shared user ID (and thus for all other
-         apps sharing the uid). -->
-    <string name="sharedUserLabel">Android Core Apps</string>
-
     <!-- Title for the activity that dials the phone.  This is the name
          used in the Launcher icon. -->
     <string name="launcherDialer">Phone</string>
@@ -1292,8 +1288,8 @@
     <!-- Checkbox asking the user if they want to display a particular photo for a contact -->
     <string name="use_photo_as_primary">Use this photo</string>
 
-    <!-- Text used to explain that a contact cannot be edited since the data is read only [CHAR LIMIT=40] -->
-    <string name="contact_read_only">Not editable on this device</string>
+    <!-- Text used to explain that a contact cannot be edited from the People application since the data is read only [CHAR LIMIT=40] -->
+    <string name="contact_read_only">Not editable from this application</string>
 
     <!-- Text describing that a contact has no information available other than name and photo -->
     <string name="no_contact_details">No additional information for this contact</string>
@@ -1386,6 +1382,9 @@
     <!-- The button to add another entry of a specific data type (i.e. email, phone, address) to a contact in the Raw Contact Editor [CHAR LIMIT=22] -->
     <string name="add_new_entry_for_section">Add new</string>
 
+    <!-- The button to add an organization field to a contact in the Raw Contact Editor [CHAR LIMIT=22] -->
+    <string name="add_organization">Add organization</string>
+
     <!-- Attbution of a contact status update, when the time of update is unknown -->
     <string name="contact_status_update_attribution">via <xliff:g id="source" example="Google Talk">%1$s</xliff:g></string>
 
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 49e640a..f8c1931 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -79,9 +79,12 @@
         <item name="android:textColorPrimary">@color/primary_text_color</item>
         <item name="android:textColorSecondary">@color/secondary_text_color</item>
     </style>
-    <style name="ContactEditorActivityTheme" parent="@android:style/Theme.Holo.Light.DarkActionBar">
+
+    <style name="EditorActivityTheme" parent="@android:style/Theme.Holo.Light.DarkActionBar">
         <item name="android:actionBarStyle">@style/ContactsActionBarStyle</item>
         <item name="android:windowContentOverlay">@null</item>
+        <item name="android:textColorPrimary">@color/primary_text_color</item>
+        <item name="android:textColorSecondary">@color/secondary_text_color</item>
     </style>
 
     <style name="BackgroundOnly">
diff --git a/src/com/android/contacts/ContactPhotoManager.java b/src/com/android/contacts/ContactPhotoManager.java
index d8f4e65..0f7065d 100644
--- a/src/com/android/contacts/ContactPhotoManager.java
+++ b/src/com/android/contacts/ContactPhotoManager.java
@@ -97,6 +97,12 @@
     public abstract void loadPhoto(ImageView view, Uri photoUri);
 
     /**
+     * Remove photo from the supplied image view. This also cancels current pending load request
+     * inside this photo manager.
+     */
+    public abstract void removePhoto(ImageView view);
+
+    /**
      * Temporarily stops loading photos from the database.
      */
     public abstract void pause();
@@ -261,6 +267,12 @@
     }
 
     @Override
+    public void removePhoto(ImageView view) {
+        view.setImageDrawable(null);
+        mPendingRequests.remove(view);
+    }
+
+    @Override
     public void refreshCache() {
         for (BitmapHolder holder : mBitmapHolderCache.snapshot().values()) {
             holder.fresh = false;
diff --git a/src/com/android/contacts/activities/ContactDetailActivity.java b/src/com/android/contacts/activities/ContactDetailActivity.java
index 53c7f5e..3cd07ca 100644
--- a/src/com/android/contacts/activities/ContactDetailActivity.java
+++ b/src/com/android/contacts/activities/ContactDetailActivity.java
@@ -28,6 +28,7 @@
 import com.android.contacts.detail.ContactDetailViewPagerAdapter;
 import com.android.contacts.detail.ContactLoaderFragment;
 import com.android.contacts.detail.ContactLoaderFragment.ContactLoaderFragmentListener;
+import com.android.contacts.detail.TabCarouselScrollManager;
 import com.android.contacts.interactions.ContactDeletionInteraction;
 import com.android.contacts.model.AccountWithDataSet;
 import com.android.contacts.util.PhoneCapabilityTester;
@@ -55,8 +56,6 @@
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.view.ViewGroup;
-import android.widget.AbsListView;
-import android.widget.AbsListView.OnScrollListener;
 import android.widget.CheckBox;
 import android.widget.Toast;
 
@@ -153,8 +152,7 @@
         }
 
         mDetailFragment.setListener(mFragmentListener);
-        mDetailFragment.setVerticalScrollListener(mVerticalScrollListener);
-        mUpdatesFragment.setVerticalScrollListener(mVerticalScrollListener);
+        TabCarouselScrollManager.bind(mTabCarousel, mDetailFragment, mUpdatesFragment);
         mDetailFragment.setData(mLookupUri, mContactData);
         mUpdatesFragment.setData(mLookupUri, mContactData);
 
@@ -435,6 +433,7 @@
             mRootView.addView(mContentView);
             mDetailFragment = (ContactDetailFragment) getFragmentManager().findFragmentById(
                     R.id.contact_detail_fragment);
+            mDetailFragment.setListener(mFragmentListener);
         }
         // Reset contact data
         if (mDetailFragment != null) {
@@ -555,34 +554,6 @@
         }
     };
 
-    private OnScrollListener mVerticalScrollListener = new OnScrollListener() {
-
-        @Override
-        public void onScroll(
-                AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
-            if (mTabCarousel == null) {
-                return;
-            }
-            // If the FIRST item is not visible on the screen, then the carousel must be pinned
-            // at the top of the screen.
-            if (firstVisibleItem != 0) {
-                mTabCarousel.setY(-mTabCarousel.getAllowedVerticalScrollLength());
-                return;
-            }
-            View topView = view.getChildAt(firstVisibleItem);
-            if (topView == null) {
-                return;
-            }
-            int amtToScroll = Math.max((int) view.getChildAt(firstVisibleItem).getY(),
-                    - mTabCarousel.getAllowedVerticalScrollLength());
-            mTabCarousel.setY(amtToScroll);
-        }
-
-        @Override
-        public void onScrollStateChanged(AbsListView view, int scrollState) {}
-
-    };
-
     /**
      * This interface should be implemented by {@link Fragment}s within this
      * activity so that the activity can determine whether the currently
diff --git a/src/com/android/contacts/calllog/CallLogFragment.java b/src/com/android/contacts/calllog/CallLogFragment.java
index ae70c0b..c2c7c12 100644
--- a/src/com/android/contacts/calllog/CallLogFragment.java
+++ b/src/com/android/contacts/calllog/CallLogFragment.java
@@ -163,7 +163,6 @@
     private CallLogAdapter mAdapter;
     private CallLogQueryHandler mCallLogQueryHandler;
     private String mVoiceMailNumber;
-    private String mCurrentCountryIso;
     private boolean mScrollToTop;
 
     private boolean mShowOptionsMenu;
@@ -228,11 +227,15 @@
     }
 
     /** Adapter class to fill in data for the Call Log */
-    public final class CallLogAdapter extends GroupingListAdapter
+    public static final class CallLogAdapter extends GroupingListAdapter
             implements Runnable, ViewTreeObserver.OnPreDrawListener, GroupCreator {
         /** The time in millis to delay starting the thread processing requests. */
         private static final int START_PROCESSING_REQUESTS_DELAY_MILLIS = 1000;
 
+        private final Context mContext;
+        private final String mCurrentCountryIso;
+        private final CallLogQueryHandler mCallLogQueryHandler;
+
         /**
          * A cache of the contact details for the phone numbers in the call log.
          * <p>
@@ -275,7 +278,7 @@
             public void onClick(View view) {
                 IntentProvider intentProvider = (IntentProvider) view.getTag();
                 if (intentProvider != null) {
-                    startActivity(intentProvider.getIntent(CallLogFragment.this.getActivity()));
+                    mContext.startActivity(intentProvider.getIntent(mContext));
                 }
             }
         };
@@ -304,18 +307,23 @@
             }
         };
 
-        public CallLogAdapter() {
-            super(getActivity());
+        public CallLogAdapter(Context context, CallLogQueryHandler callLogQueryHandler,
+                String currentCountryIso, String voicemailNumber) {
+            super(context);
+
+            mContext = context;
+            mCurrentCountryIso = currentCountryIso;
+            mCallLogQueryHandler = callLogQueryHandler;
 
             mContactInfoCache = ExpirableCache.create(CONTACT_INFO_CACHE_SIZE);
             mRequests = new LinkedList<String>();
             mPreDrawListener = null;
 
-            Resources resources = getResources();
+            Resources resources = mContext.getResources();
             CallTypeHelper callTypeHelper = new CallTypeHelper(resources);
 
-            mContactPhotoManager = ContactPhotoManager.getInstance(getActivity());
-            mPhoneNumberHelper = new PhoneNumberHelper(getResources(), mVoiceMailNumber);
+            mContactPhotoManager = ContactPhotoManager.getInstance(mContext);
+            mPhoneNumberHelper = new PhoneNumberHelper(resources, voicemailNumber);
             PhoneCallDetailsHelper phoneCallDetailsHelper = new PhoneCallDetailsHelper(
                     resources, callTypeHelper, mPhoneNumberHelper);
             mCallLogViewsHelper =
@@ -329,7 +337,8 @@
         @Override
         protected void onContentChanged() {
             // Start async requery
-            startCallsQuery();
+            setLoading(true);
+            mCallLogQueryHandler.fetchAllCalls();
         }
 
         void setLoading(boolean loading) {
@@ -427,7 +436,7 @@
             String[] selectionArgs = new String[] { sipAddress.toUpperCase() };
 
             Cursor dataTableCursor =
-                    getActivity().getContentResolver().query(
+                    mContext.getContentResolver().query(
                             contactRef,
                             null,  // projection
                             selection,  // selection
@@ -492,7 +501,7 @@
             // "number" is a regular phone number, so use the
             // PhoneLookup table:
             Cursor phonesCursor =
-                    getActivity().getContentResolver().query(
+                    mContext.getContentResolver().query(
                         Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI,
                                 Uri.encode(number)),
                                 PhoneQuery._PROJECTION, null, null, null);
@@ -824,6 +833,32 @@
         public void addGroup(int cursorPosition, int size, boolean expanded) {
             super.addGroup(cursorPosition, size, expanded);
         }
+
+        /**
+         * Format the given phone number
+         *
+         * @param number the number to be formatted.
+         * @param normalizedNumber the normalized number of the given number.
+         * @param countryIso the ISO 3166-1 two letters country code, the country's
+         *        convention will be used to format the number if the normalized
+         *        phone is null.
+         *
+         * @return the formatted number, or the given number if it was formatted.
+         */
+        private String formatPhoneNumber(String number, String normalizedNumber,
+                String countryIso) {
+            if (TextUtils.isEmpty(number)) {
+                return "";
+            }
+            // If "number" is really a SIP address, don't try to do any formatting at all.
+            if (PhoneNumberUtils.isUriNumber(number)) {
+                return number;
+            }
+            if (TextUtils.isEmpty(countryIso)) {
+                countryIso = mCurrentCountryIso;
+            }
+            return PhoneNumberUtils.formatNumber(number, normalizedNumber, countryIso);
+        }
     }
 
     @Override
@@ -834,8 +869,6 @@
                 Context.TELEPHONY_SERVICE)).getVoiceMailNumber();
         mCallLogQueryHandler = new CallLogQueryHandler(getActivity().getContentResolver(), this);
 
-        mCurrentCountryIso = ContactsUtils.getCurrentCountryIso(getActivity());
-
         setHasOptionsMenu(true);
     }
 
@@ -881,7 +914,9 @@
     @Override
     public void onViewCreated(View view, Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
-        mAdapter = new CallLogAdapter();
+        String currentCountryIso = ContactsUtils.getCurrentCountryIso(getActivity());
+        mAdapter = new CallLogAdapter(getActivity(), mCallLogQueryHandler, currentCountryIso,
+                getVoiceMailNumber());
         setListAdapter(mAdapter);
     }
 
@@ -941,31 +976,6 @@
         mAdapter.changeCursor(null);
     }
 
-    /**
-     * Format the given phone number
-     *
-     * @param number the number to be formatted.
-     * @param normalizedNumber the normalized number of the given number.
-     * @param countryIso the ISO 3166-1 two letters country code, the country's
-     *        convention will be used to format the number if the normalized
-     *        phone is null.
-     *
-     * @return the formatted number, or the given number if it was formatted.
-     */
-    private String formatPhoneNumber(String number, String normalizedNumber, String countryIso) {
-        if (TextUtils.isEmpty(number)) {
-            return "";
-        }
-        // If "number" is really a SIP address, don't try to do any formatting at all.
-        if (PhoneNumberUtils.isUriNumber(number)) {
-            return number;
-        }
-        if (TextUtils.isEmpty(countryIso)) {
-            countryIso = mCurrentCountryIso;
-        }
-        return PhoneNumberUtils.formatNumber(number, normalizedNumber, countryIso);
-    }
-
     private void resetNewCallsFlag() {
         mCallLogQueryHandler.markNewCallsAsOld();
     }
diff --git a/src/com/android/contacts/detail/ContactDetailDisplayUtils.java b/src/com/android/contacts/detail/ContactDetailDisplayUtils.java
index e88e5e8..0c59695 100644
--- a/src/com/android/contacts/detail/ContactDetailDisplayUtils.java
+++ b/src/com/android/contacts/detail/ContactDetailDisplayUtils.java
@@ -249,36 +249,15 @@
         }
     }
 
-    /**
-     * Displays the social stream items under the given layout.
-     */
-    public static void showSocialStreamItems(LayoutInflater inflater, Context context,
-            Result contactData, LinearLayout streamContainer, View.OnClickListener listener) {
-        if (streamContainer != null) {
-            streamContainer.removeAllViews();
-            List<StreamItemEntry> streamItems = contactData.getStreamItems();
-            for (StreamItemEntry streamItem : streamItems) {
-                addStreamItemToContainer(inflater, context, streamItem, streamContainer, listener);
-            }
-        }
-    }
-
-    public static View addStreamItemToContainer(LayoutInflater inflater, Context context,
-            StreamItemEntry streamItem, LinearLayout streamContainer,
-            View.OnClickListener listener) {
+    /** Creates the view that represents a stream item. */
+    public static View createStreamItemView(LayoutInflater inflater, Context context,
+            StreamItemEntry streamItem, LinearLayout parent) {
         View oneColumnView = inflater.inflate(R.layout.stream_item_one_column,
-                streamContainer, false);
+                parent, false);
         ViewGroup contentBox = (ViewGroup) oneColumnView.findViewById(R.id.stream_item_content);
         int internalPadding = context.getResources().getDimensionPixelSize(
                 R.dimen.detail_update_section_internal_padding);
 
-        // Add the listener only if there is an action and corresponding URI.
-        if (streamItem.getAction() != null && streamItem.getActionUri() != null) {
-            contentBox.setTag(streamItem);
-            contentBox.setOnClickListener(listener);
-            contentBox.setFocusable(true);
-        }
-
         // TODO: This is not the correct layout for a stream item with photos.  Photos should be
         // displayed first, then the update text either to the right of the final image (if there
         // are an odd number of images) or below the last row of images (if there are an even
@@ -335,8 +314,8 @@
             }
         }
 
-        if (streamContainer != null) {
-            streamContainer.addView(oneColumnView);
+        if (parent != null) {
+            parent.addView(oneColumnView);
         }
 
         return oneColumnView;
@@ -358,7 +337,9 @@
         } else {
             commentsView.setVisibility(View.GONE);
         }
-        parent.addView(textUpdate);
+        if (parent != null) {
+            parent.addView(textUpdate);
+        }
         return textUpdate;
     }
 
diff --git a/src/com/android/contacts/detail/ContactDetailLayoutController.java b/src/com/android/contacts/detail/ContactDetailLayoutController.java
index 7abe76e..f3cc016 100644
--- a/src/com/android/contacts/detail/ContactDetailLayoutController.java
+++ b/src/com/android/contacts/detail/ContactDetailLayoutController.java
@@ -29,8 +29,6 @@
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
-import android.widget.AbsListView;
-import android.widget.AbsListView.OnScrollListener;
 
 /**
  * Determines the layout of the contact card.
@@ -115,8 +113,6 @@
         }
 
         mDetailFragment.setListener(mContactDetailFragmentListener);
-        mDetailFragment.setVerticalScrollListener(mVerticalScrollListener);
-        mUpdatesFragment.setVerticalScrollListener(mVerticalScrollListener);
 
         switch (mLayoutMode) {
             case VIEW_PAGER_AND_CAROUSEL: {
@@ -151,6 +147,7 @@
                 }
                 transaction.commit();
                 mFragmentManager.executePendingTransactions();
+                TabCarouselScrollManager.bind(mTabCarousel, mDetailFragment, mUpdatesFragment);
                 break;
             }
             case TWO_COLUMN: {
@@ -306,32 +303,4 @@
             mViewPager.setCurrentItem(position);
         }
     };
-
-    private OnScrollListener mVerticalScrollListener = new OnScrollListener() {
-
-        @Override
-        public void onScroll(
-                AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
-            if (mTabCarousel == null) {
-                return;
-            }
-            // If the FIRST item is not visible on the screen, then the carousel must be pinned
-            // at the top of the screen.
-            if (firstVisibleItem != 0) {
-                mTabCarousel.setY(-mTabCarousel.getAllowedVerticalScrollLength());
-                return;
-            }
-            View topView = view.getChildAt(firstVisibleItem);
-            if (topView == null) {
-                return;
-            }
-            int amtToScroll = Math.max((int) view.getChildAt(firstVisibleItem).getY(),
-                    -mTabCarousel.getAllowedVerticalScrollLength());
-            mTabCarousel.setY(amtToScroll);
-        }
-
-        @Override
-        public void onScrollStateChanged(AbsListView view, int scrollState) {}
-
-    };
 }
diff --git a/src/com/android/contacts/detail/ContactDetailUpdatesFragment.java b/src/com/android/contacts/detail/ContactDetailUpdatesFragment.java
index 308254f..bb2bdb4 100644
--- a/src/com/android/contacts/detail/ContactDetailUpdatesFragment.java
+++ b/src/com/android/contacts/detail/ContactDetailUpdatesFragment.java
@@ -66,16 +66,31 @@
         @Override
         public void onClick(View view) {
             StreamItemEntry streamItemEntry = (StreamItemEntry) view.getTag();
-            Uri uri;
-            try {
-                uri = Uri.parse(streamItemEntry.getActionUri());
-            } catch (Throwable throwable) {
-                Log.e(TAG, "invalid URI for stream item #" + streamItemEntry.getId() + ": "
-                        + streamItemEntry.getActionUri());
+            if (streamItemEntry == null) {
+                // Ignore if this item does not have a stream item associated with it.
                 return;
             }
-            Intent streamItemIntent = new Intent(streamItemEntry.getAction(), uri);
-            startActivity(streamItemIntent);
+            String actionUri = streamItemEntry.getActionUri();
+            if (actionUri == null) {
+                // Ignore if this item does not have a URI.
+                return;
+            }
+            // Parse the URI.
+            Uri uri;
+            try {
+                uri = Uri.parse(actionUri);
+            } catch (Throwable throwable) {
+                // This may fail if the URI is invalid: instead of failing, just ignore it.
+                Log.e(TAG, "invalid URI for stream item #" + streamItemEntry.getId() + ": "
+                        + actionUri);
+                return;
+            }
+            String action = streamItemEntry.getAction();
+            if (action == null) {
+                // Ignore if this item does not have an action.
+                return;
+            }
+            startActivity(new Intent(action, uri));
         }
     };
 
diff --git a/src/com/android/contacts/detail/StreamItemAdapter.java b/src/com/android/contacts/detail/StreamItemAdapter.java
index d8f4a81..95880d7 100644
--- a/src/com/android/contacts/detail/StreamItemAdapter.java
+++ b/src/com/android/contacts/detail/StreamItemAdapter.java
@@ -74,8 +74,19 @@
         if (position == 0) {
             return mInflater.inflate(R.layout.updates_header_contact, null);
         }
-        return ContactDetailDisplayUtils.addStreamItemToContainer(
-                mInflater, mContext, (StreamItemEntry) getItem(position), null, mListener);
+        StreamItemEntry streamItem = (StreamItemEntry) getItem(position);
+        View view = ContactDetailDisplayUtils.createStreamItemView(
+                mInflater, mContext, streamItem, null);
+        if (streamItem.getAction() != null && streamItem.getActionUri() != null) {
+            view.setTag(streamItem);
+            view.setFocusable(true);
+            view.setOnClickListener(mListener);
+        } else {
+            view.setTag(null);
+            view.setFocusable(false);
+            view.setOnClickListener(null);
+        }
+        return view;
     }
 
     @Override
diff --git a/src/com/android/contacts/detail/TabCarouselScrollManager.java b/src/com/android/contacts/detail/TabCarouselScrollManager.java
new file mode 100644
index 0000000..2415b50
--- /dev/null
+++ b/src/com/android/contacts/detail/TabCarouselScrollManager.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.contacts.detail;
+
+import android.view.View;
+import android.widget.AbsListView;
+import android.widget.AbsListView.OnScrollListener;
+
+/**
+ * Takes care of managing scrolling for the side-by-side views using the tab carousel.
+ */
+public class TabCarouselScrollManager {
+    private final ContactDetailTabCarousel mTabCarousel;
+    private final ContactDetailFragment mAboutFragment;
+    private final ContactDetailUpdatesFragment mUpdatesFragment;
+    private final OnScrollListener mVerticalScrollListener = new OnScrollListener() {
+        @Override
+        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
+                int totalItemCount) {
+            if (mTabCarousel == null) {
+                return;
+            }
+            // If the FIRST item is not visible on the screen, then the carousel must be pinned
+            // at the top of the screen.
+            if (firstVisibleItem != 0) {
+                mTabCarousel.setY(-mTabCarousel.getAllowedVerticalScrollLength());
+                return;
+            }
+            View topView = view.getChildAt(firstVisibleItem);
+            if (topView == null) {
+                return;
+            }
+            int amtToScroll = Math.max((int) view.getChildAt(firstVisibleItem).getY(),
+                    -mTabCarousel.getAllowedVerticalScrollLength());
+            mTabCarousel.setY(amtToScroll);
+        }
+
+        @Override
+        public void onScrollStateChanged(AbsListView view, int scrollState) {}
+    };
+
+    private TabCarouselScrollManager(ContactDetailTabCarousel tabCarousel,
+            ContactDetailFragment aboutFragment, ContactDetailUpdatesFragment updatesFragment) {
+        mTabCarousel = tabCarousel;
+        mAboutFragment = aboutFragment;
+        mUpdatesFragment = updatesFragment;
+    }
+
+    public void bind() {
+        mAboutFragment.setVerticalScrollListener(mVerticalScrollListener);
+        mUpdatesFragment.setVerticalScrollListener(mVerticalScrollListener);
+    }
+
+    public static void bind(ContactDetailTabCarousel tabCarousel,
+            ContactDetailFragment aboutFragment, ContactDetailUpdatesFragment updatesFragment) {
+        TabCarouselScrollManager scrollManager =
+                new TabCarouselScrollManager(tabCarousel, aboutFragment, updatesFragment);
+        scrollManager.bind();
+    }
+}
diff --git a/src/com/android/contacts/editor/ContactEditorFragment.java b/src/com/android/contacts/editor/ContactEditorFragment.java
index e0f99ce..0227b13 100644
--- a/src/com/android/contacts/editor/ContactEditorFragment.java
+++ b/src/com/android/contacts/editor/ContactEditorFragment.java
@@ -600,14 +600,8 @@
                         R.layout.external_raw_contact_editor_view, mContent, false);
                 ((ExternalRawContactEditorView) editor).setListener(this);
             } else {
-                final RawContactEditorView rawContactEditor = (RawContactEditorView)
-                        inflater.inflate(R.layout.raw_contact_editor_view, mContent, false);
-                // For existing contacts, only show the account header if there is more than 1 raw
-                // contact in the aggregate contact.
-                if (Intent.ACTION_EDIT.equals(mAction)) {
-                    rawContactEditor.setAccountHeaderVisible(numRawContacts > 1);
-                }
-                editor = rawContactEditor;
+                editor = (RawContactEditorView) inflater.inflate(R.layout.raw_contact_editor_view,
+                        mContent, false);
             }
             if (Intent.ACTION_INSERT.equals(mAction) && numRawContacts == 1) {
                 final List<AccountWithDataSet> accounts =
@@ -695,7 +689,7 @@
                 values.getAsString(RawContacts.ACCOUNT_TYPE),
                 values.getAsString(RawContacts.DATA_SET));
         final View accountView = editor.findViewById(R.id.account);
-        final View anchorView = editor.findViewById(R.id.anchor_for_account_switcher);
+        final View anchorView = editor.findViewById(R.id.account_container);
         accountView.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
diff --git a/src/com/android/contacts/editor/EventFieldEditorView.java b/src/com/android/contacts/editor/EventFieldEditorView.java
index 4c5affd..e7da6c1 100644
--- a/src/com/android/contacts/editor/EventFieldEditorView.java
+++ b/src/com/android/contacts/editor/EventFieldEditorView.java
@@ -29,6 +29,8 @@
 
 import android.app.Dialog;
 import android.content.Context;
+import android.content.res.ColorStateList;
+import android.content.res.Resources;
 import android.os.Bundle;
 import android.text.TextUtils;
 import android.util.AttributeSet;
@@ -49,6 +51,13 @@
      */
     private final static int DEFAULT_HOUR = 8;
 
+    /**
+     * Default string to show when there is no date selected yet.
+     */
+    private String mNoDateString;
+    private int mPrimaryTextColor;
+    private int mSecondaryTextColor;
+
     private Button mDateView;
 
     public EventFieldEditorView(Context context) {
@@ -68,6 +77,11 @@
     protected void onFinishInflate() {
         super.onFinishInflate();
 
+        Resources resources = mContext.getResources();
+        mPrimaryTextColor = resources.getColor(R.color.primary_text_color);
+        mSecondaryTextColor = resources.getColor(R.color.secondary_text_color);
+        mNoDateString = mContext.getString(R.string.add_new_entry_for_section);
+
         mDateView = (Button) findViewById(R.id.date_view);
         mDateView.setOnClickListener(new OnClickListener() {
             @Override
@@ -105,12 +119,14 @@
         final String column = editField.column;
         String data = DateUtils.formatDate(getContext(), getEntry().getAsString(column));
         if (TextUtils.isEmpty(data)) {
-            data = " ";
+            mDateView.setText(mNoDateString);
+            mDateView.setTextColor(mSecondaryTextColor);
             setDeleteButtonVisible(false);
         } else {
+            mDateView.setText(data);
+            mDateView.setTextColor(mPrimaryTextColor);
             setDeleteButtonVisible(true);
         }
-        mDateView.setText(data);
     }
 
     @Override
@@ -246,7 +262,8 @@
     @Override
     public void clearAllFields() {
         // Update UI
-        mDateView.setText("");
+        mDateView.setText(mNoDateString);
+        mDateView.setTextColor(mSecondaryTextColor);
 
         // Update state
         final String column = getKind().fieldList.get(0).column;
diff --git a/src/com/android/contacts/editor/ExternalRawContactEditorView.java b/src/com/android/contacts/editor/ExternalRawContactEditorView.java
index 734f013..04f4140 100644
--- a/src/com/android/contacts/editor/ExternalRawContactEditorView.java
+++ b/src/com/android/contacts/editor/ExternalRawContactEditorView.java
@@ -43,6 +43,7 @@
 import android.widget.Button;
 import android.widget.ImageView;
 import android.widget.TextView;
+import android.widget.Toast;
 
 import java.util.ArrayList;
 
@@ -55,10 +56,10 @@
 
     private View mPhotoStub;
     private TextView mName;
-    private TextView mReadOnlyWarning;
     private Button mEditExternallyButton;
     private ViewGroup mGeneral;
 
+    private View mAccountContainer;
     private ImageView mAccountIcon;
     private TextView mAccountTypeTextView;
     private TextView mAccountNameTextView;
@@ -97,11 +98,11 @@
         mPhotoStub = findViewById(R.id.stub_photo);
 
         mName = (TextView) findViewById(R.id.read_only_name);
-        mReadOnlyWarning = (TextView) findViewById(R.id.read_only_warning);
         mEditExternallyButton = (Button) findViewById(R.id.button_edit_externally);
         mEditExternallyButton.setOnClickListener(this);
         mGeneral = (ViewGroup)findViewById(R.id.sect_general);
 
+        mAccountContainer = findViewById(R.id.account_container);
         mAccountIcon = (ImageView) findViewById(R.id.account_icon);
         mAccountTypeTextView = (TextView) findViewById(R.id.account_type);
         mAccountNameTextView = (TextView) findViewById(R.id.account_name);
@@ -168,11 +169,17 @@
         mName.setText(primary.getAsString(StructuredName.DISPLAY_NAME));
 
         if (type.readOnly) {
-            mReadOnlyWarning.setText(mContext.getString(R.string.contact_read_only));
-            mReadOnlyWarning.setVisibility(View.VISIBLE);
+            mAccountContainer.setOnClickListener(new OnClickListener() {
+                @Override
+                public void onClick(View v) {
+                    Toast.makeText(mContext, mContext.getString(R.string.contact_read_only),
+                            Toast.LENGTH_SHORT).show();
+                }
+            });
             mEditExternallyButton.setVisibility(View.GONE);
         } else {
-            mReadOnlyWarning.setVisibility(View.GONE);
+            mAccountContainer.setBackgroundDrawable(null);
+            mAccountContainer.setEnabled(false);
             mEditExternallyButton.setVisibility(View.VISIBLE);
         }
 
@@ -183,7 +190,7 @@
                 View field = mInflater.inflate(
                         R.layout.item_read_only_field, mGeneral, false);
                 TextView v;
-                v = (TextView) field.findViewById(R.id.label);
+                v = (TextView) field.findViewById(R.id.kind_title);
                 v.setText(mContext.getText(R.string.phoneLabelsGroup));
                 v = (TextView) field.findViewById(R.id.data);
                 v.setText(PhoneNumberUtils.formatNumber(phone.getAsString(Phone.NUMBER),
@@ -200,7 +207,7 @@
                 View field = mInflater.inflate(
                         R.layout.item_read_only_field, mGeneral, false);
                 TextView v;
-                v = (TextView) field.findViewById(R.id.label);
+                v = (TextView) field.findViewById(R.id.kind_title);
                 v.setText(mContext.getText(R.string.emailLabelsGroup));
                 v = (TextView) field.findViewById(R.id.data);
                 v.setText(email.getAsString(Email.DATA));
diff --git a/src/com/android/contacts/editor/GroupMembershipView.java b/src/com/android/contacts/editor/GroupMembershipView.java
index 9693915..042b80a 100644
--- a/src/com/android/contacts/editor/GroupMembershipView.java
+++ b/src/com/android/contacts/editor/GroupMembershipView.java
@@ -27,6 +27,8 @@
 
 import android.app.Activity;
 import android.content.Context;
+import android.content.res.ColorStateList;
+import android.content.res.Resources;
 import android.database.Cursor;
 import android.provider.ContactsContract.CommonDataKinds.GroupMembership;
 import android.provider.ContactsContract.RawContacts;
@@ -95,6 +97,10 @@
     private boolean mDefaultGroupVisibilityKnown;
     private boolean mDefaultGroupVisible;
 
+    private String mNoGroupString;
+    private int mPrimaryTextColor;
+    private int mSecondaryTextColor;
+
     public GroupMembershipView(Context context) {
         super(context);
     }
@@ -104,6 +110,15 @@
     }
 
     @Override
+    protected void onFinishInflate() {
+        super.onFinishInflate();
+        Resources resources = mContext.getResources();
+        mPrimaryTextColor = resources.getColor(R.color.primary_text_color);
+        mSecondaryTextColor = resources.getColor(R.color.secondary_text_color);
+        mNoGroupString = mContext.getString(R.string.add_new_entry_for_section);
+    }
+
+    @Override
     public void setEnabled(boolean enabled) {
         super.setEnabled(enabled);
         if (mGroupList != null) {
@@ -187,9 +202,11 @@
 
         mGroupList.setEnabled(isEnabled());
         if (sb.length() == 0) {
-            mGroupList.setText(" ");
+            mGroupList.setText(mNoGroupString);
+            mGroupList.setTextColor(mSecondaryTextColor);
         } else {
             mGroupList.setText(sb);
+            mGroupList.setTextColor(mPrimaryTextColor);
         }
         setVisibility(VISIBLE);
 
diff --git a/src/com/android/contacts/editor/KindSectionView.java b/src/com/android/contacts/editor/KindSectionView.java
index 3b46307..686939c 100644
--- a/src/com/android/contacts/editor/KindSectionView.java
+++ b/src/com/android/contacts/editor/KindSectionView.java
@@ -140,7 +140,7 @@
         mTitleString = (kind.titleRes == -1 || kind.titleRes == 0)
                 ? ""
                 : getResources().getString(kind.titleRes);
-        mTitle.setText(mTitleString.toUpperCase());
+        mTitle.setText(mTitleString);
 
         rebuildFromState();
         updateAddFooterVisible();
diff --git a/src/com/android/contacts/editor/LabeledEditorView.java b/src/com/android/contacts/editor/LabeledEditorView.java
index 5bba2c4..bb25ea0 100644
--- a/src/com/android/contacts/editor/LabeledEditorView.java
+++ b/src/com/android/contacts/editor/LabeledEditorView.java
@@ -465,10 +465,12 @@
     private class EditTypeAdapter extends ArrayAdapter<EditType> {
         private final LayoutInflater mInflater;
         private boolean mHasCustomSelection;
+        private int mTextColor;
 
         public EditTypeAdapter(Context context) {
             super(context, 0);
             mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+            mTextColor = context.getResources().getColor(R.color.secondary_text_color);
 
             if (mType != null && mType.customColumn != null) {
 
@@ -501,17 +503,18 @@
 
         private View createViewFromResource(int position, View convertView, ViewGroup parent,
                 int resource) {
-            View view;
             TextView textView;
 
             if (convertView == null) {
-                view = mInflater.inflate(resource, parent, false);
+                textView = (TextView) mInflater.inflate(resource, parent, false);
+                textView.setAllCaps(true);
+                textView.setGravity(Gravity.RIGHT);
+                textView.setTextAppearance(mContext, android.R.style.TextAppearance_Small);
+                textView.setTextColor(mTextColor);
             } else {
-                view = convertView;
+                textView = (TextView) convertView;
             }
 
-            textView = (TextView) view;
-
             EditType type = getItem(position);
             String text;
             if (type == CUSTOM_SELECTION) {
@@ -519,10 +522,8 @@
             } else {
                 text = getContext().getString(type.labelRes);
             }
-            textView.setText(text.toUpperCase());
-            textView.setGravity(Gravity.RIGHT);
-            textView.setTextColor(Color.GRAY);
-            return view;
+            textView.setText(text);
+            return textView;
         }
     }
 }
diff --git a/src/com/android/contacts/editor/RawContactEditorView.java b/src/com/android/contacts/editor/RawContactEditorView.java
index 41f2ebd..6335cb6 100644
--- a/src/com/android/contacts/editor/RawContactEditorView.java
+++ b/src/com/android/contacts/editor/RawContactEditorView.java
@@ -70,7 +70,6 @@
 
     private ViewGroup mFields;
 
-    private View mAccountContainer;
     private ImageView mAccountIcon;
     private TextView mAccountTypeTextView;
     private TextView mAccountNameTextView;
@@ -139,7 +138,6 @@
 
         mFields = (ViewGroup)findViewById(R.id.sect_fields);
 
-        mAccountContainer = findViewById(R.id.anchor_for_account_switcher);
         mAccountIcon = (ImageView) findViewById(R.id.account_icon);
         mAccountTypeTextView = (TextView) findViewById(R.id.account_type);
         mAccountNameTextView = (TextView) findViewById(R.id.account_name);
@@ -153,10 +151,6 @@
         });
     }
 
-    public void setAccountHeaderVisible(boolean visible) {
-        mAccountContainer.setVisibility(visible ? View.VISIBLE : View.GONE);
-    }
-
     /**
      * Set the internal state for this view, given a current
      * {@link EntityDelta} state and the {@link AccountType} that
diff --git a/src/com/android/contacts/editor/TextFieldsEditorView.java b/src/com/android/contacts/editor/TextFieldsEditorView.java
index 0d8aba6..d3fa3b7 100644
--- a/src/com/android/contacts/editor/TextFieldsEditorView.java
+++ b/src/com/android/contacts/editor/TextFieldsEditorView.java
@@ -60,6 +60,7 @@
     private ImageView mExpansionView;
     private boolean mHideOptional = true;
     private boolean mHasShortAndLongForms;
+    private int mHintTextColor;
 
     public TextFieldsEditorView(Context context) {
         super(context);
@@ -81,6 +82,7 @@
         setDrawingCacheEnabled(true);
         setAlwaysDrawnWithCacheEnabled(true);
 
+        mHintTextColor = getContext().getResources().getColor(R.color.secondary_text_color);
         mFields = (ViewGroup) findViewById(R.id.editors);
         mExpansionView = (ImageView) findViewById(R.id.expansion_view);
         mExpansionViewContainer = findViewById(R.id.expansion_view_container);
@@ -173,6 +175,7 @@
             fieldView.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT,
                     LayoutParams.WRAP_CONTENT));
             fieldView.setTextAppearance(getContext(), kind.textAppearanceResourceId);
+            fieldView.setHintTextColor(mHintTextColor);
             fieldView.setGravity(Gravity.TOP);
             mFieldEditTexts[index] = fieldView;
             fieldView.setId(vig.getId(state, kind, entry, index));
diff --git a/src/com/android/contacts/group/GroupBrowseListAdapter.java b/src/com/android/contacts/group/GroupBrowseListAdapter.java
index 1f06029..6571b99 100644
--- a/src/com/android/contacts/group/GroupBrowseListAdapter.java
+++ b/src/com/android/contacts/group/GroupBrowseListAdapter.java
@@ -153,8 +153,11 @@
             if (currentGroupId == mGroupId) {
                 final ImageView[] children = getIconViewsSordedByFillOrder(icons);
                 for (int i = 0; i < children.length; i++) {
-                    final long photoId = i < photoIds.size() ? photoIds.get(i) : 0;
-                    mContactPhotoManager.loadPhoto(children[i], photoId);
+                    if (i < photoIds.size()) {
+                        mContactPhotoManager.loadPhoto(children[i], photoIds.get(i));
+                    } else {
+                        mContactPhotoManager.removePhoto(children[i]);
+                    }
                 }
             }
         }
@@ -318,13 +321,16 @@
         if (photoIds != null) {
             // Cache is available. Let the photo manager load those IDs.
             for (int i = 0; i < children.length; i++) {
-                final long photoId = i < photoIds.size() ? photoIds.get(i) : 0;
-                mContactPhotoManager.loadPhoto(children[i], photoId);
+                if (i < photoIds.size()) {
+                    mContactPhotoManager.loadPhoto(children[i], photoIds.get(i));
+                } else {
+                    mContactPhotoManager.removePhoto(children[i]);
+                }
             }
         } else {
             // Cache is not available. Load photo IDs asynchronously.
             for (ImageView child : children) {
-                mContactPhotoManager.loadPhoto(child, 0);
+                mContactPhotoManager.removePhoto(child);
             }
             new AsyncPhotoIdLoadTask().execute(
                     new AsyncPhotoIdLoadArg(icons, entry.getGroupId(),
diff --git a/src/com/android/contacts/quickcontact/DataAction.java b/src/com/android/contacts/quickcontact/DataAction.java
index 6f719af..827016f 100644
--- a/src/com/android/contacts/quickcontact/DataAction.java
+++ b/src/com/android/contacts/quickcontact/DataAction.java
@@ -2,8 +2,9 @@
 
 import com.android.contacts.ContactsUtils;
 import com.android.contacts.R;
-import com.android.contacts.model.DataKind;
 import com.android.contacts.model.AccountType.EditType;
+import com.android.contacts.model.AccountTypeManager;
+import com.android.contacts.model.DataKind;
 import com.android.contacts.util.Constants;
 import com.android.contacts.util.PhoneCapabilityTester;
 
@@ -15,12 +16,12 @@
 import android.graphics.drawable.Drawable;
 import android.net.Uri;
 import android.net.WebAddress;
-import android.provider.ContactsContract.Data;
 import android.provider.ContactsContract.CommonDataKinds.Email;
 import android.provider.ContactsContract.CommonDataKinds.Im;
 import android.provider.ContactsContract.CommonDataKinds.Phone;
 import android.provider.ContactsContract.CommonDataKinds.SipAddress;
 import android.provider.ContactsContract.CommonDataKinds.Website;
+import android.provider.ContactsContract.Data;
 import android.text.TextUtils;
 import android.util.Log;
 
@@ -142,13 +143,12 @@
                 mIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(webAddress.toString()));
             }
 
-        } else if (Im.CONTENT_ITEM_TYPE.equals(mimeType)
-                || Constants.MIME_TYPE_VIDEO_CHAT.equals(mimeType)) {
+        } else if (Im.CONTENT_ITEM_TYPE.equals(mimeType)) {
             final boolean isEmail = Email.CONTENT_ITEM_TYPE.equals(
                     getAsString(cursor, Data.MIMETYPE));
             if (isEmail || isProtocolValid(cursor)) {
                 final int protocol = isEmail ? Im.PROTOCOL_GOOGLE_TALK :
-                    getAsInt(cursor, Im.PROTOCOL);
+                        getAsInt(cursor, Im.PROTOCOL);
 
                 if (isEmail) {
                     // Use Google Talk string when using Email, and clear data
@@ -165,17 +165,29 @@
                     host = ContactsUtils.lookupProviderNameFromId(protocol);
                 }
 
-                if (Constants.MIME_TYPE_VIDEO_CHAT.equals(mimeType)) {
-                    if (!TextUtils.isEmpty(data)) {
-                        mIntent = new Intent(Intent.ACTION_SENDTO);
-                        mIntent.setDataAndType(Uri.parse("xmpp:" + data + "?call"),
-                                Constants.MIME_TYPE_VIDEO_CHAT);
-                    }
-                } else if (!TextUtils.isEmpty(host) && !TextUtils.isEmpty(data)) {
+                if (!TextUtils.isEmpty(host) && !TextUtils.isEmpty(data)) {
                     final String authority = host.toLowerCase();
                     final Uri imUri = new Uri.Builder().scheme(Constants.SCHEME_IMTO).authority(
                             authority).appendPath(data).build();
                     mIntent = new Intent(Intent.ACTION_SENDTO, imUri);
+
+                    // If the address is also available for a video chat, we'll show the capability
+                    // as a secondary action.
+                    final int chatCapability = getAsInt(cursor, Data.CHAT_CAPABILITY);
+                    final boolean isVideoChatCapable =
+                            (chatCapability & Im.CAPABILITY_HAS_CAMERA) != 0;
+                    final boolean isAudioChatCapable =
+                            (chatCapability & Im.CAPABILITY_HAS_VOICE) != 0;
+                    if (isVideoChatCapable || isAudioChatCapable) {
+                        final AccountTypeManager accountTypes = AccountTypeManager.getInstance(
+                                context.getApplicationContext());
+                        mAlternateIntent = new Intent(
+                                Intent.ACTION_SENDTO, Uri.parse("xmpp:" + data + "?call"));
+                        // Use Holo dark theme since the background is darker than usual.
+                        mAlternateIconRes = (isVideoChatCapable
+                                ? R.drawable.sym_action_videochat_holo_dark
+                                : R.drawable.sym_action_audiochat_holo_dark);
+                    }
                 }
             }
         }
diff --git a/src/com/android/contacts/quickcontact/QuickContactActivity.java b/src/com/android/contacts/quickcontact/QuickContactActivity.java
index 1ef40db..d8f9c2c 100644
--- a/src/com/android/contacts/quickcontact/QuickContactActivity.java
+++ b/src/com/android/contacts/quickcontact/QuickContactActivity.java
@@ -467,8 +467,6 @@
                 }
             }
 
-            boolean isIm = Im.CONTENT_ITEM_TYPE.equals(mimeType);
-
             // Handle Email rows with presence data as Im entry
             final boolean hasPresence = !cursor.isNull(DataQuery.PRESENCE);
             if (hasPresence && Email.CONTENT_ITEM_TYPE.equals(mimeType)) {
@@ -478,20 +476,6 @@
                     final DataAction action = new DataAction(context, Im.CONTENT_ITEM_TYPE, imKind,
                             dataId, cursor);
                     considerAdd(action, cache);
-                    isIm = true;
-                }
-            }
-
-            if (hasPresence && isIm) {
-                int chatCapability = cursor.getInt(DataQuery.CHAT_CAPABILITY);
-                if ((chatCapability & Im.CAPABILITY_HAS_CAMERA) != 0) {
-                    final DataKind imKind = accountTypes.getKindOrFallback(accountType, dataSet,
-                            Im.CONTENT_ITEM_TYPE);
-                    if (imKind != null) {
-                        final DataAction chatAction = new DataAction(context,
-                                Constants.MIME_TYPE_VIDEO_CHAT, imKind, dataId, cursor);
-                        considerAdd(chatAction, cache);
-                    }
                 }
             }
         }
diff --git a/src/com/android/contacts/voicemail/VoicemailPlaybackFragment.java b/src/com/android/contacts/voicemail/VoicemailPlaybackFragment.java
index d306209..fcf99b6 100644
--- a/src/com/android/contacts/voicemail/VoicemailPlaybackFragment.java
+++ b/src/com/android/contacts/voicemail/VoicemailPlaybackFragment.java
@@ -66,7 +66,6 @@
     private SeekBar mPlaybackSeek;
     private ImageButton mStartStopButton;
     private ImageButton mPlaybackSpeakerphone;
-    private TextView mPlaybackPositionText;
     private ImageButton mRateDecreaseButton;
     private ImageButton mRateIncreaseButton;
     private TextViewWithMessagesController mTextController;
@@ -79,10 +78,11 @@
         mPlaybackSeek = (SeekBar) view.findViewById(R.id.playback_seek);
         mStartStopButton = (ImageButton) view.findViewById(R.id.playback_start_stop);
         mPlaybackSpeakerphone = (ImageButton) view.findViewById(R.id.playback_speakerphone);
-        mPlaybackPositionText = (TextView) view.findViewById(R.id.playback_position_text);
         mRateDecreaseButton = (ImageButton) view.findViewById(R.id.rate_decrease_button);
         mRateIncreaseButton = (ImageButton) view.findViewById(R.id.rate_increase_button);
-        mTextController = new TextViewWithMessagesController(mPlaybackPositionText);
+        mTextController = new TextViewWithMessagesController(
+                (TextView) view.findViewById(R.id.playback_position_text),
+                (TextView) view.findViewById(R.id.playback_speed_text));
         return view;
     }
 
@@ -259,30 +259,30 @@
      * All the methods on this class must be called from the ui thread.
      */
     private static final class TextViewWithMessagesController {
+        private static final float VISIBLE = 1;
+        private static final float INVISIBLE = 0;
+        private static final long SHORT_ANIMATION_MS = 200;
+        private static final long LONG_ANIMATION_MS = 400;
         private final Object mLock = new Object();
-        private final TextView mTextView;
-        @GuardedBy("mLock") String mCurrentText = "";
-        @GuardedBy("mLock") Runnable mRunnable;
+        private final TextView mPermanentTextView;
+        private final TextView mTemporaryTextView;
+        @GuardedBy("mLock") private Runnable mRunnable;
 
-        public TextViewWithMessagesController(TextView textView) {
-            mTextView = textView;
+        public TextViewWithMessagesController(TextView permanentTextView,
+                TextView temporaryTextView) {
+            mPermanentTextView = permanentTextView;
+            mTemporaryTextView = temporaryTextView;
         }
 
         public void setPermanentText(String text) {
-            synchronized (mLock) {
-                mCurrentText = text;
-                // If there's currently a Runnable pending, then we don't alter the display
-                // text. The Runnable will use the most recent version of mCurrentText
-                // when it completes.
-                if (mRunnable == null) {
-                    mTextView.setText(text);
-                }
-            }
+            mPermanentTextView.setText(text);
         }
 
         public void setTemporaryText(String text, long duration, TimeUnit units) {
             synchronized (mLock) {
-                mTextView.setText(text);
+                mTemporaryTextView.setText(text);
+                mTemporaryTextView.animate().alpha(VISIBLE).setDuration(SHORT_ANIMATION_MS);
+                mPermanentTextView.animate().alpha(INVISIBLE).setDuration(SHORT_ANIMATION_MS);
                 mRunnable = new Runnable() {
                     @Override
                     public void run() {
@@ -292,12 +292,15 @@
                             // one is now defunct and needs to take no action.
                             if (mRunnable == this) {
                                 mRunnable = null;
-                                mTextView.setText(mCurrentText);
+                                mTemporaryTextView.animate()
+                                        .alpha(INVISIBLE).setDuration(LONG_ANIMATION_MS);
+                                mPermanentTextView.animate()
+                                        .alpha(VISIBLE).setDuration(LONG_ANIMATION_MS);
                             }
                         }
                     }
                 };
-                mTextView.postDelayed(mRunnable, units.toMillis(duration));
+                mTemporaryTextView.postDelayed(mRunnable, units.toMillis(duration));
             }
         }
     }
diff --git a/src/com/android/contacts/voicemail/VoicemailPlaybackPresenter.java b/src/com/android/contacts/voicemail/VoicemailPlaybackPresenter.java
index eac502d..6f3a625 100644
--- a/src/com/android/contacts/voicemail/VoicemailPlaybackPresenter.java
+++ b/src/com/android/contacts/voicemail/VoicemailPlaybackPresenter.java
@@ -16,6 +16,8 @@
 
 package com.android.contacts.voicemail;
 
+import static android.util.MathUtils.constrain;
+
 import com.android.contacts.R;
 import com.android.ex.variablespeed.MediaPlayerProxy;
 import com.android.ex.variablespeed.SingleThreadedMediaPlayerProxy;
@@ -211,7 +213,7 @@
         @Override
         public void onClick(View v) {
             // Adjust the current rate, then clamp it to the allowed values.
-            mRateIndex = clamp(mRateIndex + (mIncrease ? 1 : -1), 0, PRESET_RATES.length - 1);
+            mRateIndex = constrain(mRateIndex + (mIncrease ? 1 : -1), 0, PRESET_RATES.length - 1);
             // Whether or not we have actually changed the index, call changeRate().
             // This will ensure that we show the "fastest" or "slowest" text on the ui to indicate
             // to the user that it doesn't get any faster or slower.
@@ -219,18 +221,13 @@
         }
     }
 
-    /** Clamp the input value to between min and max inclusive. */
-    private static int clamp(int input, int min, int max) {
-        return Math.max(Math.min(input, max), min);
-    }
-
     private void resetPrepareStartPlaying(int clipPositionInMillis) {
         try {
             mPlayer.reset();
             mPlayer.setDataSource(mView.getDataSourceContext(), mVoicemailUri);
             mPlayer.prepare();
             mDuration.set(mPlayer.getDuration());
-            int startPosition = clamp(clipPositionInMillis, 0, mDuration.get());
+            int startPosition = constrain(clipPositionInMillis, 0, mDuration.get());
             mView.setClipPosition(startPosition, mDuration.get());
             mPlayer.seekTo(startPosition);
             mPlayer.start();
diff --git a/tests/src/com/android/contacts/detail/ContactDetailDisplayUtilsTest.java b/tests/src/com/android/contacts/detail/ContactDetailDisplayUtilsTest.java
index 98001ae..aebb8c2 100644
--- a/tests/src/com/android/contacts/detail/ContactDetailDisplayUtilsTest.java
+++ b/tests/src/com/android/contacts/detail/ContactDetailDisplayUtilsTest.java
@@ -18,6 +18,7 @@
 
 import com.android.contacts.R;
 import com.android.contacts.util.StreamItemEntry;
+import com.android.contacts.util.StreamItemEntryBuilder;
 
 import android.content.Context;
 import android.test.AndroidTestCase;
@@ -27,7 +28,6 @@
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
-import android.widget.LinearLayout;
 import android.widget.TextView;
 
 /**
@@ -37,14 +37,11 @@
 public class ContactDetailDisplayUtilsTest extends AndroidTestCase {
     private static final String TEST_STREAM_ITEM_TEXT = "text";
 
-    private LinearLayout mParent;
     private LayoutInflater mLayoutInflater;
-    private FakeOnClickListener mListener = new FakeOnClickListener();
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        mParent = new LinearLayout(getContext());
         mLayoutInflater =
                 (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
     }
@@ -72,81 +69,6 @@
         assertGone(streamItemView, R.id.stream_item_comments);
     }
 
-    public void testAddStreamItemToContainer_NoAction() {
-        StreamItemEntry streamItem = getTestBuilder()
-                .setAction(null)
-                .setActionUri(null)
-                .build();
-        addStreamItemToContainer(streamItem, mListener);
-        assertStreamItemNotClickable();
-    }
-
-    public void testAddStreamItemToContainer_WithActionButNoActionUri() {
-        StreamItemEntry streamItem = getTestBuilder()
-                .setAction("action")
-                .setActionUri(null)
-                .build();
-        addStreamItemToContainer(streamItem, mListener);
-        assertStreamItemNotClickable();
-    }
-
-    public void testAddStreamItemToContainer_WithActionUriButNoAction() {
-        StreamItemEntry streamItem = getTestBuilder()
-                .setAction(null)
-                .setActionUri("http://www.google.com")
-                .build();
-        addStreamItemToContainer(streamItem, mListener);
-        assertStreamItemNotClickable();
-    }
-
-    public void testAddStreamItemToContainer_WithActionAndActionUri() {
-        StreamItemEntry streamItem = getTestBuilder()
-                .setAction("action")
-                .setActionUri("http://www.google.com")
-                .build();
-        addStreamItemToContainer(streamItem, mListener);
-        assertStreamItemClickable();
-        assertStreamItemHasOnClickListener();
-        assertStreamItemHasTag(streamItem);
-    }
-
-    /** Checks that the stream item view is clickable. */
-    private void assertStreamItemClickable() {
-        View streamItemView = mParent.findViewById(R.id.stream_item_content);
-        assertNotNull("should have a stream item", streamItemView);
-        assertTrue("should be clickable", streamItemView.isClickable());
-        assertTrue("should be focusable", streamItemView.isFocusable());
-    }
-
-    /** Asserts that there is a stream item but it is not clickable. */
-    private void assertStreamItemNotClickable() {
-        View streamItemView = mParent.findViewById(R.id.stream_item_content);
-        assertNotNull("should have a stream item", streamItemView);
-        assertFalse("should not be clickable", streamItemView.isClickable());
-        assertFalse("should not be focusable", streamItemView.isFocusable());
-    }
-
-    /** Checks that the stream item view has a click listener. */
-    private void assertStreamItemHasOnClickListener() {
-        // Check that the on-click listener is invoked when clicked.
-        View streamItemView = mParent.findViewById(R.id.stream_item_content);
-        assertFalse("listener should have not been invoked yet", mListener.clicked);
-        streamItemView.performClick();
-        assertTrue("listener should have been invoked", mListener.clicked);
-    }
-
-    /** Checks that the stream item view has the given stream item as its tag. */
-    private void assertStreamItemHasTag(StreamItemEntry streamItem) {
-        // The view's tag should point to the stream item entry for this view.
-        View streamItemView = mParent.findViewById(R.id.stream_item_content);
-        Object tag = streamItemView.getTag();
-        assertNotNull("should have a tag", tag);
-        assertTrue("should be a StreamItemEntry", tag instanceof StreamItemEntry);
-        StreamItemEntry streamItemTag = (StreamItemEntry) tag;
-        // The streamItem itself should be in the tag.
-        assertSame(streamItem, streamItemTag);
-    }
-
     /** Checks that the given id corresponds to a visible text view with the expected text. */
     private void assertHasText(View parent, int textViewId, String expectedText) {
         TextView textView = (TextView) parent.findViewById(textViewId);
@@ -187,70 +109,7 @@
      */
     private View addStreamItemText(StreamItemEntry streamItem) {
         return ContactDetailDisplayUtils.addStreamItemText(
-                mLayoutInflater, getContext(), streamItem, mParent);
-    }
-
-    /**
-     * Calls {@link ContactDetailDisplayUtils#addStreamItemToContainer(LayoutInflater,
-     * Context,StreamItemEntry, LinearLayout, android.view.View.OnClickListener)} with the default
-     * parameters and the given stream item and listener.
-     */
-    private void addStreamItemToContainer(StreamItemEntry streamItem,
-            View.OnClickListener listener) {
-        ContactDetailDisplayUtils.addStreamItemToContainer(mLayoutInflater, getContext(),
-                streamItem, mParent, listener);
-    }
-
-    /**
-     * Simple fake implementation of {@link View.OnClickListener} which sets a member variable to
-     * true when clicked.
-     */
-    private final class FakeOnClickListener implements View.OnClickListener {
-        public boolean clicked = false;
-
-        @Override
-        public void onClick(View view) {
-            clicked = true;
-        }
-    }
-
-    private static class StreamItemEntryBuilder {
-        private long mId;
-        private String mText;
-        private String mComment;
-        private long mTimestamp;
-        private String mAction;
-        private String mActionUri;
-        private String mResPackage;
-        private int mIconRes;
-        private int mLabelRes;
-
-        public StreamItemEntryBuilder() {}
-
-        public StreamItemEntryBuilder setText(String text) {
-            mText = text;
-            return this;
-        }
-
-        public StreamItemEntryBuilder setComment(String comment) {
-            mComment = comment;
-            return this;
-        }
-
-        public StreamItemEntryBuilder setAction(String action) {
-            mAction = action;
-            return this;
-        }
-
-        public StreamItemEntryBuilder setActionUri(String actionUri) {
-            mActionUri = actionUri;
-            return this;
-        }
-
-        public StreamItemEntry build() {
-            return new StreamItemEntry(mId, mText, mComment, mTimestamp, mAction, mActionUri,
-                    mResPackage, mIconRes, mLabelRes);
-        }
+                mLayoutInflater, getContext(), streamItem, null);
     }
 
     private StreamItemEntryBuilder getTestBuilder() {
diff --git a/tests/src/com/android/contacts/detail/StreamItemAdapterTest.java b/tests/src/com/android/contacts/detail/StreamItemAdapterTest.java
new file mode 100644
index 0000000..99ae834
--- /dev/null
+++ b/tests/src/com/android/contacts/detail/StreamItemAdapterTest.java
@@ -0,0 +1,173 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.contacts.detail;
+
+import com.android.contacts.util.StreamItemEntry;
+import com.android.contacts.util.StreamItemEntryBuilder;
+import com.google.common.collect.Lists;
+
+import android.content.Intent;
+import android.test.AndroidTestCase;
+import android.view.View;
+
+import java.util.ArrayList;
+
+/**
+ * Unit tests for {@link StreamItemAdapter}.
+ */
+public class StreamItemAdapterTest extends AndroidTestCase {
+    private StreamItemAdapter mAdapter;
+    private FakeOnClickListener mListener;
+    private View mView;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mListener = new FakeOnClickListener();
+        mAdapter = new StreamItemAdapter(getContext(), mListener);
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        mAdapter = null;
+        mListener = null;
+        super.tearDown();
+    }
+
+    public void testGetCount_Empty() {
+        mAdapter.setStreamItems(createStreamItemList(0));
+        // There is actually one view: the header.
+        assertEquals(1, mAdapter.getCount());
+    }
+
+    public void testGetCount_NonEmpty() {
+        mAdapter.setStreamItems(createStreamItemList(3));
+        // There is one extra view: the header.
+        assertEquals(4, mAdapter.getCount());
+    }
+
+    public void testGetView_WithAction() {
+        StreamItemEntry streamItem = createStreamItemWithAction();
+        mAdapter.setStreamItems(Lists.newArrayList(streamItem));
+        mView = mAdapter.getView(1, null, null);
+        assertStreamItemViewHasTag(streamItem);
+        assertStreamItemViewHasOnClickListener();
+        assertStreamItemViewFocusable();
+    }
+
+    public void testGetView_WithoutAction() {
+        mAdapter.setStreamItems(Lists.newArrayList(createStreamItemWithoutAction()));
+        mView = mAdapter.getView(1, null, null);
+        assertStreamItemViewHasNoTag();
+        assertStreamItemViewHasNoOnClickListener();
+        assertStreamItemViewNotFocusable();
+    }
+
+    public void testGetView_Header() {
+        // Just check that we can inflate it correctly.
+        mView = mAdapter.getView(0, null, null);
+    }
+
+    /** Counter used by {@link #createStreamItemEntryBuilder()} to create unique builders. */
+    private int mCreateStreamItemEntryBuilderCounter = 0;
+
+    /** Returns a stream item builder with basic information in it. */
+    private StreamItemEntryBuilder createStreamItemEntryBuilder() {
+        return new StreamItemEntryBuilder().setText(
+                "text #" + mCreateStreamItemEntryBuilderCounter++);
+    }
+
+    /** Returns a stream item with an action and action URI set. */
+    private StreamItemEntry createStreamItemWithAction() {
+        return createStreamItemEntryBuilder()
+                .setAction(Intent.ACTION_VIEW)
+                .setActionUri("http://www.google.com")
+                .build();
+    }
+
+    /** Returns a stream item without an action and action URI set. */
+    private StreamItemEntry createStreamItemWithoutAction() {
+        return createStreamItemEntryBuilder()
+                .setAction(null)
+                .setActionUri(null)
+                .build();
+    }
+
+    /** Creates a list containing the given number of {@link StreamItemEntry}s. */
+    private ArrayList<StreamItemEntry> createStreamItemList(int count) {
+        ArrayList<StreamItemEntry> list = Lists.newArrayList();
+        for (int index = 0; index < count; ++index) {
+            list.add(createStreamItemEntryBuilder().build());
+        }
+        return list;
+    }
+
+    /** Checks that the stream item view has a click listener. */
+    private void assertStreamItemViewHasOnClickListener() {
+        assertFalse("listener should have not been invoked yet", mListener.clicked);
+        mView.performClick();
+        assertTrue("listener should have been invoked", mListener.clicked);
+    }
+
+    /** Checks that the stream item view does not have a click listener. */
+    private void assertStreamItemViewHasNoOnClickListener() {
+        assertFalse("listener should have not been invoked yet", mListener.clicked);
+        mView.performClick();
+        assertFalse("listener should have not been invoked", mListener.clicked);
+    }
+
+    /** Checks that the stream item view is clickable. */
+    private void assertStreamItemViewFocusable() {
+        assertNotNull("should have a stream item", mView);
+        assertTrue("should be focusable", mView.isFocusable());
+    }
+
+    /** Asserts that there is a stream item but it is not clickable. */
+    private void assertStreamItemViewNotFocusable() {
+        assertNotNull("should have a stream item", mView);
+        assertFalse("should not be focusable", mView.isFocusable());
+    }
+
+    /** Checks that the stream item view has the given stream item as its tag. */
+    private void assertStreamItemViewHasTag(StreamItemEntry streamItem) {
+        Object tag = mView.getTag();
+        assertNotNull("should have a tag", tag);
+        assertTrue("should be a StreamItemEntry", tag instanceof StreamItemEntry);
+        StreamItemEntry streamItemTag = (StreamItemEntry) tag;
+        // The streamItem itself should be in the tag.
+        assertSame(streamItem, streamItemTag);
+    }
+
+    /** Checks that the stream item view has the given stream item as its tag. */
+    private void assertStreamItemViewHasNoTag() {
+        Object tag = mView.getTag();
+        assertNull("should not have a tag", tag);
+    }
+
+    /**
+     * Simple fake implementation of {@link View.OnClickListener} which sets a member variable to
+     * true when clicked.
+     */
+    private final class FakeOnClickListener implements View.OnClickListener {
+        public boolean clicked = false;
+
+        @Override
+        public void onClick(View view) {
+            clicked = true;
+        }
+    }
+}
diff --git a/tests/src/com/android/contacts/tests/mocks/MockContactPhotoManager.java b/tests/src/com/android/contacts/tests/mocks/MockContactPhotoManager.java
index 6da205b..416b841 100644
--- a/tests/src/com/android/contacts/tests/mocks/MockContactPhotoManager.java
+++ b/tests/src/com/android/contacts/tests/mocks/MockContactPhotoManager.java
@@ -37,6 +37,11 @@
     }
 
     @Override
+    public void removePhoto(ImageView view) {
+        view.setImageDrawable(null);
+    }
+
+    @Override
     public void pause() {
     }
 
diff --git a/tests/src/com/android/contacts/util/StreamItemEntryBuilder.java b/tests/src/com/android/contacts/util/StreamItemEntryBuilder.java
new file mode 100644
index 0000000..8a17b4a
--- /dev/null
+++ b/tests/src/com/android/contacts/util/StreamItemEntryBuilder.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.contacts.util;
+
+/**
+ * Builder for {@link StreamItemEntry}s to make writing tests easier.
+ */
+public class StreamItemEntryBuilder {
+    private long mId;
+    private String mText;
+    private String mComment;
+    private long mTimestamp;
+    private String mAction;
+    private String mActionUri;
+    private String mResPackage;
+    private int mIconRes;
+    private int mLabelRes;
+
+    public StreamItemEntryBuilder() {}
+
+    public StreamItemEntryBuilder setText(String text) {
+        mText = text;
+        return this;
+    }
+
+    public StreamItemEntryBuilder setComment(String comment) {
+        mComment = comment;
+        return this;
+    }
+
+    public StreamItemEntryBuilder setAction(String action) {
+        mAction = action;
+        return this;
+    }
+
+    public StreamItemEntryBuilder setActionUri(String actionUri) {
+        mActionUri = actionUri;
+        return this;
+    }
+
+    public StreamItemEntry build() {
+        return new StreamItemEntry(mId, mText, mComment, mTimestamp, mAction, mActionUri,
+                mResPackage, mIconRes, mLabelRes);
+    }
+}
\ No newline at end of file