Merge change I457e2149 into eclair

* changes:
  More icons
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 67a55c0..0950ff0 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -261,14 +261,14 @@
             </intent-filter>
         </activity>
 
-        <!-- Used to show FastTrack window over a translucent activity, which is a
+        <!-- Used to show QuickContact window over a translucent activity, which is a
              temporary hack until we add better framework support. -->
         <activity
-            android:name=".ui.FastTrackActivity"
-            android:theme="@style/FullyTranslucent.FastTrack">
+            android:name=".ui.QuickContactActivity"
+            android:theme="@style/FullyTranslucent.QuickContact">
 
             <intent-filter>
-                <action android:name="com.android.contacts.action.FAST_TRACK" />
+                <action android:name="com.android.contacts.action.QUICK_CONTACT" />
                 <category android:name="android.intent.category.DEFAULT" />
                 <data android:mimeType="vnd.android.cursor.item/contact" android:host="com.android.contacts" />
             </intent-filter>
diff --git a/res/anim/fasttrack.xml b/res/anim/quickcontact.xml
similarity index 100%
rename from res/anim/fasttrack.xml
rename to res/anim/quickcontact.xml
diff --git a/res/anim/fasttrack_above_enter.xml b/res/anim/quickcontact_above_enter.xml
similarity index 100%
rename from res/anim/fasttrack_above_enter.xml
rename to res/anim/quickcontact_above_enter.xml
diff --git a/res/anim/fasttrack_above_exit.xml b/res/anim/quickcontact_above_exit.xml
similarity index 100%
rename from res/anim/fasttrack_above_exit.xml
rename to res/anim/quickcontact_above_exit.xml
diff --git a/res/anim/fasttrack_below_enter.xml b/res/anim/quickcontact_below_enter.xml
similarity index 100%
rename from res/anim/fasttrack_below_enter.xml
rename to res/anim/quickcontact_below_enter.xml
diff --git a/res/anim/fasttrack_below_exit.xml b/res/anim/quickcontact_below_exit.xml
similarity index 100%
rename from res/anim/fasttrack_below_exit.xml
rename to res/anim/quickcontact_below_exit.xml
diff --git a/res/drawable-finger/arrow_down.png b/res/drawable-finger/arrow_down.png
deleted file mode 100644
index 8af76a3..0000000
--- a/res/drawable-finger/arrow_down.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-finger/arrow_up.png b/res/drawable-finger/arrow_up.png
deleted file mode 100644
index b5a1f51..0000000
--- a/res/drawable-finger/arrow_up.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-finger/dial_num_pound_blk.png b/res/drawable-finger/dial_num_pound_blk.png
deleted file mode 100644
index 4dabda4..0000000
--- a/res/drawable-finger/dial_num_pound_blk.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-finger/dial_num_pound_wht.png b/res/drawable-finger/dial_num_pound_wht.png
deleted file mode 100644
index f27ae87..0000000
--- a/res/drawable-finger/dial_num_pound_wht.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-finger/dial_num_star_blk.png b/res/drawable-finger/dial_num_star_blk.png
deleted file mode 100644
index af917ef..0000000
--- a/res/drawable-finger/dial_num_star_blk.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-finger/dial_num_star_wht.png b/res/drawable-finger/dial_num_star_wht.png
deleted file mode 100644
index ffbd43f..0000000
--- a/res/drawable-finger/dial_num_star_wht.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-finger/fasttrack_badge_dark_normal.png b/res/drawable-finger/fasttrack_badge_dark_normal.png
deleted file mode 100644
index 5d10608..0000000
--- a/res/drawable-finger/fasttrack_badge_dark_normal.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-finger/fasttrack_badge_dark_pressed.png b/res/drawable-finger/fasttrack_badge_dark_pressed.png
deleted file mode 100644
index 8cccedc..0000000
--- a/res/drawable-finger/fasttrack_badge_dark_pressed.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-finger/fasttrack_badge_light_normal.png b/res/drawable-finger/fasttrack_badge_light_normal.png
deleted file mode 100644
index 2d19931..0000000
--- a/res/drawable-finger/fasttrack_badge_light_normal.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-finger/fasttrack_badge_light_pressed.png b/res/drawable-finger/fasttrack_badge_light_pressed.png
deleted file mode 100644
index e0ed3b6..0000000
--- a/res/drawable-finger/fasttrack_badge_light_pressed.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-finger/fasttrack_badge_shadow.png b/res/drawable-finger/fasttrack_badge_shadow.png
deleted file mode 100644
index 8fe85d5..0000000
--- a/res/drawable-finger/fasttrack_badge_shadow.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-finger/fasttrack_slider_background.9.png b/res/drawable-finger/fasttrack_slider_background.9.png
deleted file mode 100644
index dc28aa7..0000000
--- a/res/drawable-finger/fasttrack_slider_background.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-finger/fasttrack_slider_btn_normal.png b/res/drawable-finger/fasttrack_slider_btn_normal.png
deleted file mode 100644
index 0c45399..0000000
--- a/res/drawable-finger/fasttrack_slider_btn_normal.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-finger/fasttrack_slider_btn_on.png b/res/drawable-finger/fasttrack_slider_btn_on.png
deleted file mode 100644
index 4107d82..0000000
--- a/res/drawable-finger/fasttrack_slider_btn_on.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-finger/fasttrack_slider_btn_pressed.png b/res/drawable-finger/fasttrack_slider_btn_pressed.png
deleted file mode 100644
index ba04e06..0000000
--- a/res/drawable-finger/fasttrack_slider_btn_pressed.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-finger/fasttrack_slider_btn_selected.png b/res/drawable-finger/fasttrack_slider_btn_selected.png
deleted file mode 100644
index 126b1ed..0000000
--- a/res/drawable-finger/fasttrack_slider_btn_selected.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-finger/ic_menu_split.png b/res/drawable-finger/ic_menu_split.png
deleted file mode 100644
index 9d69e4c..0000000
--- a/res/drawable-finger/ic_menu_split.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-finger/fasttrack_disambig_checkbox.xml b/res/drawable-finger/quickcontact_disambig_checkbox.xml
similarity index 84%
rename from res/drawable-finger/fasttrack_disambig_checkbox.xml
rename to res/drawable-finger/quickcontact_disambig_checkbox.xml
index 0bd2030..4add69c 100644
--- a/res/drawable-finger/fasttrack_disambig_checkbox.xml
+++ b/res/drawable-finger/quickcontact_disambig_checkbox.xml
@@ -18,8 +18,8 @@
     android:dither="true">
 
     <item android:state_checked="true"
-        android:drawable="@drawable/fasttrack_disambig_checkbox_on" />
+        android:drawable="@drawable/quickcontact_disambig_checkbox_on" />
     <item
-        android:drawable="@drawable/fasttrack_disambig_checkbox_off" />
+        android:drawable="@drawable/quickcontact_disambig_checkbox_off" />
 
 </selector>
diff --git a/res/drawable-finger/fasttrack_slider_btn.xml b/res/drawable-finger/quickcontact_slider_btn.xml
similarity index 72%
rename from res/drawable-finger/fasttrack_slider_btn.xml
rename to res/drawable-finger/quickcontact_slider_btn.xml
index b89a543..a1be8f4 100644
--- a/res/drawable-finger/fasttrack_slider_btn.xml
+++ b/res/drawable-finger/quickcontact_slider_btn.xml
@@ -18,14 +18,14 @@
     android:dither="true">
 
     <item android:state_checked="true"
-        android:drawable="@drawable/fasttrack_slider_btn_on" />
+        android:drawable="@drawable/quickcontact_slider_btn_on" />
     <item android:state_window_focused="false"
-        android:drawable="@drawable/fasttrack_slider_btn_normal" />
+        android:drawable="@drawable/quickcontact_slider_btn_normal" />
     <item android:state_pressed="true"
-        android:drawable="@drawable/fasttrack_slider_btn_pressed" />
+        android:drawable="@drawable/quickcontact_slider_btn_pressed" />
     <item android:state_focused="true"
-        android:drawable="@drawable/fasttrack_slider_btn_selected" />
+        android:drawable="@drawable/quickcontact_slider_btn_selected" />
     <item
-        android:drawable="@drawable/fasttrack_slider_btn_normal" />
+        android:drawable="@drawable/quickcontact_slider_btn_normal" />
 
 </selector>
diff --git a/res/drawable-hdpi-finger/badge_action_call.png b/res/drawable-hdpi-finger/badge_action_call.png
new file mode 100755
index 0000000..105f7d0
--- /dev/null
+++ b/res/drawable-hdpi-finger/badge_action_call.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/badge_action_sms.png b/res/drawable-hdpi-finger/badge_action_sms.png
new file mode 100755
index 0000000..a7862f6
--- /dev/null
+++ b/res/drawable-hdpi-finger/badge_action_sms.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/btn_circle_disable.png b/res/drawable-hdpi-finger/btn_circle_disable.png
new file mode 100755
index 0000000..ae063b5
--- /dev/null
+++ b/res/drawable-hdpi-finger/btn_circle_disable.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/btn_circle_disable_focused.png b/res/drawable-hdpi-finger/btn_circle_disable_focused.png
new file mode 100755
index 0000000..7a5d4fe
--- /dev/null
+++ b/res/drawable-hdpi-finger/btn_circle_disable_focused.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/btn_circle_normal.png b/res/drawable-hdpi-finger/btn_circle_normal.png
new file mode 100755
index 0000000..5eda668
--- /dev/null
+++ b/res/drawable-hdpi-finger/btn_circle_normal.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/btn_circle_pressed.png b/res/drawable-hdpi-finger/btn_circle_pressed.png
new file mode 100755
index 0000000..88848ba
--- /dev/null
+++ b/res/drawable-hdpi-finger/btn_circle_pressed.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/btn_circle_selected.png b/res/drawable-hdpi-finger/btn_circle_selected.png
new file mode 100755
index 0000000..7469070
--- /dev/null
+++ b/res/drawable-hdpi-finger/btn_circle_selected.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/contact_picture_border_highlight.9.png b/res/drawable-hdpi-finger/contact_picture_border_highlight.9.png
new file mode 100755
index 0000000..776d614
--- /dev/null
+++ b/res/drawable-hdpi-finger/contact_picture_border_highlight.9.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/contact_picture_border_in_list.9.png b/res/drawable-hdpi-finger/contact_picture_border_in_list.9.png
new file mode 100755
index 0000000..8166d4f
--- /dev/null
+++ b/res/drawable-hdpi-finger/contact_picture_border_in_list.9.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/contact_picture_border_normal.9.png b/res/drawable-hdpi-finger/contact_picture_border_normal.9.png
new file mode 100755
index 0000000..be67b1a
--- /dev/null
+++ b/res/drawable-hdpi-finger/contact_picture_border_normal.9.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/contact_picture_border_pressed.9.png b/res/drawable-hdpi-finger/contact_picture_border_pressed.9.png
new file mode 100755
index 0000000..32fbaa5
--- /dev/null
+++ b/res/drawable-hdpi-finger/contact_picture_border_pressed.9.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/ic_btn_round_minus.png b/res/drawable-hdpi-finger/ic_btn_round_minus.png
new file mode 100755
index 0000000..27af3fa
--- /dev/null
+++ b/res/drawable-hdpi-finger/ic_btn_round_minus.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/ic_btn_round_more.png b/res/drawable-hdpi-finger/ic_btn_round_more.png
new file mode 100755
index 0000000..9883d55
--- /dev/null
+++ b/res/drawable-hdpi-finger/ic_btn_round_more.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/ic_btn_round_plus.png b/res/drawable-hdpi-finger/ic_btn_round_plus.png
new file mode 100755
index 0000000..b24168c
--- /dev/null
+++ b/res/drawable-hdpi-finger/ic_btn_round_plus.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/ic_call_log_header_incoming_call.png b/res/drawable-hdpi-finger/ic_call_log_header_incoming_call.png
new file mode 100755
index 0000000..95c0255
--- /dev/null
+++ b/res/drawable-hdpi-finger/ic_call_log_header_incoming_call.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/ic_call_log_header_missed_call.png b/res/drawable-hdpi-finger/ic_call_log_header_missed_call.png
new file mode 100755
index 0000000..0a43e69
--- /dev/null
+++ b/res/drawable-hdpi-finger/ic_call_log_header_missed_call.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/ic_call_log_header_outgoing_call.png b/res/drawable-hdpi-finger/ic_call_log_header_outgoing_call.png
new file mode 100755
index 0000000..d061ba3
--- /dev/null
+++ b/res/drawable-hdpi-finger/ic_call_log_header_outgoing_call.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/ic_call_log_list_incoming_call.png b/res/drawable-hdpi-finger/ic_call_log_list_incoming_call.png
new file mode 100755
index 0000000..9c016fa
--- /dev/null
+++ b/res/drawable-hdpi-finger/ic_call_log_list_incoming_call.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/ic_call_log_list_missed_call.png b/res/drawable-hdpi-finger/ic_call_log_list_missed_call.png
new file mode 100755
index 0000000..8dcb279
--- /dev/null
+++ b/res/drawable-hdpi-finger/ic_call_log_list_missed_call.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/ic_call_log_list_outgoing_call.png b/res/drawable-hdpi-finger/ic_call_log_list_outgoing_call.png
new file mode 100755
index 0000000..256de19
--- /dev/null
+++ b/res/drawable-hdpi-finger/ic_call_log_list_outgoing_call.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/ic_contact_list_picture.png b/res/drawable-hdpi-finger/ic_contact_list_picture.png
new file mode 100755
index 0000000..296ab9f
--- /dev/null
+++ b/res/drawable-hdpi-finger/ic_contact_list_picture.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/ic_contact_picture.png b/res/drawable-hdpi-finger/ic_contact_picture.png
new file mode 100755
index 0000000..7c34f5c
--- /dev/null
+++ b/res/drawable-hdpi-finger/ic_contact_picture.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/ic_contact_picture_2.png b/res/drawable-hdpi-finger/ic_contact_picture_2.png
new file mode 100755
index 0000000..5e65276
--- /dev/null
+++ b/res/drawable-hdpi-finger/ic_contact_picture_2.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/ic_contact_picture_3.png b/res/drawable-hdpi-finger/ic_contact_picture_3.png
new file mode 100755
index 0000000..a8ec1e1
--- /dev/null
+++ b/res/drawable-hdpi-finger/ic_contact_picture_3.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/ic_default_number.png b/res/drawable-hdpi-finger/ic_default_number.png
new file mode 100755
index 0000000..cdc05a8
--- /dev/null
+++ b/res/drawable-hdpi-finger/ic_default_number.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/ic_dial_number_blk.png b/res/drawable-hdpi-finger/ic_dial_number_blk.png
new file mode 100755
index 0000000..cad1d80
--- /dev/null
+++ b/res/drawable-hdpi-finger/ic_dial_number_blk.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/ic_dial_number_wht.png b/res/drawable-hdpi-finger/ic_dial_number_wht.png
new file mode 100755
index 0000000..54f5ac0
--- /dev/null
+++ b/res/drawable-hdpi-finger/ic_dial_number_wht.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/ic_dialer_fork_add_call.png b/res/drawable-hdpi-finger/ic_dialer_fork_add_call.png
new file mode 100755
index 0000000..e046996
--- /dev/null
+++ b/res/drawable-hdpi-finger/ic_dialer_fork_add_call.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/ic_dialer_fork_current_call.png b/res/drawable-hdpi-finger/ic_dialer_fork_current_call.png
new file mode 100755
index 0000000..6e1a395
--- /dev/null
+++ b/res/drawable-hdpi-finger/ic_dialer_fork_current_call.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/ic_dialer_fork_tt_keypad.png b/res/drawable-hdpi-finger/ic_dialer_fork_tt_keypad.png
new file mode 100755
index 0000000..6b50da1
--- /dev/null
+++ b/res/drawable-hdpi-finger/ic_dialer_fork_tt_keypad.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/ic_menu_account_list.png b/res/drawable-hdpi-finger/ic_menu_account_list.png
new file mode 100755
index 0000000..a69c642
--- /dev/null
+++ b/res/drawable-hdpi-finger/ic_menu_account_list.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/ic_menu_add_picture.png b/res/drawable-hdpi-finger/ic_menu_add_picture.png
new file mode 100755
index 0000000..85faf1c
--- /dev/null
+++ b/res/drawable-hdpi-finger/ic_menu_add_picture.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/ic_menu_export_contact.png b/res/drawable-hdpi-finger/ic_menu_export_contact.png
new file mode 100755
index 0000000..c9781f7
--- /dev/null
+++ b/res/drawable-hdpi-finger/ic_menu_export_contact.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/ic_menu_import_contact.png b/res/drawable-hdpi-finger/ic_menu_import_contact.png
new file mode 100755
index 0000000..18de61f
--- /dev/null
+++ b/res/drawable-hdpi-finger/ic_menu_import_contact.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/ic_menu_merge.png b/res/drawable-hdpi-finger/ic_menu_merge.png
new file mode 100644
index 0000000..d3ed8cc
--- /dev/null
+++ b/res/drawable-hdpi-finger/ic_menu_merge.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/ic_menu_show_barcode.png b/res/drawable-hdpi-finger/ic_menu_show_barcode.png
new file mode 100755
index 0000000..e36efdd
--- /dev/null
+++ b/res/drawable-hdpi-finger/ic_menu_show_barcode.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/ic_tab_selected_friends_list.png b/res/drawable-hdpi-finger/ic_tab_selected_friends_list.png
new file mode 100755
index 0000000..201b80f
--- /dev/null
+++ b/res/drawable-hdpi-finger/ic_tab_selected_friends_list.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/ic_tab_unselected_friends_list.png b/res/drawable-hdpi-finger/ic_tab_unselected_friends_list.png
new file mode 100755
index 0000000..6a31485
--- /dev/null
+++ b/res/drawable-hdpi-finger/ic_tab_unselected_friends_list.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/quickcontact_arrow_down.png b/res/drawable-hdpi-finger/quickcontact_arrow_down.png
new file mode 100644
index 0000000..7eba756
--- /dev/null
+++ b/res/drawable-hdpi-finger/quickcontact_arrow_down.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/quickcontact_arrow_up.png b/res/drawable-hdpi-finger/quickcontact_arrow_up.png
new file mode 100644
index 0000000..6daf90a
--- /dev/null
+++ b/res/drawable-hdpi-finger/quickcontact_arrow_up.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/quickcontact_bottom_frame.9.png b/res/drawable-hdpi-finger/quickcontact_bottom_frame.9.png
new file mode 100644
index 0000000..9fac225
--- /dev/null
+++ b/res/drawable-hdpi-finger/quickcontact_bottom_frame.9.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/quickcontact_disambig_bottom_bg.9.png b/res/drawable-hdpi-finger/quickcontact_disambig_bottom_bg.9.png
new file mode 100644
index 0000000..4702f16
--- /dev/null
+++ b/res/drawable-hdpi-finger/quickcontact_disambig_bottom_bg.9.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/quickcontact_disambig_checkbox_off.png b/res/drawable-hdpi-finger/quickcontact_disambig_checkbox_off.png
new file mode 100644
index 0000000..f87572c
--- /dev/null
+++ b/res/drawable-hdpi-finger/quickcontact_disambig_checkbox_off.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/quickcontact_disambig_checkbox_on.png b/res/drawable-hdpi-finger/quickcontact_disambig_checkbox_on.png
new file mode 100644
index 0000000..3ea5360
--- /dev/null
+++ b/res/drawable-hdpi-finger/quickcontact_disambig_checkbox_on.png
Binary files differ
diff --git a/res/drawable-finger/fasttrack_disambig_divider.9.png b/res/drawable-hdpi-finger/quickcontact_disambig_divider.9.png
similarity index 100%
rename from res/drawable-finger/fasttrack_disambig_divider.9.png
rename to res/drawable-hdpi-finger/quickcontact_disambig_divider.9.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/quickcontact_drop_shadow.9.png b/res/drawable-hdpi-finger/quickcontact_drop_shadow.9.png
new file mode 100644
index 0000000..5049903
--- /dev/null
+++ b/res/drawable-hdpi-finger/quickcontact_drop_shadow.9.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/quickcontact_frame_divider_med.png b/res/drawable-hdpi-finger/quickcontact_frame_divider_med.png
new file mode 100644
index 0000000..e0e9ca4
--- /dev/null
+++ b/res/drawable-hdpi-finger/quickcontact_frame_divider_med.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/quickcontact_slider_background.png b/res/drawable-hdpi-finger/quickcontact_slider_background.png
new file mode 100644
index 0000000..c9c09ee
--- /dev/null
+++ b/res/drawable-hdpi-finger/quickcontact_slider_background.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/quickcontact_slider_btn_normal.9.png b/res/drawable-hdpi-finger/quickcontact_slider_btn_normal.9.png
new file mode 100644
index 0000000..9d3d7ad
--- /dev/null
+++ b/res/drawable-hdpi-finger/quickcontact_slider_btn_normal.9.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/quickcontact_slider_btn_on.9.png b/res/drawable-hdpi-finger/quickcontact_slider_btn_on.9.png
new file mode 100644
index 0000000..ac2b496
--- /dev/null
+++ b/res/drawable-hdpi-finger/quickcontact_slider_btn_on.9.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/quickcontact_slider_btn_pressed.9.png b/res/drawable-hdpi-finger/quickcontact_slider_btn_pressed.9.png
new file mode 100644
index 0000000..d9da598
--- /dev/null
+++ b/res/drawable-hdpi-finger/quickcontact_slider_btn_pressed.9.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/quickcontact_slider_btn_selected.9.png b/res/drawable-hdpi-finger/quickcontact_slider_btn_selected.9.png
new file mode 100644
index 0000000..72d053b
--- /dev/null
+++ b/res/drawable-hdpi-finger/quickcontact_slider_btn_selected.9.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/quickcontact_slider_grip_left.png b/res/drawable-hdpi-finger/quickcontact_slider_grip_left.png
new file mode 100644
index 0000000..97f12aa
--- /dev/null
+++ b/res/drawable-hdpi-finger/quickcontact_slider_grip_left.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/quickcontact_slider_grip_right.png b/res/drawable-hdpi-finger/quickcontact_slider_grip_right.png
new file mode 100644
index 0000000..e410059
--- /dev/null
+++ b/res/drawable-hdpi-finger/quickcontact_slider_grip_right.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/quickcontact_slider_presence_active.png b/res/drawable-hdpi-finger/quickcontact_slider_presence_active.png
new file mode 100644
index 0000000..f62e681
--- /dev/null
+++ b/res/drawable-hdpi-finger/quickcontact_slider_presence_active.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/quickcontact_slider_presence_away.png b/res/drawable-hdpi-finger/quickcontact_slider_presence_away.png
new file mode 100644
index 0000000..0516b97
--- /dev/null
+++ b/res/drawable-hdpi-finger/quickcontact_slider_presence_away.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/quickcontact_slider_presence_busy.png b/res/drawable-hdpi-finger/quickcontact_slider_presence_busy.png
new file mode 100644
index 0000000..26063f4
--- /dev/null
+++ b/res/drawable-hdpi-finger/quickcontact_slider_presence_busy.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/quickcontact_slider_presence_inactive.png b/res/drawable-hdpi-finger/quickcontact_slider_presence_inactive.png
new file mode 100644
index 0000000..fdcf75e
--- /dev/null
+++ b/res/drawable-hdpi-finger/quickcontact_slider_presence_inactive.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/quickcontact_top_frame.9.png b/res/drawable-hdpi-finger/quickcontact_top_frame.9.png
new file mode 100644
index 0000000..4556bb2
--- /dev/null
+++ b/res/drawable-hdpi-finger/quickcontact_top_frame.9.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/sym_action_add.png b/res/drawable-hdpi-finger/sym_action_add.png
new file mode 100755
index 0000000..45a9ec5
--- /dev/null
+++ b/res/drawable-hdpi-finger/sym_action_add.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/sym_action_map.png b/res/drawable-hdpi-finger/sym_action_map.png
new file mode 100755
index 0000000..cf00c7b
--- /dev/null
+++ b/res/drawable-hdpi-finger/sym_action_map.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/sym_action_organization.png b/res/drawable-hdpi-finger/sym_action_organization.png
new file mode 100755
index 0000000..9db8b44
--- /dev/null
+++ b/res/drawable-hdpi-finger/sym_action_organization.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/sym_action_sms.png b/res/drawable-hdpi-finger/sym_action_sms.png
new file mode 100755
index 0000000..4596737
--- /dev/null
+++ b/res/drawable-hdpi-finger/sym_action_sms.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/sym_action_view_contact.png b/res/drawable-hdpi-finger/sym_action_view_contact.png
new file mode 100755
index 0000000..3a016ff
--- /dev/null
+++ b/res/drawable-hdpi-finger/sym_action_view_contact.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/sym_note.png b/res/drawable-hdpi-finger/sym_note.png
new file mode 100755
index 0000000..5257329
--- /dev/null
+++ b/res/drawable-hdpi-finger/sym_note.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/sym_ringtone.png b/res/drawable-hdpi-finger/sym_ringtone.png
new file mode 100755
index 0000000..ad103e8
--- /dev/null
+++ b/res/drawable-hdpi-finger/sym_ringtone.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/sym_send_to_voicemail.png b/res/drawable-hdpi-finger/sym_send_to_voicemail.png
new file mode 100755
index 0000000..ac43473
--- /dev/null
+++ b/res/drawable-hdpi-finger/sym_send_to_voicemail.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/title_bar_shadow.9.png b/res/drawable-hdpi-finger/title_bar_shadow.9.png
new file mode 100755
index 0000000..a5e458a
--- /dev/null
+++ b/res/drawable-hdpi-finger/title_bar_shadow.9.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_contacts_details.png b/res/drawable-hdpi/ic_contacts_details.png
new file mode 100755
index 0000000..35f8106
--- /dev/null
+++ b/res/drawable-hdpi/ic_contacts_details.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_launcher_contacts.png b/res/drawable-hdpi/ic_launcher_contacts.png
index 0bcbca4..be57b4a 100644
--- a/res/drawable-hdpi/ic_launcher_contacts.png
+++ b/res/drawable-hdpi/ic_launcher_contacts.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_import_export.png b/res/drawable-hdpi/ic_menu_import_export.png
new file mode 100644
index 0000000..1cefb7c
--- /dev/null
+++ b/res/drawable-hdpi/ic_menu_import_export.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_mark.png b/res/drawable-hdpi/ic_menu_mark.png
new file mode 100755
index 0000000..724d787
--- /dev/null
+++ b/res/drawable-hdpi/ic_menu_mark.png
Binary files differ
diff --git a/res/drawable-finger/badge_action_call.png b/res/drawable-mdpi-finger/badge_action_call.png
similarity index 100%
rename from res/drawable-finger/badge_action_call.png
rename to res/drawable-mdpi-finger/badge_action_call.png
Binary files differ
diff --git a/res/drawable-finger/badge_action_sms.png b/res/drawable-mdpi-finger/badge_action_sms.png
similarity index 100%
rename from res/drawable-finger/badge_action_sms.png
rename to res/drawable-mdpi-finger/badge_action_sms.png
Binary files differ
diff --git a/res/drawable-finger/btn_circle_disable.png b/res/drawable-mdpi-finger/btn_circle_disable.png
similarity index 100%
rename from res/drawable-finger/btn_circle_disable.png
rename to res/drawable-mdpi-finger/btn_circle_disable.png
Binary files differ
diff --git a/res/drawable-finger/btn_circle_disable_focused.png b/res/drawable-mdpi-finger/btn_circle_disable_focused.png
similarity index 100%
rename from res/drawable-finger/btn_circle_disable_focused.png
rename to res/drawable-mdpi-finger/btn_circle_disable_focused.png
Binary files differ
diff --git a/res/drawable-finger/btn_circle_normal.png b/res/drawable-mdpi-finger/btn_circle_normal.png
similarity index 100%
rename from res/drawable-finger/btn_circle_normal.png
rename to res/drawable-mdpi-finger/btn_circle_normal.png
Binary files differ
diff --git a/res/drawable-finger/btn_circle_pressed.png b/res/drawable-mdpi-finger/btn_circle_pressed.png
similarity index 100%
rename from res/drawable-finger/btn_circle_pressed.png
rename to res/drawable-mdpi-finger/btn_circle_pressed.png
Binary files differ
diff --git a/res/drawable-finger/btn_circle_selected.png b/res/drawable-mdpi-finger/btn_circle_selected.png
similarity index 100%
rename from res/drawable-finger/btn_circle_selected.png
rename to res/drawable-mdpi-finger/btn_circle_selected.png
Binary files differ
diff --git a/res/drawable-finger/contact_picture_border_highlight.9.png b/res/drawable-mdpi-finger/contact_picture_border_highlight.9.png
similarity index 100%
rename from res/drawable-finger/contact_picture_border_highlight.9.png
rename to res/drawable-mdpi-finger/contact_picture_border_highlight.9.png
Binary files differ
diff --git a/res/drawable-finger/contact_picture_border_in_list.9.png b/res/drawable-mdpi-finger/contact_picture_border_in_list.9.png
similarity index 100%
rename from res/drawable-finger/contact_picture_border_in_list.9.png
rename to res/drawable-mdpi-finger/contact_picture_border_in_list.9.png
Binary files differ
diff --git a/res/drawable-finger/contact_picture_border_normal.9.png b/res/drawable-mdpi-finger/contact_picture_border_normal.9.png
similarity index 100%
rename from res/drawable-finger/contact_picture_border_normal.9.png
rename to res/drawable-mdpi-finger/contact_picture_border_normal.9.png
Binary files differ
diff --git a/res/drawable-finger/contact_picture_border_pressed.9.png b/res/drawable-mdpi-finger/contact_picture_border_pressed.9.png
similarity index 100%
rename from res/drawable-finger/contact_picture_border_pressed.9.png
rename to res/drawable-mdpi-finger/contact_picture_border_pressed.9.png
Binary files differ
diff --git a/res/drawable-finger/ic_btn_round_minus.png b/res/drawable-mdpi-finger/ic_btn_round_minus.png
similarity index 100%
rename from res/drawable-finger/ic_btn_round_minus.png
rename to res/drawable-mdpi-finger/ic_btn_round_minus.png
Binary files differ
diff --git a/res/drawable-finger/ic_btn_round_more.png b/res/drawable-mdpi-finger/ic_btn_round_more.png
similarity index 100%
rename from res/drawable-finger/ic_btn_round_more.png
rename to res/drawable-mdpi-finger/ic_btn_round_more.png
Binary files differ
diff --git a/res/drawable-finger/ic_btn_round_plus.png b/res/drawable-mdpi-finger/ic_btn_round_plus.png
similarity index 100%
rename from res/drawable-finger/ic_btn_round_plus.png
rename to res/drawable-mdpi-finger/ic_btn_round_plus.png
Binary files differ
diff --git a/res/drawable-finger/ic_call_log_header_incoming_call.png b/res/drawable-mdpi-finger/ic_call_log_header_incoming_call.png
similarity index 100%
rename from res/drawable-finger/ic_call_log_header_incoming_call.png
rename to res/drawable-mdpi-finger/ic_call_log_header_incoming_call.png
Binary files differ
diff --git a/res/drawable-finger/ic_call_log_header_missed_call.png b/res/drawable-mdpi-finger/ic_call_log_header_missed_call.png
similarity index 100%
rename from res/drawable-finger/ic_call_log_header_missed_call.png
rename to res/drawable-mdpi-finger/ic_call_log_header_missed_call.png
Binary files differ
diff --git a/res/drawable-finger/ic_call_log_header_outgoing_call.png b/res/drawable-mdpi-finger/ic_call_log_header_outgoing_call.png
similarity index 100%
rename from res/drawable-finger/ic_call_log_header_outgoing_call.png
rename to res/drawable-mdpi-finger/ic_call_log_header_outgoing_call.png
Binary files differ
diff --git a/res/drawable-finger/ic_call_log_list_incoming_call.png b/res/drawable-mdpi-finger/ic_call_log_list_incoming_call.png
similarity index 100%
rename from res/drawable-finger/ic_call_log_list_incoming_call.png
rename to res/drawable-mdpi-finger/ic_call_log_list_incoming_call.png
Binary files differ
diff --git a/res/drawable-finger/ic_call_log_list_missed_call.png b/res/drawable-mdpi-finger/ic_call_log_list_missed_call.png
similarity index 100%
rename from res/drawable-finger/ic_call_log_list_missed_call.png
rename to res/drawable-mdpi-finger/ic_call_log_list_missed_call.png
Binary files differ
diff --git a/res/drawable-finger/ic_call_log_list_outgoing_call.png b/res/drawable-mdpi-finger/ic_call_log_list_outgoing_call.png
similarity index 100%
rename from res/drawable-finger/ic_call_log_list_outgoing_call.png
rename to res/drawable-mdpi-finger/ic_call_log_list_outgoing_call.png
Binary files differ
diff --git a/res/drawable-finger/ic_contact_list_picture.png b/res/drawable-mdpi-finger/ic_contact_list_picture.png
similarity index 100%
rename from res/drawable-finger/ic_contact_list_picture.png
rename to res/drawable-mdpi-finger/ic_contact_list_picture.png
Binary files differ
diff --git a/res/drawable-finger/ic_contact_picture.png b/res/drawable-mdpi-finger/ic_contact_picture.png
similarity index 100%
rename from res/drawable-finger/ic_contact_picture.png
rename to res/drawable-mdpi-finger/ic_contact_picture.png
Binary files differ
diff --git a/res/drawable-finger/ic_contact_picture_2.png b/res/drawable-mdpi-finger/ic_contact_picture_2.png
similarity index 100%
rename from res/drawable-finger/ic_contact_picture_2.png
rename to res/drawable-mdpi-finger/ic_contact_picture_2.png
Binary files differ
diff --git a/res/drawable-finger/ic_contact_picture_3.png b/res/drawable-mdpi-finger/ic_contact_picture_3.png
similarity index 100%
rename from res/drawable-finger/ic_contact_picture_3.png
rename to res/drawable-mdpi-finger/ic_contact_picture_3.png
Binary files differ
diff --git a/res/drawable-finger/ic_default_number.png b/res/drawable-mdpi-finger/ic_default_number.png
similarity index 100%
rename from res/drawable-finger/ic_default_number.png
rename to res/drawable-mdpi-finger/ic_default_number.png
Binary files differ
diff --git a/res/drawable-finger/ic_dial_number_blk.png b/res/drawable-mdpi-finger/ic_dial_number_blk.png
similarity index 100%
rename from res/drawable-finger/ic_dial_number_blk.png
rename to res/drawable-mdpi-finger/ic_dial_number_blk.png
Binary files differ
diff --git a/res/drawable-finger/ic_dial_number_wht.png b/res/drawable-mdpi-finger/ic_dial_number_wht.png
similarity index 100%
rename from res/drawable-finger/ic_dial_number_wht.png
rename to res/drawable-mdpi-finger/ic_dial_number_wht.png
Binary files differ
diff --git a/res/drawable-finger/ic_dialer_fork_add_call.png b/res/drawable-mdpi-finger/ic_dialer_fork_add_call.png
similarity index 100%
rename from res/drawable-finger/ic_dialer_fork_add_call.png
rename to res/drawable-mdpi-finger/ic_dialer_fork_add_call.png
Binary files differ
diff --git a/res/drawable-finger/ic_dialer_fork_current_call.png b/res/drawable-mdpi-finger/ic_dialer_fork_current_call.png
similarity index 100%
rename from res/drawable-finger/ic_dialer_fork_current_call.png
rename to res/drawable-mdpi-finger/ic_dialer_fork_current_call.png
Binary files differ
diff --git a/res/drawable-finger/ic_dialer_fork_tt_keypad.png b/res/drawable-mdpi-finger/ic_dialer_fork_tt_keypad.png
similarity index 100%
rename from res/drawable-finger/ic_dialer_fork_tt_keypad.png
rename to res/drawable-mdpi-finger/ic_dialer_fork_tt_keypad.png
Binary files differ
diff --git a/res/drawable-finger/ic_menu_account_list.png b/res/drawable-mdpi-finger/ic_menu_account_list.png
similarity index 100%
rename from res/drawable-finger/ic_menu_account_list.png
rename to res/drawable-mdpi-finger/ic_menu_account_list.png
Binary files differ
diff --git a/res/drawable-finger/ic_menu_add_picture.png b/res/drawable-mdpi-finger/ic_menu_add_picture.png
similarity index 100%
rename from res/drawable-finger/ic_menu_add_picture.png
rename to res/drawable-mdpi-finger/ic_menu_add_picture.png
Binary files differ
diff --git a/res/drawable-finger/ic_menu_export_contact.png b/res/drawable-mdpi-finger/ic_menu_export_contact.png
similarity index 100%
rename from res/drawable-finger/ic_menu_export_contact.png
rename to res/drawable-mdpi-finger/ic_menu_export_contact.png
Binary files differ
diff --git a/res/drawable-finger/ic_menu_import_contact.png b/res/drawable-mdpi-finger/ic_menu_import_contact.png
similarity index 100%
rename from res/drawable-finger/ic_menu_import_contact.png
rename to res/drawable-mdpi-finger/ic_menu_import_contact.png
Binary files differ
diff --git a/res/drawable-finger/ic_menu_merge.png b/res/drawable-mdpi-finger/ic_menu_merge.png
similarity index 100%
rename from res/drawable-finger/ic_menu_merge.png
rename to res/drawable-mdpi-finger/ic_menu_merge.png
Binary files differ
diff --git a/res/drawable-finger/ic_menu_show_barcode.png b/res/drawable-mdpi-finger/ic_menu_show_barcode.png
similarity index 100%
rename from res/drawable-finger/ic_menu_show_barcode.png
rename to res/drawable-mdpi-finger/ic_menu_show_barcode.png
Binary files differ
diff --git a/res/drawable-finger/ic_tab_selected_friends_list.png b/res/drawable-mdpi-finger/ic_tab_selected_friends_list.png
similarity index 100%
rename from res/drawable-finger/ic_tab_selected_friends_list.png
rename to res/drawable-mdpi-finger/ic_tab_selected_friends_list.png
Binary files differ
diff --git a/res/drawable-finger/ic_tab_unselected_friends_list.png b/res/drawable-mdpi-finger/ic_tab_unselected_friends_list.png
similarity index 100%
rename from res/drawable-finger/ic_tab_unselected_friends_list.png
rename to res/drawable-mdpi-finger/ic_tab_unselected_friends_list.png
Binary files differ
diff --git a/res/drawable-finger/fasttrack_arrow_down.png b/res/drawable-mdpi-finger/quickcontact_arrow_down.png
similarity index 100%
rename from res/drawable-finger/fasttrack_arrow_down.png
rename to res/drawable-mdpi-finger/quickcontact_arrow_down.png
Binary files differ
diff --git a/res/drawable-finger/fasttrack_arrow_up.png b/res/drawable-mdpi-finger/quickcontact_arrow_up.png
similarity index 100%
rename from res/drawable-finger/fasttrack_arrow_up.png
rename to res/drawable-mdpi-finger/quickcontact_arrow_up.png
Binary files differ
diff --git a/res/drawable-finger/fasttrack_bottom_frame.9.png b/res/drawable-mdpi-finger/quickcontact_bottom_frame.9.png
similarity index 100%
rename from res/drawable-finger/fasttrack_bottom_frame.9.png
rename to res/drawable-mdpi-finger/quickcontact_bottom_frame.9.png
Binary files differ
diff --git a/res/drawable-finger/fasttrack_disambig_bottom_bg.9.png b/res/drawable-mdpi-finger/quickcontact_disambig_bottom_bg.9.png
similarity index 100%
rename from res/drawable-finger/fasttrack_disambig_bottom_bg.9.png
rename to res/drawable-mdpi-finger/quickcontact_disambig_bottom_bg.9.png
Binary files differ
diff --git a/res/drawable-finger/fasttrack_disambig_checkbox_off.png b/res/drawable-mdpi-finger/quickcontact_disambig_checkbox_off.png
similarity index 100%
rename from res/drawable-finger/fasttrack_disambig_checkbox_off.png
rename to res/drawable-mdpi-finger/quickcontact_disambig_checkbox_off.png
Binary files differ
diff --git a/res/drawable-finger/fasttrack_disambig_checkbox_on.png b/res/drawable-mdpi-finger/quickcontact_disambig_checkbox_on.png
similarity index 100%
rename from res/drawable-finger/fasttrack_disambig_checkbox_on.png
rename to res/drawable-mdpi-finger/quickcontact_disambig_checkbox_on.png
Binary files differ
diff --git a/res/drawable-finger/fasttrack_disambig_divider.9.png b/res/drawable-mdpi-finger/quickcontact_disambig_divider.9.png
similarity index 100%
copy from res/drawable-finger/fasttrack_disambig_divider.9.png
copy to res/drawable-mdpi-finger/quickcontact_disambig_divider.9.png
Binary files differ
diff --git a/res/drawable-finger/fasttrack_drop_shadow.9.png b/res/drawable-mdpi-finger/quickcontact_drop_shadow.9.png
similarity index 100%
rename from res/drawable-finger/fasttrack_drop_shadow.9.png
rename to res/drawable-mdpi-finger/quickcontact_drop_shadow.9.png
Binary files differ
diff --git a/res/drawable-finger/fasttrack_frame_divider_med.png b/res/drawable-mdpi-finger/quickcontact_frame_divider_med.png
similarity index 100%
rename from res/drawable-finger/fasttrack_frame_divider_med.png
rename to res/drawable-mdpi-finger/quickcontact_frame_divider_med.png
Binary files differ
diff --git a/res/drawable-mdpi-finger/quickcontact_slider_background.png b/res/drawable-mdpi-finger/quickcontact_slider_background.png
new file mode 100644
index 0000000..b6a9f91
--- /dev/null
+++ b/res/drawable-mdpi-finger/quickcontact_slider_background.png
Binary files differ
diff --git a/res/drawable-mdpi-finger/quickcontact_slider_btn_normal.9.png b/res/drawable-mdpi-finger/quickcontact_slider_btn_normal.9.png
new file mode 100644
index 0000000..cf4f1e4
--- /dev/null
+++ b/res/drawable-mdpi-finger/quickcontact_slider_btn_normal.9.png
Binary files differ
diff --git a/res/drawable-mdpi-finger/quickcontact_slider_btn_on.9.png b/res/drawable-mdpi-finger/quickcontact_slider_btn_on.9.png
new file mode 100644
index 0000000..330f49b
--- /dev/null
+++ b/res/drawable-mdpi-finger/quickcontact_slider_btn_on.9.png
Binary files differ
diff --git a/res/drawable-mdpi-finger/quickcontact_slider_btn_pressed.9.png b/res/drawable-mdpi-finger/quickcontact_slider_btn_pressed.9.png
new file mode 100644
index 0000000..d4916f5
--- /dev/null
+++ b/res/drawable-mdpi-finger/quickcontact_slider_btn_pressed.9.png
Binary files differ
diff --git a/res/drawable-mdpi-finger/quickcontact_slider_btn_selected.9.png b/res/drawable-mdpi-finger/quickcontact_slider_btn_selected.9.png
new file mode 100644
index 0000000..b910028
--- /dev/null
+++ b/res/drawable-mdpi-finger/quickcontact_slider_btn_selected.9.png
Binary files differ
diff --git a/res/drawable-finger/fasttrack_slider_grip_left.png b/res/drawable-mdpi-finger/quickcontact_slider_grip_left.png
similarity index 100%
rename from res/drawable-finger/fasttrack_slider_grip_left.png
rename to res/drawable-mdpi-finger/quickcontact_slider_grip_left.png
Binary files differ
diff --git a/res/drawable-finger/fasttrack_slider_grip_right.png b/res/drawable-mdpi-finger/quickcontact_slider_grip_right.png
similarity index 100%
rename from res/drawable-finger/fasttrack_slider_grip_right.png
rename to res/drawable-mdpi-finger/quickcontact_slider_grip_right.png
Binary files differ
diff --git a/res/drawable-finger/fasttrack_slider_presence_active.png b/res/drawable-mdpi-finger/quickcontact_slider_presence_active.png
similarity index 100%
rename from res/drawable-finger/fasttrack_slider_presence_active.png
rename to res/drawable-mdpi-finger/quickcontact_slider_presence_active.png
Binary files differ
diff --git a/res/drawable-finger/fasttrack_slider_presence_away.png b/res/drawable-mdpi-finger/quickcontact_slider_presence_away.png
similarity index 100%
rename from res/drawable-finger/fasttrack_slider_presence_away.png
rename to res/drawable-mdpi-finger/quickcontact_slider_presence_away.png
Binary files differ
diff --git a/res/drawable-finger/fasttrack_slider_presence_busy.png b/res/drawable-mdpi-finger/quickcontact_slider_presence_busy.png
similarity index 100%
rename from res/drawable-finger/fasttrack_slider_presence_busy.png
rename to res/drawable-mdpi-finger/quickcontact_slider_presence_busy.png
Binary files differ
diff --git a/res/drawable-finger/fasttrack_slider_presence_inactive.png b/res/drawable-mdpi-finger/quickcontact_slider_presence_inactive.png
similarity index 100%
rename from res/drawable-finger/fasttrack_slider_presence_inactive.png
rename to res/drawable-mdpi-finger/quickcontact_slider_presence_inactive.png
Binary files differ
diff --git a/res/drawable-finger/fasttrack_top_frame.9.png b/res/drawable-mdpi-finger/quickcontact_top_frame.9.png
similarity index 100%
rename from res/drawable-finger/fasttrack_top_frame.9.png
rename to res/drawable-mdpi-finger/quickcontact_top_frame.9.png
Binary files differ
diff --git a/res/drawable-finger/sym_action_add.png b/res/drawable-mdpi-finger/sym_action_add.png
similarity index 100%
rename from res/drawable-finger/sym_action_add.png
rename to res/drawable-mdpi-finger/sym_action_add.png
Binary files differ
diff --git a/res/drawable-finger/sym_action_map.png b/res/drawable-mdpi-finger/sym_action_map.png
similarity index 100%
rename from res/drawable-finger/sym_action_map.png
rename to res/drawable-mdpi-finger/sym_action_map.png
Binary files differ
diff --git a/res/drawable-finger/sym_action_organization.png b/res/drawable-mdpi-finger/sym_action_organization.png
similarity index 100%
rename from res/drawable-finger/sym_action_organization.png
rename to res/drawable-mdpi-finger/sym_action_organization.png
Binary files differ
diff --git a/res/drawable-mdpi-finger/sym_action_sms.png b/res/drawable-mdpi-finger/sym_action_sms.png
new file mode 100644
index 0000000..3e4eea2
--- /dev/null
+++ b/res/drawable-mdpi-finger/sym_action_sms.png
Binary files differ
diff --git a/res/drawable-finger/sym_action_view_contact.png b/res/drawable-mdpi-finger/sym_action_view_contact.png
similarity index 100%
rename from res/drawable-finger/sym_action_view_contact.png
rename to res/drawable-mdpi-finger/sym_action_view_contact.png
Binary files differ
diff --git a/res/drawable-finger/sym_note.png b/res/drawable-mdpi-finger/sym_note.png
similarity index 100%
rename from res/drawable-finger/sym_note.png
rename to res/drawable-mdpi-finger/sym_note.png
Binary files differ
diff --git a/res/drawable-finger/sym_ringtone.png b/res/drawable-mdpi-finger/sym_ringtone.png
similarity index 100%
rename from res/drawable-finger/sym_ringtone.png
rename to res/drawable-mdpi-finger/sym_ringtone.png
Binary files differ
diff --git a/res/drawable-finger/sym_send_to_voicemail.png b/res/drawable-mdpi-finger/sym_send_to_voicemail.png
similarity index 100%
rename from res/drawable-finger/sym_send_to_voicemail.png
rename to res/drawable-mdpi-finger/sym_send_to_voicemail.png
Binary files differ
diff --git a/res/drawable-finger/title_bar_shadow.9.png b/res/drawable-mdpi-finger/title_bar_shadow.9.png
similarity index 100%
rename from res/drawable-finger/title_bar_shadow.9.png
rename to res/drawable-mdpi-finger/title_bar_shadow.9.png
Binary files differ
diff --git a/res/drawable/ic_contacts_details.png b/res/drawable-mdpi/ic_contacts_details.png
similarity index 100%
rename from res/drawable/ic_contacts_details.png
rename to res/drawable-mdpi/ic_contacts_details.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_menu_import_export.png b/res/drawable-mdpi/ic_menu_import_export.png
new file mode 100644
index 0000000..4f1b608
--- /dev/null
+++ b/res/drawable-mdpi/ic_menu_import_export.png
Binary files differ
diff --git a/res/drawable/ic_menu_mark.png b/res/drawable-mdpi/ic_menu_mark.png
similarity index 100%
rename from res/drawable/ic_menu_mark.png
rename to res/drawable-mdpi/ic_menu_mark.png
Binary files differ
diff --git a/res/drawable/fasttrack.9.png b/res/drawable/quickcontact.9.png
similarity index 100%
rename from res/drawable/fasttrack.9.png
rename to res/drawable/quickcontact.9.png
Binary files differ
diff --git a/res/layout-finger/contact_card_layout.xml b/res/layout-finger/contact_card_layout.xml
index 3f090f5..19ef744 100644
--- a/res/layout-finger/contact_card_layout.xml
+++ b/res/layout-finger/contact_card_layout.xml
@@ -14,7 +14,7 @@
      limitations under the License.
 -->
 
-<com.android.contacts.ReverseZOrderLinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@+id/card_root_view"
     android:orientation="vertical"
     android:layout_width="fill_parent"
@@ -25,30 +25,17 @@
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"/>
         
-    <LinearLayout
-        android:id="@+id/below_header"
+    <FrameLayout android:id="@android:id/tabcontent"
         android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:orientation="vertical"
+        android:layout_height="0dip"
         android:layout_weight="1">
         
-        <com.android.contacts.ScrollingTabWidget android:id="@+id/tab_widget"
+        <View
             android:layout_width="fill_parent"
-            android:layout_height="wrap_content"/>
-        
-        <FrameLayout android:id="@android:id/tabcontent"
-            android:layout_width="fill_parent"
-            android:layout_height="0dip"
-            android:layout_weight="1">
-            
-            <View
-                android:layout_width="fill_parent"
-                android:layout_height="wrap_content"
-                android:background="@drawable/title_bar_shadow"
-            />
+            android:layout_height="wrap_content"
+            android:background="@drawable/title_bar_shadow"
+        />
         </FrameLayout>
-        
-    </LinearLayout>
             
-</com.android.contacts.ReverseZOrderLinearLayout>
+</LinearLayout>
 
diff --git a/res/layout-finger/contacts_list_item.xml b/res/layout-finger/contacts_list_item.xml
index 0e7852e..775e163 100644
--- a/res/layout-finger/contacts_list_item.xml
+++ b/res/layout-finger/contacts_list_item.xml
@@ -58,7 +58,9 @@
                 <View android:id="@+id/divider"
                     android:layout_width="1px"
                     android:layout_height="fill_parent"
-                    android:background="@*android:drawable/divider_vertical_dark_opaque"
+                    android:layout_marginTop="5dip"
+                    android:layout_marginBottom="5dip"
+                    android:background="@drawable/divider_vertical_dark"
                 />
 
                 <com.android.contacts.ui.widget.DontPressWithParentImageView android:id="@+id/call_button"
diff --git a/res/layout-finger/contacts_list_item_photo.xml b/res/layout-finger/contacts_list_item_photo.xml
index b15c586..f387502 100644
--- a/res/layout-finger/contacts_list_item_photo.xml
+++ b/res/layout-finger/contacts_list_item_photo.xml
@@ -30,7 +30,7 @@
     <RelativeLayout
         android:layout_width="fill_parent"
         android:layout_height="?android:attr/listPreferredItemHeight"
-        android:paddingLeft="5dip"
+        android:paddingLeft="4dip"
     >
 
         <LinearLayout android:id="@+id/right_side"
@@ -58,7 +58,9 @@
                 <View android:id="@+id/divider"
                     android:layout_width="1px"
                     android:layout_height="fill_parent"
-                    android:background="@*android:drawable/divider_vertical_dark_opaque"
+                    android:layout_marginTop="5dip"
+                    android:layout_marginBottom="5dip"
+                    android:background="@drawable/divider_vertical_dark"
                 />
 
                 <com.android.contacts.ui.widget.DontPressWithParentImageView android:id="@+id/call_button"
diff --git a/res/layout-finger/list_item_text_icons.xml b/res/layout-finger/list_item_text_icons.xml
index f87aab8..552d28a 100644
--- a/res/layout-finger/list_item_text_icons.xml
+++ b/res/layout-finger/list_item_text_icons.xml
@@ -43,28 +43,28 @@
             android:textAppearance="?android:attr/textAppearanceLarge"
         />
 
-		<LinearLayout
-		    android:layout_width="wrap_content"
-		    android:layout_height="wrap_content"
-		    android:orientation="horizontal"
-		>
-		    
-	        <TextView android:id="@android:id/text2"
-	            android:layout_width="wrap_content"
-	            android:layout_height="wrap_content"
-	            android:layout_gravity="center_vertical"
-	            android:textAppearance="?android:attr/textAppearanceSmall"
-	        />
-	
-	        <ImageView android:id="@+id/primary_icon"
-	            android:layout_width="wrap_content"
-	            android:layout_height="wrap_content"
-	            android:layout_gravity="center_vertical"
-	            android:paddingLeft="3dip"
-	            android:src="@drawable/ic_default_number"
-	        />
-    	</LinearLayout>
-    	
+        <LinearLayout
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal"
+        >
+            
+            <TextView android:id="@android:id/text2"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center_vertical"
+                android:textAppearance="?android:attr/textAppearanceSmall"
+            />
+    
+            <ImageView android:id="@+id/primary_icon"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center_vertical"
+                android:paddingLeft="3dip"
+                android:src="@drawable/ic_default_number"
+            />
+        </LinearLayout>
+        
     </LinearLayout>
 
     <ImageView android:id="@+id/presence_icon"
@@ -85,8 +85,10 @@
     />
     
     <View android:id="@+id/divider"
-        android:layout_width="1dip"
+        android:layout_width="1px"
         android:layout_height="fill_parent"
+        android:layout_marginTop="5dip"
+        android:layout_marginBottom="5dip"
         android:background="@drawable/divider_vertical_dark"
     />
 
diff --git a/res/layout-finger/fasttrack.xml b/res/layout-finger/quickcontact.xml
similarity index 79%
rename from res/layout-finger/fasttrack.xml
rename to res/layout-finger/quickcontact.xml
index 46e5d63..33007f7 100644
--- a/res/layout-finger/fasttrack.xml
+++ b/res/layout-finger/quickcontact.xml
@@ -18,7 +18,7 @@
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
-    android:background="@drawable/fasttrack_drop_shadow">
+    android:background="@drawable/quickcontact_drop_shadow">
 
     <FrameLayout
         android:id="@+id/header"
@@ -31,21 +31,21 @@
             android:inflatedId="@+id/header_small"
             android:layout_width="fill_parent"
             android:layout_height="wrap_content"
-            android:layout="@layout/fasttrack_header_small" />
+            android:layout="@layout/quickcontact_header_small" />
 
         <ViewStub
             android:id="@+id/header_medium"
             android:inflatedId="@+id/header_medium"
             android:layout_width="fill_parent"
             android:layout_height="wrap_content"
-            android:layout="@layout/fasttrack_header_med" />
+            android:layout="@layout/quickcontact_header_med" />
 
         <ViewStub
             android:id="@+id/header_large"
             android:inflatedId="@+id/header_large"
             android:layout_width="fill_parent"
             android:layout_height="wrap_content"
-            android:layout="@layout/fasttrack_header_large" />
+            android:layout="@layout/quickcontact_header_large" />
 
     </FrameLayout>
 
@@ -55,11 +55,11 @@
         android:layout_height="wrap_content"
         android:layout_below="@id/header"
         android:fadingEdgeLength="0dip"
-        android:background="@drawable/fasttrack_slider_background"
+        android:background="@drawable/quickcontact_slider_background"
         android:scrollbars="none">
 
         <LinearLayout
-            android:id="@+id/fasttrack"
+            android:id="@+id/quickcontact"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:paddingTop="4dip"
@@ -69,12 +69,12 @@
             <ImageView
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:src="@drawable/fasttrack_slider_grip_left" />
+                android:src="@drawable/quickcontact_slider_grip_left" />
 
             <ImageView
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:src="@drawable/fasttrack_slider_grip_right" />
+                android:src="@drawable/quickcontact_slider_grip_right" />
 
         </LinearLayout>
 
@@ -85,14 +85,14 @@
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
         android:layout_below="@id/scroll"
-        android:background="@drawable/fasttrack_bottom_frame" />
+        android:background="@drawable/quickcontact_bottom_frame" />
 
     <LinearLayout
         android:id="@+id/footer_disambig"
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
         android:layout_below="@id/scroll"
-        android:background="@drawable/fasttrack_disambig_bottom_bg"
+        android:background="@drawable/quickcontact_disambig_bottom_bg"
         android:orientation="vertical"
         android:visibility="gone">
 
@@ -101,8 +101,8 @@
             android:layout_width="fill_parent"
             android:layout_height="0dip"
 	    android:layout_weight="1"
-            android:background="@color/fasttrack_disambig"
-            android:divider="@drawable/fasttrack_disambig_divider"
+            android:background="@color/quickcontact_disambig"
+            android:divider="@drawable/quickcontact_disambig_divider"
             android:cacheColorHint="@null" />
 
         <CheckBox
@@ -114,9 +114,9 @@
             android:minHeight="60dip"
             android:textColor="#f000"
             android:textStyle="bold"
-            android:text="@string/fasttrack_remember_choice"
+            android:text="@string/quickcontact_remember_choice"
             android:textAppearance="?android:attr/textAppearanceSmallInverse"
-            android:button="@drawable/fasttrack_disambig_checkbox" />
+            android:button="@drawable/quickcontact_disambig_checkbox" />
 
     </LinearLayout>
 
@@ -124,7 +124,7 @@
         android:id="@+id/arrow_up"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:src="@drawable/fasttrack_arrow_up" />
+        android:src="@drawable/quickcontact_arrow_up" />
 
     <ImageView
         android:id="@+id/arrow_down"
@@ -132,6 +132,6 @@
         android:layout_height="wrap_content"
         android:layout_marginTop="-1dip"
         android:layout_below="@id/footer"
-        android:src="@drawable/fasttrack_arrow_down" />
+        android:src="@drawable/quickcontact_arrow_down" />
 
 </RelativeLayout>
diff --git a/res/layout-finger/fasttrack_header_large.xml b/res/layout-finger/quickcontact_header_large.xml
similarity index 94%
rename from res/layout-finger/fasttrack_header_large.xml
rename to res/layout-finger/quickcontact_header_large.xml
index f950349..c94f1ad 100644
--- a/res/layout-finger/fasttrack_header_large.xml
+++ b/res/layout-finger/quickcontact_header_large.xml
@@ -20,7 +20,7 @@
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:minHeight="87dip"
-    android:background="@drawable/fasttrack_top_frame"
+    android:background="@drawable/quickcontact_top_frame"
     android:gravity="center_vertical"
     android:orientation="horizontal">
 
@@ -57,7 +57,7 @@
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_marginRight="15dip"
-        android:src="@drawable/fasttrack_slider_presence_active"
+        android:src="@drawable/quickcontact_slider_presence_active"
         android:scaleType="centerInside" />
 
 </LinearLayout>
diff --git a/res/layout-finger/fasttrack_header_med.xml b/res/layout-finger/quickcontact_header_med.xml
similarity index 93%
rename from res/layout-finger/fasttrack_header_med.xml
rename to res/layout-finger/quickcontact_header_med.xml
index 98e9233..3533502 100644
--- a/res/layout-finger/fasttrack_header_med.xml
+++ b/res/layout-finger/quickcontact_header_med.xml
@@ -20,7 +20,7 @@
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:minHeight="45dip"
-    android:background="@drawable/fasttrack_top_frame"
+    android:background="@drawable/quickcontact_top_frame"
     android:gravity="center_vertical"
     android:orientation="horizontal">
 
@@ -40,7 +40,7 @@
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_marginTop="1dip"
-        android:src="@drawable/fasttrack_frame_divider_med" />
+        android:src="@drawable/quickcontact_frame_divider_med" />
 
     <ImageView
         android:id="@+id/source"
diff --git a/res/layout-finger/fasttrack_header_small.xml b/res/layout-finger/quickcontact_header_small.xml
similarity index 93%
rename from res/layout-finger/fasttrack_header_small.xml
rename to res/layout-finger/quickcontact_header_small.xml
index feb49f2..3711dcc 100644
--- a/res/layout-finger/fasttrack_header_small.xml
+++ b/res/layout-finger/quickcontact_header_small.xml
@@ -19,5 +19,5 @@
     android:id="@+id/header_small"
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
-    android:background="@drawable/fasttrack_top_frame"
+    android:background="@drawable/quickcontact_top_frame"
     android:orientation="horizontal" />
diff --git a/res/layout-finger/fasttrack_item.xml b/res/layout-finger/quickcontact_item.xml
similarity index 94%
rename from res/layout-finger/fasttrack_item.xml
rename to res/layout-finger/quickcontact_item.xml
index 58d85aa..819915d 100644
--- a/res/layout-finger/fasttrack_item.xml
+++ b/res/layout-finger/quickcontact_item.xml
@@ -25,4 +25,4 @@
     android:scaleType="centerInside"
     android:focusable="true"
     android:clickable="true"
-    android:background="@drawable/fasttrack_slider_btn" />
+    android:background="@drawable/quickcontact_slider_btn" />
diff --git a/res/layout-finger/fasttrack_resolve_item.xml b/res/layout-finger/quickcontact_resolve_item.xml
similarity index 100%
rename from res/layout-finger/fasttrack_resolve_item.xml
rename to res/layout-finger/quickcontact_resolve_item.xml
diff --git a/res/menu/edit.xml b/res/menu/edit.xml
index 3a24f27..658a567 100644
--- a/res/menu/edit.xml
+++ b/res/menu/edit.xml
@@ -47,4 +47,13 @@
         android:icon="@android:drawable/ic_menu_delete"
         android:title="@string/removePicture" />
 
+    <item
+        android:id="@+id/menu_split"
+        android:icon="@drawable/ic_menu_merge"
+        android:title="@string/menu_splitAggregate" />
+
+    <item
+        android:id="@+id/menu_join"
+        android:icon="@drawable/ic_menu_merge"
+        android:title="@string/menu_joinAggregate" />
 </menu>
diff --git a/res/menu/list.xml b/res/menu/list.xml
index b5a2750..b8f9b76 100644
--- a/res/menu/list.xml
+++ b/res/menu/list.xml
@@ -38,7 +38,7 @@
 
     <item
         android:id="@+id/menu_import_export"
-        android:icon="@drawable/ic_menu_export_contact"
+        android:icon="@drawable/ic_menu_import_export"
         android:title="@string/menu_import_export" />
 
 </menu>
diff --git a/res/menu/view.xml b/res/menu/view.xml
index 5df87e6..428434d 100644
--- a/res/menu/view.xml
+++ b/res/menu/view.xml
@@ -32,23 +32,6 @@
         android:icon="@drawable/ic_menu_mark"
         android:title="@string/menu_contactOptions" />
 
-    <!-- TODO: use new split/join icons -->
-    
-    <item
-        android:id="@+id/menu_show_sources"
-        android:icon="@drawable/ic_menu_sources"
-        android:title="@string/menu_showSources" />
-    
-    <item
-        android:id="@+id/menu_hide_sources"
-        android:icon="@drawable/ic_menu_sources"
-        android:title="@string/menu_hideSources" />
-        
-    <item
-        android:id="@+id/menu_join"
-        android:icon="@drawable/ic_menu_merge"
-        android:title="@string/menu_joinAggregate" />
-
     <item
         android:id="@+id/menu_delete"
         android:icon="@android:drawable/ic_menu_delete"
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index 2b3c3fc..79c7f19 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -281,9 +281,9 @@
     <skip />
     <!-- no translation found for make_primary (5829291915305113983) -->
     <skip />
-    <string name="fasttrack_missing_app" msgid="1181287640680679441">"Aplikace potřebná k provedení této akce nebyla nalezena"</string>
-    <string name="fasttrack_remember_choice" msgid="2858356075887897116">"Zapamatovat tuto volbu"</string>
-    <string name="fasttrack_missing_name" msgid="7806083820928955853">"Neznámé"</string>
+    <string name="quickcontact_missing_app" msgid="1181287640680679441">"Aplikace potřebná k provedení této akce nebyla nalezena"</string>
+    <string name="quickcontact_remember_choice" msgid="2858356075887897116">"Zapamatovat tuto volbu"</string>
+    <string name="quickcontact_missing_name" msgid="7806083820928955853">"Neznámé"</string>
     <string name="menu_accounts" msgid="8499114602017077970">"Účty"</string>
     <!-- no translation found for menu_import_export (3765725645491577190) -->
     <skip />
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 88d3563..1a3d060 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -281,9 +281,9 @@
     <skip />
     <!-- no translation found for make_primary (5829291915305113983) -->
     <skip />
-    <string name="fasttrack_missing_app" msgid="1181287640680679441">"Der blev ikke fundet noget program til denne handling"</string>
-    <string name="fasttrack_remember_choice" msgid="2858356075887897116">"Husk dette valg"</string>
-    <string name="fasttrack_missing_name" msgid="7806083820928955853">"Ukendte"</string>
+    <string name="quickcontact_missing_app" msgid="1181287640680679441">"Der blev ikke fundet noget program til denne handling"</string>
+    <string name="quickcontact_remember_choice" msgid="2858356075887897116">"Husk dette valg"</string>
+    <string name="quickcontact_missing_name" msgid="7806083820928955853">"Ukendte"</string>
     <string name="menu_accounts" msgid="8499114602017077970">"Konti"</string>
     <!-- no translation found for menu_import_export (3765725645491577190) -->
     <skip />
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index b45e33a..e13626a 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -281,9 +281,9 @@
     <skip />
     <!-- no translation found for make_primary (5829291915305113983) -->
     <skip />
-    <string name="fasttrack_missing_app" msgid="1181287640680679441">"Für diese Aktion wurde keine Anwendung gefunden."</string>
-    <string name="fasttrack_remember_choice" msgid="2858356075887897116">"Diese Auswahl speichern"</string>
-    <string name="fasttrack_missing_name" msgid="7806083820928955853">"Unbekannt"</string>
+    <string name="quickcontact_missing_app" msgid="1181287640680679441">"Für diese Aktion wurde keine Anwendung gefunden."</string>
+    <string name="quickcontact_remember_choice" msgid="2858356075887897116">"Diese Auswahl speichern"</string>
+    <string name="quickcontact_missing_name" msgid="7806083820928955853">"Unbekannt"</string>
     <string name="menu_accounts" msgid="8499114602017077970">"Konten"</string>
     <!-- no translation found for menu_import_export (3765725645491577190) -->
     <skip />
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index ce6be87..71bb3bd 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -281,9 +281,9 @@
     <skip />
     <!-- no translation found for make_primary (5829291915305113983) -->
     <skip />
-    <string name="fasttrack_missing_app" msgid="1181287640680679441">"Δεν υπάρχει εφαρμογή για τη διαχείριση αυτής της ενέργειας"</string>
-    <string name="fasttrack_remember_choice" msgid="2858356075887897116">"Διατήρηση αυτής της ρύθμισης"</string>
-    <string name="fasttrack_missing_name" msgid="7806083820928955853">"Άγνωστος"</string>
+    <string name="quickcontact_missing_app" msgid="1181287640680679441">"Δεν υπάρχει εφαρμογή για τη διαχείριση αυτής της ενέργειας"</string>
+    <string name="quickcontact_remember_choice" msgid="2858356075887897116">"Διατήρηση αυτής της ρύθμισης"</string>
+    <string name="quickcontact_missing_name" msgid="7806083820928955853">"Άγνωστος"</string>
     <string name="menu_accounts" msgid="8499114602017077970">"Λογαριασμοί"</string>
     <!-- no translation found for menu_import_export (3765725645491577190) -->
     <skip />
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index d051af8..8372650 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -281,9 +281,9 @@
     <skip />
     <!-- no translation found for make_primary (5829291915305113983) -->
     <skip />
-    <string name="fasttrack_missing_app" msgid="1181287640680679441">"No se encontró aplicación para permitir esta acción"</string>
-    <string name="fasttrack_remember_choice" msgid="2858356075887897116">"Recuerda esta opción"</string>
-    <string name="fasttrack_missing_name" msgid="7806083820928955853">"Desconocido"</string>
+    <string name="quickcontact_missing_app" msgid="1181287640680679441">"No se encontró aplicación para permitir esta acción"</string>
+    <string name="quickcontact_remember_choice" msgid="2858356075887897116">"Recuerda esta opción"</string>
+    <string name="quickcontact_missing_name" msgid="7806083820928955853">"Desconocido"</string>
     <string name="menu_accounts" msgid="8499114602017077970">"Cuentas"</string>
     <!-- no translation found for menu_import_export (3765725645491577190) -->
     <skip />
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index ad45fb6..3ea81a0 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -281,9 +281,9 @@
     <skip />
     <!-- no translation found for make_primary (5829291915305113983) -->
     <skip />
-    <string name="fasttrack_missing_app" msgid="1181287640680679441">"No se ha encontrado ninguna aplicación que pueda realizar esta acción."</string>
-    <string name="fasttrack_remember_choice" msgid="2858356075887897116">"Recordar esta opción"</string>
-    <string name="fasttrack_missing_name" msgid="7806083820928955853">"Desconocido"</string>
+    <string name="quickcontact_missing_app" msgid="1181287640680679441">"No se ha encontrado ninguna aplicación que pueda realizar esta acción."</string>
+    <string name="quickcontact_remember_choice" msgid="2858356075887897116">"Recordar esta opción"</string>
+    <string name="quickcontact_missing_name" msgid="7806083820928955853">"Desconocido"</string>
     <string name="menu_accounts" msgid="8499114602017077970">"Cuentas"</string>
     <!-- no translation found for menu_import_export (3765725645491577190) -->
     <skip />
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 26b026b..0aba70f 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -281,9 +281,9 @@
     <skip />
     <!-- no translation found for make_primary (5829291915305113983) -->
     <skip />
-    <string name="fasttrack_missing_app" msgid="1181287640680679441">"Aucune application pour gérer cette action"</string>
-    <string name="fasttrack_remember_choice" msgid="2858356075887897116">"Mémoriser ce choix"</string>
-    <string name="fasttrack_missing_name" msgid="7806083820928955853">"Inconnu"</string>
+    <string name="quickcontact_missing_app" msgid="1181287640680679441">"Aucune application pour gérer cette action"</string>
+    <string name="quickcontact_remember_choice" msgid="2858356075887897116">"Mémoriser ce choix"</string>
+    <string name="quickcontact_missing_name" msgid="7806083820928955853">"Inconnu"</string>
     <string name="menu_accounts" msgid="8499114602017077970">"Comptes"</string>
     <!-- no translation found for menu_import_export (3765725645491577190) -->
     <skip />
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 5797d61..9e28302 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -281,9 +281,9 @@
     <skip />
     <!-- no translation found for make_primary (5829291915305113983) -->
     <skip />
-    <string name="fasttrack_missing_app" msgid="1181287640680679441">"Nessuna applicazione trovata in grado di gestire questa azione"</string>
-    <string name="fasttrack_remember_choice" msgid="2858356075887897116">"Memorizza questa scelta"</string>
-    <string name="fasttrack_missing_name" msgid="7806083820928955853">"Sconosciuto"</string>
+    <string name="quickcontact_missing_app" msgid="1181287640680679441">"Nessuna applicazione trovata in grado di gestire questa azione"</string>
+    <string name="quickcontact_remember_choice" msgid="2858356075887897116">"Memorizza questa scelta"</string>
+    <string name="quickcontact_missing_name" msgid="7806083820928955853">"Sconosciuto"</string>
     <string name="menu_accounts" msgid="8499114602017077970">"Account"</string>
     <!-- no translation found for menu_import_export (3765725645491577190) -->
     <skip />
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index 1e539dd..b6abc9a 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -281,9 +281,9 @@
     <skip />
     <!-- no translation found for make_primary (5829291915305113983) -->
     <skip />
-    <string name="fasttrack_missing_app" msgid="1181287640680679441">"この操作を行うアプリケーションが見つかりません"</string>
-    <string name="fasttrack_remember_choice" msgid="2858356075887897116">"この選択を保存"</string>
-    <string name="fasttrack_missing_name" msgid="7806083820928955853">"不明"</string>
+    <string name="quickcontact_missing_app" msgid="1181287640680679441">"この操作を行うアプリケーションが見つかりません"</string>
+    <string name="quickcontact_remember_choice" msgid="2858356075887897116">"この選択を保存"</string>
+    <string name="quickcontact_missing_name" msgid="7806083820928955853">"不明"</string>
     <string name="menu_accounts" msgid="8499114602017077970">"アカウント"</string>
     <!-- no translation found for menu_import_export (3765725645491577190) -->
     <skip />
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index cd45ca9..f07aec0 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -281,9 +281,9 @@
     <skip />
     <!-- no translation found for make_primary (5829291915305113983) -->
     <skip />
-    <string name="fasttrack_missing_app" msgid="1181287640680679441">"이 작업을 처리하는 응용프로그램을 찾을 수 없습니다."</string>
-    <string name="fasttrack_remember_choice" msgid="2858356075887897116">"이 선택사항 저장"</string>
-    <string name="fasttrack_missing_name" msgid="7806083820928955853">"알 수 없음"</string>
+    <string name="quickcontact_missing_app" msgid="1181287640680679441">"이 작업을 처리하는 응용프로그램을 찾을 수 없습니다."</string>
+    <string name="quickcontact_remember_choice" msgid="2858356075887897116">"이 선택사항 저장"</string>
+    <string name="quickcontact_missing_name" msgid="7806083820928955853">"알 수 없음"</string>
     <string name="menu_accounts" msgid="8499114602017077970">"계정"</string>
     <!-- no translation found for menu_import_export (3765725645491577190) -->
     <skip />
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 57d17c1..e04b8da 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -281,9 +281,9 @@
     <skip />
     <!-- no translation found for make_primary (5829291915305113983) -->
     <skip />
-    <string name="fasttrack_missing_app" msgid="1181287640680679441">"Ingen programmer som kan utføre denne handlingen ble funnet"</string>
-    <string name="fasttrack_remember_choice" msgid="2858356075887897116">"Husk dette valget"</string>
-    <string name="fasttrack_missing_name" msgid="7806083820928955853">"Ukjent"</string>
+    <string name="quickcontact_missing_app" msgid="1181287640680679441">"Ingen programmer som kan utføre denne handlingen ble funnet"</string>
+    <string name="quickcontact_remember_choice" msgid="2858356075887897116">"Husk dette valget"</string>
+    <string name="quickcontact_missing_name" msgid="7806083820928955853">"Ukjent"</string>
     <string name="menu_accounts" msgid="8499114602017077970">"Kontoer"</string>
     <!-- no translation found for menu_import_export (3765725645491577190) -->
     <skip />
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index d2ca5b3..e3a6ac8 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -281,9 +281,9 @@
     <skip />
     <!-- no translation found for make_primary (5829291915305113983) -->
     <skip />
-    <string name="fasttrack_missing_app" msgid="1181287640680679441">"Er is geen toepassing gevonden om deze actie uit te voeren"</string>
-    <string name="fasttrack_remember_choice" msgid="2858356075887897116">"Deze keuze onthouden"</string>
-    <string name="fasttrack_missing_name" msgid="7806083820928955853">"Onbekend"</string>
+    <string name="quickcontact_missing_app" msgid="1181287640680679441">"Er is geen toepassing gevonden om deze actie uit te voeren"</string>
+    <string name="quickcontact_remember_choice" msgid="2858356075887897116">"Deze keuze onthouden"</string>
+    <string name="quickcontact_missing_name" msgid="7806083820928955853">"Onbekend"</string>
     <string name="menu_accounts" msgid="8499114602017077970">"Accounts"</string>
     <!-- no translation found for menu_import_export (3765725645491577190) -->
     <skip />
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 02797d5..06523ca 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -281,9 +281,9 @@
     <skip />
     <!-- no translation found for make_primary (5829291915305113983) -->
     <skip />
-    <string name="fasttrack_missing_app" msgid="1181287640680679441">"Nie znaleziono aplikacji do obsługi tej akcji"</string>
-    <string name="fasttrack_remember_choice" msgid="2858356075887897116">"Zapamiętaj ten wybór"</string>
-    <string name="fasttrack_missing_name" msgid="7806083820928955853">"Nieznane"</string>
+    <string name="quickcontact_missing_app" msgid="1181287640680679441">"Nie znaleziono aplikacji do obsługi tej akcji"</string>
+    <string name="quickcontact_remember_choice" msgid="2858356075887897116">"Zapamiętaj ten wybór"</string>
+    <string name="quickcontact_missing_name" msgid="7806083820928955853">"Nieznane"</string>
     <string name="menu_accounts" msgid="8499114602017077970">"Konta"</string>
     <!-- no translation found for menu_import_export (3765725645491577190) -->
     <skip />
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index 5802679..3de0004 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -281,9 +281,9 @@
     <skip />
     <!-- no translation found for make_primary (5829291915305113983) -->
     <skip />
-    <string name="fasttrack_missing_app" msgid="1181287640680679441">"Não foram encontradas aplicações para executar esta acção"</string>
-    <string name="fasttrack_remember_choice" msgid="2858356075887897116">"Memorizar esta escolha"</string>
-    <string name="fasttrack_missing_name" msgid="7806083820928955853">"Desconhecido"</string>
+    <string name="quickcontact_missing_app" msgid="1181287640680679441">"Não foram encontradas aplicações para executar esta acção"</string>
+    <string name="quickcontact_remember_choice" msgid="2858356075887897116">"Memorizar esta escolha"</string>
+    <string name="quickcontact_missing_name" msgid="7806083820928955853">"Desconhecido"</string>
     <string name="menu_accounts" msgid="8499114602017077970">"Contas"</string>
     <!-- no translation found for menu_import_export (3765725645491577190) -->
     <skip />
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index 86423f1..6438046 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -281,9 +281,9 @@
     <skip />
     <!-- no translation found for make_primary (5829291915305113983) -->
     <skip />
-    <string name="fasttrack_missing_app" msgid="1181287640680679441">"Nenhum aplicativo foi encontrado para executar esta ação."</string>
-    <string name="fasttrack_remember_choice" msgid="2858356075887897116">"Lembrar desta escolha"</string>
-    <string name="fasttrack_missing_name" msgid="7806083820928955853">"Desconhecido"</string>
+    <string name="quickcontact_missing_app" msgid="1181287640680679441">"Nenhum aplicativo foi encontrado para executar esta ação."</string>
+    <string name="quickcontact_remember_choice" msgid="2858356075887897116">"Lembrar desta escolha"</string>
+    <string name="quickcontact_missing_name" msgid="7806083820928955853">"Desconhecido"</string>
     <string name="menu_accounts" msgid="8499114602017077970">"Contas"</string>
     <!-- no translation found for menu_import_export (3765725645491577190) -->
     <skip />
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index aa5d2f8..76256f4 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -281,9 +281,9 @@
     <skip />
     <!-- no translation found for make_primary (5829291915305113983) -->
     <skip />
-    <string name="fasttrack_missing_app" msgid="1181287640680679441">"Отсутствует приложение для обработки этого действия"</string>
-    <string name="fasttrack_remember_choice" msgid="2858356075887897116">"Запомнить выбранное"</string>
-    <string name="fasttrack_missing_name" msgid="7806083820928955853">"Неизвестно"</string>
+    <string name="quickcontact_missing_app" msgid="1181287640680679441">"Отсутствует приложение для обработки этого действия"</string>
+    <string name="quickcontact_remember_choice" msgid="2858356075887897116">"Запомнить выбранное"</string>
+    <string name="quickcontact_missing_name" msgid="7806083820928955853">"Неизвестно"</string>
     <string name="menu_accounts" msgid="8499114602017077970">"Аккаунты"</string>
     <!-- no translation found for menu_import_export (3765725645491577190) -->
     <skip />
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index 50d9f8d..728fbca 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -281,9 +281,9 @@
     <skip />
     <!-- no translation found for make_primary (5829291915305113983) -->
     <skip />
-    <string name="fasttrack_missing_app" msgid="1181287640680679441">"Inget program som kan hantera åtgärden hittades"</string>
-    <string name="fasttrack_remember_choice" msgid="2858356075887897116">"Kom ihåg det här valet"</string>
-    <string name="fasttrack_missing_name" msgid="7806083820928955853">"Okänd"</string>
+    <string name="quickcontact_missing_app" msgid="1181287640680679441">"Inget program som kan hantera åtgärden hittades"</string>
+    <string name="quickcontact_remember_choice" msgid="2858356075887897116">"Kom ihåg det här valet"</string>
+    <string name="quickcontact_missing_name" msgid="7806083820928955853">"Okänd"</string>
     <string name="menu_accounts" msgid="8499114602017077970">"Konton"</string>
     <!-- no translation found for menu_import_export (3765725645491577190) -->
     <skip />
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index c8ae19c..1df1655 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -281,9 +281,9 @@
     <skip />
     <!-- no translation found for make_primary (5829291915305113983) -->
     <skip />
-    <string name="fasttrack_missing_app" msgid="1181287640680679441">"Bu eylemi gerçekleştirecek bir uygulama bulunamadı"</string>
-    <string name="fasttrack_remember_choice" msgid="2858356075887897116">"Bu tercihi anımsa"</string>
-    <string name="fasttrack_missing_name" msgid="7806083820928955853">"Bilinmiyor"</string>
+    <string name="quickcontact_missing_app" msgid="1181287640680679441">"Bu eylemi gerçekleştirecek bir uygulama bulunamadı"</string>
+    <string name="quickcontact_remember_choice" msgid="2858356075887897116">"Bu tercihi anımsa"</string>
+    <string name="quickcontact_missing_name" msgid="7806083820928955853">"Bilinmiyor"</string>
     <string name="menu_accounts" msgid="8499114602017077970">"Hesaplar"</string>
     <!-- no translation found for menu_import_export (3765725645491577190) -->
     <skip />
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 4ee3b92..cf30983 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -281,9 +281,9 @@
     <skip />
     <!-- no translation found for make_primary (5829291915305113983) -->
     <skip />
-    <string name="fasttrack_missing_app" msgid="1181287640680679441">"未找到可处理此操作的应用程序"</string>
-    <string name="fasttrack_remember_choice" msgid="2858356075887897116">"记住此选择"</string>
-    <string name="fasttrack_missing_name" msgid="7806083820928955853">"未知"</string>
+    <string name="quickcontact_missing_app" msgid="1181287640680679441">"未找到可处理此操作的应用程序"</string>
+    <string name="quickcontact_remember_choice" msgid="2858356075887897116">"记住此选择"</string>
+    <string name="quickcontact_missing_name" msgid="7806083820928955853">"未知"</string>
     <string name="menu_accounts" msgid="8499114602017077970">"帐户"</string>
     <!-- no translation found for menu_import_export (3765725645491577190) -->
     <skip />
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index e0f04cf..df5a614 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -281,9 +281,9 @@
     <skip />
     <!-- no translation found for make_primary (5829291915305113983) -->
     <skip />
-    <string name="fasttrack_missing_app" msgid="1181287640680679441">"找不到可以處理這個動作的應用程式"</string>
-    <string name="fasttrack_remember_choice" msgid="2858356075887897116">"記住這個選擇"</string>
-    <string name="fasttrack_missing_name" msgid="7806083820928955853">"不明"</string>
+    <string name="quickcontact_missing_app" msgid="1181287640680679441">"找不到可以處理這個動作的應用程式"</string>
+    <string name="quickcontact_remember_choice" msgid="2858356075887897116">"記住這個選擇"</string>
+    <string name="quickcontact_missing_name" msgid="7806083820928955853">"不明"</string>
     <string name="menu_accounts" msgid="8499114602017077970">"帳戶"</string>
     <!-- no translation found for menu_import_export (3765725645491577190) -->
     <skip />
diff --git a/res/values/colors.xml b/res/values/colors.xml
index 12630c0..880c269 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -18,6 +18,6 @@
     <color name="textColorIconOverlay">#fff</color>
     <color name="textColorIconOverlayShadow">#000</color>
     <color name="sect_secondary">#4fff</color>
-    <color name="fasttrack_disambig">#f2f2f2</color>
-    <color name="fasttrack_disambig_divider">#afafaf</color>
+    <color name="quickcontact_disambig">#f2f2f2</color>
+    <color name="quickcontact_disambig_divider">#afafaf</color>
 </resources>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 4361fd4..845c3dc 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -15,7 +15,7 @@
 -->
 
 <resources>
-    <dimen name="fasttrack_shadow">37dip</dimen>
+    <dimen name="quickcontact_shadow">37dip</dimen>
     <dimen name="edit_photo_size">76dip</dimen>
         
     <!-- The height of the ScrollingTabWidget -->
diff --git a/res/values/ids.xml b/res/values/ids.xml
index cf1d419..92b0eac 100644
--- a/res/values/ids.xml
+++ b/res/values/ids.xml
@@ -41,6 +41,12 @@
     <item type="id" name="dialog_io_exception" />
     <item type="id" name="dialog_error_with_message" />
 
+    <!-- For ContactsListActivity -->
+    <item type="id" name="dialog_delete_contact_confirmation" />
+    <item type="id" name="dialog_cannot_delete_readonly_contact" />
+    <item type="id" name="dialog_multiple_contact_delete_confirmation" />
+    <item type="id" name="dialog_readonly_contact_delete_confirmation" />
+
     <!-- For ExportVCard -->
     <item type="id" name="dialog_export_confirmation" />
     <item type="id" name="dialog_fail_to_export_with_reason" />
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 407d1c5..60f784d 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -165,7 +165,16 @@
     <!-- Confirmation dialog title after users selects to delete a contact. -->
     <string name="deleteConfirmation_title">Delete</string>
 
-    <!-- Confirmation dialog contents after users selects to delete a contact. -->
+    <!-- Warning dialog contents after users selects to delete a ReadOnly contact. -->
+    <string name="readOnlyContactWarning">You cannot delete contacts from read-only accounts.</string>
+
+    <!-- Warning dialog contents after users selects to delete a contact with ReadOnly and Writable sources. -->
+    <string name="readOnlyContactDeleteConfirmation">This contact contains information from multiple accounts. The information from read-only accounts will not be deleted.</string>
+
+    <!-- Warning dialog contents after users selects to delete a contact with multiple Writable sources. -->
+    <string name="multipleContactDeleteConfirmation">Deleting this contact will delete information from multiple accounts.</string>
+
+    <!-- Confirmation dialog contents after users selects to delete a Writable contact. -->
     <string name="deleteConfirmation">This contact will be deleted.</string>
 
     <!-- Menu item to indicate you are done editing a contact and want to save the changes you've made -->
@@ -909,15 +918,15 @@
 
     <!-- Shown as a toast when the user taps on a Fast-Track icon, and no application
          was found that could perform the selected action -->
-    <string name="fasttrack_missing_app">No application found to handle this action</string>
+    <string name="quickcontact_missing_app">No application found to handle this action</string>
 
     <!-- Shown as the checkbox label that, when checked, will store remember the
          selected choice and shortcut to it in the future.  For example, this would
          make a selected phone number the default. -->
-    <string name="fasttrack_remember_choice">Remember this choice</string>
+    <string name="quickcontact_remember_choice">Remember this choice</string>
 
     <!-- Shown as the header name for a person when the name is missing or unknown. -->
-    <string name="fasttrack_missing_name">Unknown</string>
+    <string name="quickcontact_missing_name">Unknown</string>
 
     <!-- The menu item to open the list of accounts -->
     <string name="menu_accounts">Accounts</string>
@@ -945,6 +954,8 @@
     <string name="organizationLabelsGroup">Organization</string>
     <!-- Header that expands to list all website types when editing a website of a contact -->
     <string name="websiteLabelsGroup">Website</string>
+    <!-- Header that expands to list all event types when editing an event of a contact -->
+    <string name="eventLabelsGroup">Event</string>
 
     <!-- Single-character overlay for home phone numbers when creating desktop shortcuts -->
     <string name="type_short_home">H</string>
@@ -962,7 +973,7 @@
 
     <!-- Shown as the header title over a collapsible section that, by default, hides
          secondary contact detail edit fields, such as birthday. -->
-    <string name="edit_secondary_collapse">Secondary details</string>
+    <string name="edit_secondary_collapse">More</string>
 
     <string name="dialog_primary_name">Primary name</string>
     <string name="dialog_new_contact_account">Create contact under account</string>
@@ -1156,7 +1167,7 @@
     <string name="split_label">Split</string>
     <!-- The explanation of what "split" will do. This needs word-smithing. -->
     <string name="split_explanation">Make this data its own contact.</string>
-    
+
     <!-- Formatting string for account name -->
     <string name="account_name_format">From <xliff:g id="source" example="Gmail">%1$s</xliff:g> account: <xliff:g id="account" example="user@gmail.com">%2$s</xliff:g></string>
 
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 05c0916..8c5ae35 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -52,15 +52,15 @@
         <item name="android:windowContentOverlay">@null</item>
     </style>
 
-    <style name="FullyTranslucent.FastTrack">
+    <style name="FullyTranslucent.QuickContact">
         <!-- This is a hack because we want to be able to animate away the
-             FastTrack window, and we close its containing activity at the
+             QuickContact window, and we close its containing activity at the
              same time.  So put in a dummy animation so this guy sticks around
              while the fast track window is animating. -->
         <item name="android:windowAnimationStyle">@style/DummyAnimation</item>
     </style>
 
-    <style name="FastTrack">
+    <style name="QuickContact">
         <item name="android:windowFrame">@null</item>
         <item name="android:windowBackground">@android:color/transparent</item>
         <item name="android:windowIsFloating">true</item>
@@ -71,14 +71,14 @@
         -->
     </style>
 
-    <style name="FastTrackAboveAnimation">
-        <item name="android:windowEnterAnimation">@anim/fasttrack_above_enter</item>
-        <item name="android:windowExitAnimation">@anim/fasttrack_above_exit</item>
+    <style name="QuickContactAboveAnimation">
+        <item name="android:windowEnterAnimation">@anim/quickcontact_above_enter</item>
+        <item name="android:windowExitAnimation">@anim/quickcontact_above_exit</item>
     </style>
 
-    <style name="FastTrackBelowAnimation">
-        <item name="android:windowEnterAnimation">@anim/fasttrack_below_enter</item>
-        <item name="android:windowExitAnimation">@anim/fasttrack_below_exit</item>
+    <style name="QuickContactBelowAnimation">
+        <item name="android:windowEnterAnimation">@anim/quickcontact_below_enter</item>
+        <item name="android:windowExitAnimation">@anim/quickcontact_below_exit</item>
     </style>
 
     <style name="DummyAnimation">
diff --git a/src/com/android/contacts/ContactOptionsActivity.java b/src/com/android/contacts/ContactOptionsActivity.java
index fbe4604..f93ddf8 100644
--- a/src/com/android/contacts/ContactOptionsActivity.java
+++ b/src/com/android/contacts/ContactOptionsActivity.java
@@ -52,13 +52,13 @@
     private TextView mRingtoneTitle;
     private CheckBox mSendToVoicemailCheckbox;
 
-    private Uri mAggregateUri;
+    private Uri mLookupUri;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
-        mAggregateUri = getIntent().getData();
+        mLookupUri = getIntent().getData();
 
         setContentView(R.layout.contact_options);
 
@@ -176,7 +176,7 @@
 
     private boolean loadData() {
         Cursor c =
-                getContentResolver().query(mAggregateUri, AGGREGATES_PROJECTION, null, null, null);
+                getContentResolver().query(mLookupUri, AGGREGATES_PROJECTION, null, null, null);
         try {
             if (!c.moveToFirst()) {
                 return false;
@@ -195,7 +195,7 @@
         ContentValues values = new ContentValues(2);
         values.put(Contacts.CUSTOM_RINGTONE, mCustomRingtone);
         values.put(Contacts.SEND_TO_VOICEMAIL, mSendToVoicemail);
-        getContentResolver().update(mAggregateUri, values, null, null);
+        getContentResolver().update(mLookupUri, values, null, null);
     }
 }
 
diff --git a/src/com/android/contacts/ContactsListActivity.java b/src/com/android/contacts/ContactsListActivity.java
index c228178..5e1638f 100644
--- a/src/com/android/contacts/ContactsListActivity.java
+++ b/src/com/android/contacts/ContactsListActivity.java
@@ -102,8 +102,11 @@
 import android.widget.TextView;
 import android.widget.AbsListView.OnScrollListener;
 
+import com.android.contacts.model.ContactsSource;
+
 import java.lang.ref.SoftReference;
 import java.lang.ref.WeakReference;
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -186,8 +189,8 @@
     static final int MODE_MASK_NO_DATA = 0x04000000;
     /** Mask for showing a call button in the list */
     static final int MODE_MASK_SHOW_CALL_BUTTON = 0x02000000;
-    /** Mask to disable fasttrack (images will show as normal images) */
-    static final int MODE_MASK_DISABLE_FASTTRACK = 0x01000000;
+    /** Mask to disable quickcontact (images will show as normal images) */
+    static final int MODE_MASK_DISABLE_QUIKCCONTACT = 0x01000000;
     /** Mask to show the total number of contacts at the top */
     static final int MODE_MASK_SHOW_NUMBER_OF_CONTACTS = 0x00800000;
 
@@ -205,16 +208,16 @@
     static final int MODE_STREQUENT = 35 | MODE_MASK_SHOW_PHOTOS | MODE_MASK_SHOW_CALL_BUTTON;
     /** Show all contacts and pick them when clicking */
     static final int MODE_PICK_CONTACT = 40 | MODE_MASK_PICKER | MODE_MASK_SHOW_PHOTOS
-            | MODE_MASK_DISABLE_FASTTRACK;
+            | MODE_MASK_DISABLE_QUIKCCONTACT;
     /** Show all contacts as well as the option to create a new one */
     static final int MODE_PICK_OR_CREATE_CONTACT = 42 | MODE_MASK_PICKER | MODE_MASK_CREATE_NEW
-            | MODE_MASK_SHOW_PHOTOS | MODE_MASK_DISABLE_FASTTRACK;
+            | MODE_MASK_SHOW_PHOTOS | MODE_MASK_DISABLE_QUIKCCONTACT;
     /** Show all people through the legacy provider and pick them when clicking */
     static final int MODE_LEGACY_PICK_PERSON = 43 | MODE_MASK_PICKER | MODE_MASK_SHOW_PHOTOS
-            | MODE_MASK_DISABLE_FASTTRACK;
+            | MODE_MASK_DISABLE_QUIKCCONTACT;
     /** Show all people through the legacy provider as well as the option to create a new one */
-    static final int MODE_LEGACY_PICK_OR_CREATE_PERSON = 44 | MODE_MASK_PICKER | MODE_MASK_CREATE_NEW
-            | MODE_MASK_SHOW_PHOTOS | MODE_MASK_DISABLE_FASTTRACK;
+    static final int MODE_LEGACY_PICK_OR_CREATE_PERSON = 44 | MODE_MASK_PICKER
+            | MODE_MASK_CREATE_NEW | MODE_MASK_SHOW_PHOTOS | MODE_MASK_DISABLE_QUIKCCONTACT;
     /** Show all contacts and pick them when clicking, and allow creating a new contact */
     static final int MODE_INSERT_OR_EDIT_CONTACT = 45 | MODE_MASK_PICKER | MODE_MASK_CREATE_NEW;
     /** Show all phone numbers and pick them when clicking */
@@ -236,7 +239,7 @@
 
     /** Show join suggestions followed by an A-Z list */
     static final int MODE_JOIN_CONTACT = 70 | MODE_MASK_PICKER | MODE_MASK_NO_PRESENCE
-            | MODE_MASK_NO_DATA | MODE_MASK_SHOW_PHOTOS | MODE_MASK_DISABLE_FASTTRACK;
+            | MODE_MASK_NO_DATA | MODE_MASK_SHOW_PHOTOS | MODE_MASK_DISABLE_QUIKCCONTACT;
 
     /** Maximum number of suggestions shown for joining aggregates */
     static final int MAX_SUGGESTIONS = 4;
@@ -306,6 +309,12 @@
         ContactMethods.DATA, //3
         People.DISPLAY_NAME, // 4
     };
+    static final String[] RAW_CONTACTS_PROJECTION = new String[] {
+        RawContacts._ID, //0
+        RawContacts.CONTACT_ID, //1
+        RawContacts.ACCOUNT_TYPE, //2
+    };
+
     static final int POSTAL_ID_COLUMN_INDEX = 0;
     static final int POSTAL_TYPE_COLUMN_INDEX = 1;
     static final int POSTAL_LABEL_COLUMN_INDEX = 2;
@@ -324,6 +333,7 @@
     private String mQuery;
     private boolean mJustCreated;
     private boolean mSyncEnabled;
+    private Uri mSelectedContactUri;
 
 //    private boolean mDisplayAll;
     private boolean mDisplayOnlyPhones;
@@ -332,6 +342,10 @@
 
     private long mQueryAggregateId;
 
+    private ArrayList<Long> mWritableRawContactIds = new ArrayList<Long>();
+    private int  mWritableSourcesCnt;
+    private int  mReadOnlySourcesCnt;
+
     /**
      * Used to keep track of the scroll state of the list.
      */
@@ -388,7 +402,15 @@
         }
 
         public void onClick(DialogInterface dialog, int which) {
-            getContentResolver().delete(mUri, null, null);
+	    if (mReadOnlySourcesCnt > 0) {
+	        for (long rawContactIdToDelete: mWritableRawContactIds) {
+		    final Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI,
+                            rawContactIdToDelete);
+                    getContentResolver().delete(rawContactUri, null, null);
+		}
+            } else {
+	        getContentResolver().delete(mUri, null, null);
+            }
         }
     }
 
@@ -854,11 +876,44 @@
             }
             case R.id.dialog_sdcard_not_found: {
                 AlertDialog.Builder builder = new AlertDialog.Builder(this)
-                .setTitle(R.string.no_sdcard_title)
-                .setIcon(android.R.drawable.ic_dialog_alert)
-                .setMessage(R.string.no_sdcard_message)
-                .setPositiveButton(android.R.string.ok, null);
+                        .setTitle(R.string.no_sdcard_title)
+                        .setIcon(android.R.drawable.ic_dialog_alert)
+                        .setMessage(R.string.no_sdcard_message)
+                        .setPositiveButton(android.R.string.ok, null);
+		break;
             }
+	    case R.id.dialog_delete_contact_confirmation: {
+                AlertDialog.Builder builder = new AlertDialog.Builder(this)
+                        .setTitle(R.string.deleteConfirmation_title)
+                        .setIcon(android.R.drawable.ic_dialog_alert)
+                        .setMessage(R.string.deleteConfirmation)
+                        .setNegativeButton(android.R.string.cancel, null)
+                        .setPositiveButton(android.R.string.ok, new DeleteClickListener(mSelectedContactUri));
+                break;
+            }
+            case R.id.dialog_cannot_delete_readonly_contact: {
+                AlertDialog.Builder builder = new AlertDialog.Builder(this)
+                        .setTitle(R.string.deleteConfirmation_title)
+                        .setIcon(android.R.drawable.ic_dialog_alert)
+                        .setMessage(R.string.readOnlyContactWarning)
+                        .setPositiveButton(android.R.string.ok, null);
+		break;
+            }
+            case R.id.dialog_readonly_contact_delete_confirmation: {
+                AlertDialog.Builder builder = new AlertDialog.Builder(this)
+                        .setTitle(R.string.deleteConfirmation_title)
+                        .setIcon(android.R.drawable.ic_dialog_alert)
+                        .setMessage(R.string.readOnlyContactDeleteConfirmation)
+                        .setPositiveButton(android.R.string.ok, new DeleteClickListener(mSelectedContactUri));
+                }
+	    case R.id.dialog_multiple_contact_delete_confirmation: {
+                AlertDialog.Builder builder = new AlertDialog.Builder(this)
+                        .setTitle(R.string.deleteConfirmation_title)
+                        .setIcon(android.R.drawable.ic_dialog_alert)
+                        .setMessage(R.string.multipleContactDeleteConfirmation)
+                        .setPositiveButton(android.R.string.ok, new DeleteClickListener(mSelectedContactUri));
+                }
+
         }
         return super.onCreateDialog(id);
     }
@@ -1061,8 +1116,8 @@
             }
 
             case MENU_ITEM_DELETE: {
-                final Uri selectedUri = getContactUri(info.position);
-                doContactDelete(selectedUri);
+                mSelectedContactUri = getContactUri(info.position);
+                doContactDelete();
                 return true;
             }
         }
@@ -1082,8 +1137,8 @@
             case KeyEvent.KEYCODE_DEL: {
                 final int position = getListView().getSelectedItemPosition();
                 if (position != ListView.INVALID_POSITION) {
-                    final Uri selectedUri = getContactUri(position);
-                    doContactDelete(selectedUri);
+                    mSelectedContactUri = getContactUri(position);
+                    doContactDelete();
                     return true;
                 }
                 break;
@@ -1096,14 +1151,41 @@
     /**
      * Prompt the user before deleting the given {@link Contacts} entry.
      */
-    protected void doContactDelete(Uri contactUri) {
-        new AlertDialog.Builder(ContactsListActivity.this)
-            .setTitle(R.string.deleteConfirmation_title)
-            .setIcon(android.R.drawable.ic_dialog_alert)
-            .setMessage(R.string.deleteConfirmation)
-            .setNegativeButton(android.R.string.cancel, null)
-            .setPositiveButton(android.R.string.ok, new DeleteClickListener(contactUri))
-            .show();
+    protected void doContactDelete() {
+        mReadOnlySourcesCnt = 0;
+	mWritableSourcesCnt = 0;
+        mWritableRawContactIds.clear();
+
+	if (mSelectedContactUri != null) {
+            Cursor c = getContentResolver().query(RawContacts.CONTENT_URI,
+	            RAW_CONTACTS_PROJECTION, RawContacts.CONTACT_ID + "="
+		    + ContentUris.parseId(mSelectedContactUri), null, null);
+            Sources sources = Sources.getInstance(ContactsListActivity.this);
+            if (c != null) {
+                while (c.moveToNext()) {
+                    final String accountType = c.getString(2);
+		    final long rawContactId = c.getLong(0);
+                    ContactsSource contactsSource = sources.getInflatedSource(accountType,
+                            ContactsSource.LEVEL_SUMMARY);
+                    if (contactsSource != null && contactsSource.readOnly) {
+                        mReadOnlySourcesCnt += 1;
+                    } else {
+                        mWritableSourcesCnt += 1;
+			mWritableRawContactIds.add(rawContactId);
+		    }
+                 }
+            }
+            c.close();
+	    if (mReadOnlySourcesCnt > 0 && mWritableSourcesCnt > 0) {
+	        showDialog(R.id.dialog_readonly_contact_delete_confirmation);
+	    } else if (mReadOnlySourcesCnt > 0 && mWritableSourcesCnt == 0) {
+	        showDialog(R.id.dialog_cannot_delete_readonly_contact);
+	    } else if (mReadOnlySourcesCnt == 0 && mWritableSourcesCnt > 1) {
+	        showDialog(R.id.dialog_multiple_contact_delete_confirmation);
+            } else {
+	        showDialog(R.id.dialog_delete_contact_confirmation);
+	    }
+	}
     }
 
     @Override
@@ -1918,7 +2000,7 @@
         public CharArrayBuffer dataBuffer = new CharArrayBuffer(128);
         public ImageView presenceView;
         public QuickContactBadge photoView;
-        public ImageView nonFastTrackPhotoView;
+        public ImageView nonQuickContactPhotoView;
     }
 
     final static class PhotoInfo {
@@ -2138,7 +2220,8 @@
                         parent, false);
                 int stringId = mDisplayOnlyPhones ? R.string.listTotalPhoneContacts
                         : R.string.listTotalAllContacts;
-                totalContacts.setText(getString(stringId, getCount()));
+
+                totalContacts.setText(getString(stringId, getRealCount()));
                 return totalContacts;
             }
 
@@ -2221,7 +2304,7 @@
             cache.dataView = (TextView) view.findViewById(R.id.data);
             cache.presenceView = (ImageView) view.findViewById(R.id.presence);
             cache.photoView = (QuickContactBadge) view.findViewById(R.id.photo);
-            cache.nonFastTrackPhotoView = (ImageView) view.findViewById(R.id.noQuickContactPhoto);
+            cache.nonQuickContactPhotoView = (ImageView) view.findViewById(R.id.noQuickContactPhoto);
             view.setTag(cache);
 
             return view;
@@ -2288,7 +2371,7 @@
 
             // Set the photo, if requested
             if (mDisplayPhotos) {
-                boolean useFastTrack = (mMode & MODE_MASK_DISABLE_FASTTRACK) == 0;
+                boolean useQuickContact = (mMode & MODE_MASK_DISABLE_QUIKCCONTACT) == 0;
 
                 long photoId = 0;
                 if (!cursor.isNull(SUMMARY_PHOTO_ID_COLUMN_INDEX)) {
@@ -2296,18 +2379,18 @@
                 }
 
                 ImageView viewToUse;
-                if (useFastTrack) {
+                if (useQuickContact) {
                     viewToUse = cache.photoView;
                     // Build soft lookup reference
                     final long contactId = cursor.getLong(SUMMARY_ID_COLUMN_INDEX);
                     final String lookupKey = cursor.getString(SUMMARY_LOOKUP_KEY);
                     cache.photoView.assignContactUri(Contacts.getLookupUri(contactId, lookupKey));
                     cache.photoView.setVisibility(View.VISIBLE);
-                    cache.nonFastTrackPhotoView.setVisibility(View.INVISIBLE);
+                    cache.nonQuickContactPhotoView.setVisibility(View.INVISIBLE);
                 } else {
-                    viewToUse = cache.nonFastTrackPhotoView;
+                    viewToUse = cache.nonQuickContactPhotoView;
                     cache.photoView.setVisibility(View.INVISIBLE);
-                    cache.nonFastTrackPhotoView.setVisibility(View.VISIBLE);
+                    cache.nonQuickContactPhotoView.setVisibility(View.VISIBLE);
                 }
 
 
@@ -2570,19 +2653,33 @@
 
         @Override
         public int getCount() {
+            if (!mDataValid) {
+                return 0;
+            }
+            int superCount = super.getCount();
+            if ((mMode & MODE_MASK_SHOW_NUMBER_OF_CONTACTS) != 0) {
+                superCount++;
+            }
             if (mSuggestionsCursorCount != 0) {
                 // When showing suggestions, we have 2 additional list items: the "Suggestions"
                 // and "All contacts" headers.
-                return mSuggestionsCursorCount + super.getCount() + 2;
+                return mSuggestionsCursorCount + superCount + 2;
             }
             else if (mFrequentSeparatorPos != ListView.INVALID_POSITION) {
                 // When showing strequent list, we have an additional list item - the separator.
-                return super.getCount() + 1;
+                return superCount + 1;
             } else {
-                return super.getCount();
+                return superCount;
             }
         }
 
+        /**
+         * Gets the actual count of contacts and excludes all the headers.
+         */
+        public int getRealCount() {
+            return super.getCount();
+        }
+
         private int getRealPosition(int pos) {
             if ((mMode & MODE_MASK_SHOW_NUMBER_OF_CONTACTS) != 0) {
                 pos--;
diff --git a/src/com/android/contacts/ReverseZOrderLinearLayout.java b/src/com/android/contacts/ReverseZOrderLinearLayout.java
deleted file mode 100644
index 5601693..0000000
--- a/src/com/android/contacts/ReverseZOrderLinearLayout.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.contacts;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.widget.LinearLayout;
-
-public class ReverseZOrderLinearLayout extends LinearLayout {
-
-    public ReverseZOrderLinearLayout(Context context, AttributeSet attrs) {
-        super(context, attrs);
-        mGroupFlags |= FLAG_USE_CHILD_DRAWING_ORDER;
-    }
-
-    @Override
-    protected int getChildDrawingOrder(int childCount, int i) {
-        return childCount - i - 1;
-    }
-
-}
diff --git a/src/com/android/contacts/ViewContactActivity.java b/src/com/android/contacts/ViewContactActivity.java
index 8172423..830dd73 100644
--- a/src/com/android/contacts/ViewContactActivity.java
+++ b/src/com/android/contacts/ViewContactActivity.java
@@ -22,6 +22,7 @@
 import com.android.contacts.model.ContactsSource;
 import com.android.contacts.model.Sources;
 import com.android.contacts.model.ContactsSource.DataKind;
+import com.android.contacts.ui.EditContactActivity;
 import com.android.contacts.util.Constants;
 import com.android.contacts.util.NotifyingAsyncQueryHandler;
 import com.android.internal.telephony.ITelephony;
@@ -90,25 +91,21 @@
  */
 public class ViewContactActivity extends Activity
         implements View.OnCreateContextMenuListener, DialogInterface.OnClickListener,
-        AdapterView.OnItemClickListener, NotifyingAsyncQueryHandler.AsyncQueryListener,
-        OnTabSelectionChangedListener {
+        AdapterView.OnItemClickListener, NotifyingAsyncQueryHandler.AsyncQueryListener {
     private static final String TAG = "ViewContact";
 
-    public static final String RAW_CONTACT_ID_EXTRA = "rawContactIdExtra";
-
     private static final boolean SHOW_SEPARATORS = false;
 
     private static final int DIALOG_CONFIRM_DELETE = 1;
+    private static final int DIALOG_CONFIRM_READONLY_DELETE = 2;
+    private static final int DIALOG_CONFIRM_MULTIPLE_DELETE = 3;
 
     private static final int REQUEST_JOIN_CONTACT = 1;
     private static final int REQUEST_EDIT_CONTACT = 2;
 
     public static final int MENU_ITEM_MAKE_DEFAULT = 3;
 
-    private static final String SPLIT_MIMETYPE = "split_mimetype";
-
     protected Uri mLookupUri;
-    private Uri mUri;
     private ContentResolver mResolver;
     private ViewAdapter mAdapter;
     private int mNumPhoneNumbers = 0;
@@ -126,35 +123,18 @@
     /* package */ ArrayList<ViewEntry> mOrganizationEntries = new ArrayList<ViewEntry>();
     /* package */ ArrayList<ViewEntry> mGroupEntries = new ArrayList<ViewEntry>();
     /* package */ ArrayList<ViewEntry> mOtherEntries = new ArrayList<ViewEntry>();
-    /* package */ ArrayList<ViewEntry> mSplitEntry = new ArrayList<ViewEntry>();
     /* package */ ArrayList<ArrayList<ViewEntry>> mSections = new ArrayList<ArrayList<ViewEntry>>();
 
     private Cursor mCursor;
 
-    private SparseArray<Long> mTabRawContactIdMap;
-    protected ScrollingTabWidget mTabWidget;
     protected ContactHeaderWidget mContactHeaderWidget;
-    protected View mBelowHeader;
-    protected TextView mAccountName;
-    protected View mBufferView;
     private NotifyingAsyncQueryHandler mHandler;
 
     protected LayoutInflater mInflater;
 
-    //Projection used for the query that determines which tabs to add.
-    protected static final String[] TAB_PROJECTION = new String[] {
-        RawContacts._ID,
-        RawContacts.ACCOUNT_NAME,
-        RawContacts.ACCOUNT_TYPE
-    };
-    protected static final int TAB_CONTACT_ID_COLUMN_INDEX = 0;
-    protected static final int TAB_ACCOUNT_NAME_COLUMN_INDEX = 1;
-    protected static final int TAB_ACCOUNT_TYPE_COLUMN_INDEX = 2;
-
-    private static final String SAVED_STATE_SELECTED_RAW_CONTACT_ID_KEY = "selectedRawContactKey";
-    private static final String SAVED_STATE_TABS_VISIBLE_KEY = "tabsVisibleKey";
-
-    protected Long mSelectedRawContactId = null;
+    protected int mReadOnlySourcesCnt;
+    protected int mWritableSourcesCnt;
+    protected ArrayList<Long> mWritableRawContactIds = new ArrayList<Long>();
 
     private static final int TOKEN_QUERY = 0;
 
@@ -174,7 +154,15 @@
 
     public void onClick(DialogInterface dialog, int which) {
         closeCursor();
-        getContentResolver().delete(mUri, null, null);
+	if (mReadOnlySourcesCnt > 0) {
+	    for (long rawContactIdToDelete: mWritableRawContactIds) {
+		final Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI,
+                        rawContactIdToDelete);
+                getContentResolver().delete(rawContactUri, null, null);
+            }
+        } else {
+	    getContentResolver().delete(mLookupUri, null, null);
+	}
         finish();
     }
 
@@ -183,8 +171,6 @@
     private boolean mShowSmsLinksForAllPhones;
     private ArrayList<Entity> mEntities = null;
 
-    private boolean mTabsVisible;
-
     @Override
     protected void onCreate(Bundle icicle) {
         super.onCreate(icicle);
@@ -211,16 +197,6 @@
             Contacts.CONTENT_ITEM_TYPE
         });
 
-        mTabWidget = (ScrollingTabWidget) findViewById(R.id.tab_widget);
-        mTabWidget.setTabSelectionListener(this);
-        mTabWidget.setVisibility(View.GONE);
-        mTabsVisible = false;
-        mAccountName = (TextView) mTabWidget.findViewById(R.id.account_name);
-
-        mBelowHeader = findViewById(R.id.below_header);
-
-        mTabRawContactIdMap = new SparseArray<Long>();
-
         mHandler = new NotifyingAsyncQueryHandler(this, this);
 
         mListView = new ListView(this);
@@ -243,32 +219,12 @@
         mSections.add(mOrganizationEntries);
         mSections.add(mGroupEntries);
         mSections.add(mOtherEntries);
-        mSections.add(mSplitEntry);
 
         //TODO Read this value from a preference
         mShowSmsLinksForAllPhones = true;
     }
 
     @Override
-    protected void onRestoreInstanceState(Bundle savedInstanceState) {
-        super.onRestoreInstanceState(savedInstanceState);
-        long restoredRawContactId = savedInstanceState.getLong(
-                SAVED_STATE_SELECTED_RAW_CONTACT_ID_KEY, -1);
-        mSelectedRawContactId = restoredRawContactId != -1 ? restoredRawContactId : null;
-        mTabsVisible = savedInstanceState.getBoolean(SAVED_STATE_TABS_VISIBLE_KEY);
-    }
-
-    @Override
-    protected void onSaveInstanceState(Bundle outState) {
-        super.onSaveInstanceState(outState);
-        if (mSelectedRawContactId != null) {
-            outState.putLong(SAVED_STATE_SELECTED_RAW_CONTACT_ID_KEY, mSelectedRawContactId);
-
-        }
-        outState.putBoolean(SAVED_STATE_TABS_VISIBLE_KEY, mTabsVisible);
-    }
-
-    @Override
     protected void onResume() {
         super.onResume();
         startEntityQuery();
@@ -298,186 +254,34 @@
                         .setPositiveButton(android.R.string.ok, this)
                         .setCancelable(false)
                         .create();
+            case DIALOG_CONFIRM_READONLY_DELETE:
+                return new AlertDialog.Builder(this)
+                        .setTitle(R.string.deleteConfirmation_title)
+                        .setIcon(android.R.drawable.ic_dialog_alert)
+                        .setMessage(R.string.readOnlyContactDeleteConfirmation)
+                        .setNegativeButton(android.R.string.cancel, null)
+                        .setPositiveButton(android.R.string.ok, this)
+                        .setCancelable(false)
+                        .create();
+            case DIALOG_CONFIRM_MULTIPLE_DELETE:
+                return new AlertDialog.Builder(this)
+                        .setTitle(R.string.deleteConfirmation_title)
+                        .setIcon(android.R.drawable.ic_dialog_alert)
+                        .setMessage(R.string.multipleContactDeleteConfirmation)
+                        .setNegativeButton(android.R.string.cancel, null)
+                        .setPositiveButton(android.R.string.ok, this)
+                        .setCancelable(false)
+                        .create();
         }
         return null;
     }
 
-
-    // TAB CODE //
-    /**
-     * Adds a tab for each {@link RawContacts} associated with this contact.
-     * Override this method if you want to additional tabs and/or different
-     * tabs for your activity.
-     */
-    protected void bindTabs() {
-        final Sources sources = Sources.getInstance(this);
-
-        for (Entity entity : mEntities) {
-            final String accountType = entity.getEntityValues().
-                    getAsString(RawContacts.ACCOUNT_TYPE);
-            final Long rawContactId = entity.getEntityValues().
-                    getAsLong(RawContacts._ID);
-
-            // TODO: ensure inflation on background task so we don't block UI thread here
-            final ContactsSource source = sources.getInflatedSource(accountType,
-                    ContactsSource.LEVEL_SUMMARY);
-            addTab(rawContactId, ContactsUtils.createTabIndicatorView(mTabWidget.getTabParent(),
-                    source));
-        }
-    }
-
-    /**
-     * Add a tab to be displayed in the {@link ScrollingTabWidget}.
-     *
-     * @param rawContactId The contact id associated with the tab.
-     * @param view A view to use as the tab indicator.
-     */
-    protected void addTab(long rawContactId, View view) {
-        mTabRawContactIdMap.put(mTabWidget.getTabCount(), rawContactId);
-        mTabWidget.addTab(view);
-    }
-
-
-    protected void clearCurrentTabs() {
-        mTabRawContactIdMap.clear();
-        mTabWidget.removeAllTabs();
-    }
-
-    protected void selectInitialTab() {
-        int selectedTabIndex = 0;
-
-        if (mSelectedRawContactId != null) {
-            selectedTabIndex = getTabIndexForRawContactId(mSelectedRawContactId);
-            if (selectedTabIndex == -1) {
-                // If there was no matching tab, just select the first;
-                selectedTabIndex = 0;
-            }
-        }
-
-        mTabWidget.setCurrentTab(selectedTabIndex);
-        onTabSelectionChanged(selectedTabIndex, false);
-    }
-
-    public void onTabSelectionChanged(int tabIndex, boolean clicked) {
-        Long rawContactId = getTabRawContactId(tabIndex);
-        if (rawContactId != null) {
-            mSelectedRawContactId = rawContactId;
-            bindData();
-        }
-    }
-
-    /**
-     * Return the RawContact id associated with the tab at an index.
-     *
-     * @param index The index of the tab in question.
-     * @return The contactId associated with the tab at the specified index.
-     */
-    protected Long getTabRawContactId(int index) {
-        return mTabRawContactIdMap.get(index);
-    }
-
-    /**
-     * Return the tab index associated with the RawContact id.
-     *
-     * @param index The index of the tab in question.
-     * @return The contactId associated with the tab at the specified index.
-     */
-    protected int getTabIndexForRawContactId(long rawContactId) {
-        int numTabs = mTabRawContactIdMap.size();
-        for (int i=0; i < numTabs; i++) {
-            if (mTabRawContactIdMap.get(i) == rawContactId) {
-                return i;
-            }
-        }
-        return -1;
-    }
-
-    protected void showTabs(boolean show) {
-        if (mTabsVisible == show) {
-            return;
-        }
-
-        final Resources resources = getResources();
-        final float tabHeight = resources.getDimension(R.dimen.tab_height)
-            + resources.getDimension(R.dimen.account_name_height);
-        if (show) {
-            TranslateAnimation showAnimation = new TranslateAnimation(
-                    Animation.ABSOLUTE, 0, Animation.ABSOLUTE, 0,
-                    Animation.ABSOLUTE, -tabHeight, Animation.ABSOLUTE, 0);
-            showAnimation.setDuration(resources.getInteger(
-                    android.R.integer.config_longAnimTime));
-
-            showAnimation.setAnimationListener(new AnimationListener() {
-                public void onAnimationEnd(Animation animation) {
-                    selectInitialTab();
-                    bindData();
-                }
-
-                public void onAnimationRepeat(Animation animation) {
-                }
-
-                public void onAnimationStart(Animation animation) {
-                }
-
-            });
-
-            mBelowHeader.startAnimation(showAnimation);
-            mTabWidget.setVisibility(View.VISIBLE);
-            mTabsVisible = true;
-            clearCurrentTabs();
-            bindTabs();
-        } else {
-            TranslateAnimation hideTabsAnimation = new TranslateAnimation(
-                    Animation.ABSOLUTE, 0, Animation.ABSOLUTE, 0,
-                    Animation.ABSOLUTE, 0, Animation.ABSOLUTE, -tabHeight);
-            hideTabsAnimation.setDuration(resources.getInteger(
-                    android.R.integer.config_longAnimTime));
-            hideTabsAnimation.setAnimationListener(new AnimationListener() {
-                public void onAnimationEnd(Animation animation) {
-                    bindData();
-                }
-
-                public void onAnimationRepeat(Animation animation) {
-                }
-
-                public void onAnimationStart(Animation animation) {
-                }
-
-            });
-
-            TranslateAnimation hideListAnimation = new TranslateAnimation(
-                    Animation.ABSOLUTE, 0, Animation.ABSOLUTE, 0,
-                    Animation.ABSOLUTE, tabHeight, Animation.ABSOLUTE, 0);
-            hideListAnimation.setDuration(resources.getInteger(
-                    android.R.integer.config_longAnimTime));
-
-
-            mTabWidget.startAnimation(hideTabsAnimation);
-            mTabContentLayout.startAnimation(hideListAnimation);
-            mTabWidget.setVisibility(View.GONE);
-            mTabsVisible = false;
-            mSelectedRawContactId = null;
-        }
-    }
-
-
     // QUERY CODE //
     /** {@inheritDoc} */
     public void onQueryEntitiesComplete(int token, Object cookie, EntityIterator iterator) {
         try{
             if (token == TOKEN_QUERY) {
                 mEntities = readEntities(iterator);
-                // Show the aggregate badge if this contact is aggregated.
-                boolean isAggregate = mEntities.size() > 1;
-                mContactHeaderWidget.showAggregateBadge(isAggregate);
-                if (mTabsVisible) {
-                    mTabWidget.setVisibility(View.VISIBLE);
-                    clearCurrentTabs();
-                    bindTabs();
-                    selectInitialTab();
-                } else {
-                    mTabWidget.setVisibility(View.GONE);
-                }
                 bindData();
             }
         } finally {
@@ -492,6 +296,14 @@
         // Empty
     }
 
+    private long getRefreshedContactId() {
+        Uri freshContactUri = Contacts.lookupContact(getContentResolver(), mLookupUri);
+        if (freshContactUri != null) {
+            return ContentUris.parseId(freshContactUri);
+        }
+        return -1;
+    }
+
     private ArrayList<Entity> readEntities(EntityIterator iterator) {
         ArrayList<Entity> entities = new ArrayList<Entity>();
         try {
@@ -507,15 +319,15 @@
     private void startEntityQuery() {
         closeCursor();
 
-        mUri = null;
+        Uri uri = null;
         if (mLookupUri != null) {
             mLookupUri = Contacts.getLookupUri(getContentResolver(), mLookupUri);
             if (mLookupUri != null) {
-                mUri = Contacts.lookupContact(getContentResolver(), mLookupUri);
+                uri = Contacts.lookupContact(getContentResolver(), mLookupUri);
             }
         }
 
-        if (mUri == null) {
+        if (uri == null) {
 
             // TODO either figure out a way to prevent a flash of black background or
             // use some other UI than a toast
@@ -525,11 +337,11 @@
             return;
         }
 
-        mCursor = mResolver.query(Uri.withAppendedPath(mUri, Contacts.Data.CONTENT_DIRECTORY),
+        mCursor = mResolver.query(Uri.withAppendedPath(uri, Contacts.Data.CONTENT_DIRECTORY),
                 new String[] {Contacts.DISPLAY_NAME}, null, null, null);
         mCursor.registerContentObserver(mObserver);
 
-        long contactId = ContentUris.parseId(mUri);
+        long contactId = ContentUris.parseId(uri);
         mHandler.startQueryEntities(TOKEN_QUERY, null,
                 RawContacts.CONTENT_URI, RawContacts.CONTACT_ID + "=" + contactId, null, null);
 
@@ -576,20 +388,14 @@
     public boolean onPrepareOptionsMenu(Menu menu) {
         super.onPrepareOptionsMenu(menu);
 
-        // If tabWidget is not shown enable "show sources", otherwise
-        // enable "hide sources"
-        if (mTabsVisible) {
-            menu.findItem(R.id.menu_show_sources).setVisible(false);
-            menu.findItem(R.id.menu_hide_sources).setVisible(true);
-        } else {
-            menu.findItem(R.id.menu_show_sources).setVisible(true);
-            menu.findItem(R.id.menu_hide_sources).setVisible(false);
-        }
-
         // Only allow edit when we have at least one raw_contact id
         final boolean hasRawContact = (mRawContactIds.size() > 0);
         menu.findItem(R.id.menu_edit).setEnabled(hasRawContact);
 
+        // Disable delete for readonly contact
+	if (mWritableSourcesCnt == 0) {
+            menu.findItem(R.id.menu_delete).setEnabled(false);
+        }
         return true;
     }
 
@@ -625,32 +431,18 @@
         } else if (entry.mimetype.equals(CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE)) {
             menu.add(0, 0, 0, R.string.menu_viewAddress).setIntent(entry.intent);
         }
-        // TODO(emillar): add back with group support.
-        /* else if (entry.mimetype.equals()) {
-            menu.add(0, 0, 0, R.string.menu_viewGroup).setIntent(entry.intent);
-            } */
     }
 
     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
         switch (item.getItemId()) {
-            case R.id.menu_show_sources: {
-                showTabs(true);
-                break;
-            }
-            case R.id.menu_hide_sources: {
-                showTabs(false);
-                break;
-            }
             case R.id.menu_edit: {
-                Long rawContactIdToEdit = mSelectedRawContactId;
-                if (rawContactIdToEdit == null) {
-                    if (mRawContactIds.size() > 0) {
-                        rawContactIdToEdit = mRawContactIds.get(0);
-                    } else {
-                        // There is no rawContact to edit.
-                        break;
-                    }
+                Long rawContactIdToEdit = null;
+                if (mRawContactIds.size() > 0) {
+                    rawContactIdToEdit = mRawContactIds.get(0);
+                } else {
+                    // There is no rawContact to edit.
+                    break;
                 }
                 Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI,
                         rawContactIdToEdit);
@@ -660,7 +452,13 @@
             }
             case R.id.menu_delete: {
                 // Get confirmation
-                showDialog(DIALOG_CONFIRM_DELETE);
+		if (mReadOnlySourcesCnt > 0 & mWritableSourcesCnt > 0) {
+                    showDialog(DIALOG_CONFIRM_READONLY_DELETE);
+		} else if (mWritableSourcesCnt > 1) {
+		    showDialog(DIALOG_CONFIRM_MULTIPLE_DELETE);
+		} else {
+		    showDialog(DIALOG_CONFIRM_DELETE);
+		}
                 return true;
             }
             case R.id.menu_join: {
@@ -725,54 +523,22 @@
     }
 
     /**
-     * Shows a dialog that contains a list of all constituent contacts in this aggregate.
-     * The user picks a contact to be split into its own aggregate or clicks Cancel.
-     */
-    private void showSplitAggregateDialog() {
-        // Wrap this dialog in a specific theme so that list items have correct text color.
-        final ContextThemeWrapper dialogContext =
-                new ContextThemeWrapper(this, android.R.style.Theme_Light);
-        AlertDialog.Builder builder =
-                new AlertDialog.Builder(dialogContext);
-        builder.setTitle(getString(R.string.splitAggregate_title));
-
-        final SplitAggregateView view = new SplitAggregateView(dialogContext, mUri);
-        builder.setView(view);
-
-        builder.setInverseBackgroundForced(true);
-        builder.setCancelable(true);
-        builder.setNegativeButton(android.R.string.cancel,
-                new OnClickListener() {
-                    public void onClick(DialogInterface dialog, int which) {
-                        dialog.dismiss();
-                    }
-                });
-        final AlertDialog dialog = builder.create();
-
-        view.setOnContactSelectedListener(new OnContactSelectedListener() {
-            public void onContactSelected(long rawContactId) {
-                dialog.dismiss();
-                splitContact(rawContactId);
-            }
-        });
-
-        dialog.show();
-    }
-
-    /**
      * Shows a list of aggregates that can be joined into the currently viewed aggregate.
      */
     public void showJoinAggregateActivity() {
-        String displayName = null;
-        if (mCursor.moveToFirst()) {
-            displayName = mCursor.getString(0);
+        long freshId = getRefreshedContactId();
+        if (freshId > 0) {
+            String displayName = null;
+            if (mCursor.moveToFirst()) {
+                displayName = mCursor.getString(0);
+            }
+            Intent intent = new Intent(ContactsListActivity.JOIN_AGGREGATE);
+            intent.putExtra(ContactsListActivity.EXTRA_AGGREGATE_ID, freshId);
+            if (displayName != null) {
+                intent.putExtra(ContactsListActivity.EXTRA_AGGREGATE_NAME, displayName);
+            }
+            startActivityForResult(intent, REQUEST_JOIN_CONTACT);
         }
-        Intent intent = new Intent(ContactsListActivity.JOIN_AGGREGATE);
-        intent.putExtra(ContactsListActivity.EXTRA_AGGREGATE_ID, ContentUris.parseId(mUri));
-        if (displayName != null) {
-            intent.putExtra(ContactsListActivity.EXTRA_AGGREGATE_NAME, displayName);
-        }
-        startActivityForResult(intent, REQUEST_JOIN_CONTACT);
     }
 
     @Override
@@ -783,7 +549,10 @@
                 joinAggregate(contactId);
             }
         } else if (requestCode == REQUEST_EDIT_CONTACT) {
-            mTabsVisible = false;
+            // TODO: Bring this back
+            if (resultCode == EditContactActivity.RESULT_CLOSE_VIEW_ACTIVITY) {
+                finish();
+            }
         }
     }
 
@@ -831,7 +600,7 @@
 
     private void showOptionsActivity() {
         final Intent intent = new Intent(this, ContactOptionsActivity.class);
-        intent.setData(mUri);
+        intent.setData(mLookupUri);
         startActivity(intent);
     }
 
@@ -870,14 +639,25 @@
                     }
                 } else if (mNumPhoneNumbers != 0) {
                     // There isn't anything selected, call the default number
-                    Intent intent = new Intent(Intent.ACTION_CALL_PRIVILEGED, mUri);
-                    startActivity(intent);
+                    long freshContactId = getRefreshedContactId();
+                    if (freshContactId > 0) {
+                        Uri hardContacUri = ContentUris.withAppendedId(
+                                Contacts.CONTENT_URI, freshContactId);
+                        Intent intent = new Intent(Intent.ACTION_CALL_PRIVILEGED, hardContacUri);
+                        startActivity(intent);
+                    }
                 }
                 return true;
             }
 
             case KeyEvent.KEYCODE_DEL: {
-                showDialog(DIALOG_CONFIRM_DELETE);
+		if (mReadOnlySourcesCnt > 0 & mWritableSourcesCnt > 0) {
+                    showDialog(DIALOG_CONFIRM_READONLY_DELETE);
+		} else if (mWritableSourcesCnt > 1) {
+		    showDialog(DIALOG_CONFIRM_MULTIPLE_DELETE);
+		} else {
+		    showDialog(DIALOG_CONFIRM_DELETE);
+		}
                 return true;
             }
         }
@@ -889,9 +669,7 @@
         ViewEntry entry = ViewAdapter.getEntry(mSections, position, SHOW_SEPARATORS);
         if (entry != null) {
             Intent intent = entry.intent;
-            if (entry.mimetype == SPLIT_MIMETYPE) {
-                splitContact(entry.id);
-            } else if (intent != null) {
+            if (intent != null) {
                 try {
                     startActivity(intent);
                 } catch (ActivityNotFoundException e) {
@@ -935,11 +713,14 @@
         }
 
         mRawContactIds.clear();
+        mReadOnlySourcesCnt = 0;
+	mWritableSourcesCnt = 0;
+        mWritableRawContactIds.clear();
 
         Sources sources = Sources.getInstance(this);
 
         // Build up method entries
-        if (mUri != null) {
+        if (mLookupUri != null) {
             for (Entity entity: mEntities) {
                 final ContentValues entValues = entity.getEntityValues();
                 final String accountType = entValues.getAsString(RawContacts.ACCOUNT_TYPE);
@@ -949,17 +730,6 @@
                     mRawContactIds.add(rawContactId);
                 }
 
-                // This performs the tab filtering
-                if (mSelectedRawContactId != null && mSelectedRawContactId != rawContactId) {
-                    continue;
-                }
-
-                final ContactsSource source = sources.getInflatedSource(accountType,
-                        ContactsSource.LEVEL_SUMMARY);
-                final String accountName = entValues.getAsString(RawContacts.ACCOUNT_NAME);
-                mAccountName.setText(getString(R.string.account_name_format,
-                        source.getDisplayLabel(this), accountName));
-
                 for (NamedContentValues subValue : entity.getSubValues()) {
                     ViewEntry entry = new ViewEntry();
 
@@ -1078,63 +848,7 @@
                         entry.intent = new Intent(Intent.ACTION_VIEW, entry.uri);
                         mOtherEntries.add(entry);
                     }
-
                 }
-
-                if (mSelectedRawContactId != null &&
-                        mSelectedRawContactId == rawContactId
-                        && mEntities.size() > 1) {
-                    ViewEntry entry = new ViewEntry();
-                    entry.mimetype = SPLIT_MIMETYPE;
-                    entry.id = rawContactId;
-                    entry.label = getString(R.string.split_label);
-                    entry.data = getString(R.string.split_explanation);
-                    entry.actionIcon = R.drawable.ic_list_split;
-                    mSplitEntry.add(entry);
-                }
-                    // TODO(emillar) Add group entries
-                    //              // Build the group entries
-                    //              final Uri groupsUri = Uri.withAppendedPath(mUri, GroupMembership.CONTENT_DIRECTORY);
-                    //              Cursor groupCursor = mResolver.query(groupsUri, ContactsListActivity.GROUPS_PROJECTION,
-                    //                      null, null, Groups.DEFAULT_SORT_ORDER);
-                    //              if (groupCursor != null) {
-                    //                  try {
-                    //                      StringBuilder sb = new StringBuilder();
-                    //
-                    //                      while (groupCursor.moveToNext()) {
-                    //                          String systemId = groupCursor.getString(
-                    //                                  ContactsListActivity.GROUPS_COLUMN_INDEX_SYSTEM_ID);
-                    //
-                    //                          if (systemId != null || Groups.GROUP_MY_CONTACTS.equals(systemId)) {
-                    //                              continue;
-                    //                          }
-                    //
-                    //                          String name = groupCursor.getString(ContactsListActivity.GROUPS_COLUMN_INDEX_NAME);
-                    //                          if (!TextUtils.isEmpty(name)) {
-                    //                              if (sb.length() == 0) {
-                    //                                  sb.append(name);
-                    //                              } else {
-                    //                                  sb.append(getString(R.string.group_list, name));
-                    //                              }
-                    //                          }
-                    //                      }
-                    //
-                    //                      if (sb.length() > 0) {
-                    //                          ViewEntry entry = new ViewEntry();
-                    //                          entry.kind = ContactEntryAdapter.Entry.KIND_GROUP;
-                    //                          entry.label = getString(R.string.label_groups);
-                    //                          entry.data = sb.toString();
-                    //                          entry.intent = new Intent(Intent.ACTION_EDIT, mUri);
-                    //
-                    //                          // TODO: Add an icon for the groups item.
-                    //
-                    //                          mGroupEntries.add(entry);
-                    //                      }
-                    //                  } finally {
-                    //                      groupCursor.close();
-                    //                  }
-                    //              }
-
             }
         }
     }
diff --git a/src/com/android/contacts/model/EntitySet.java b/src/com/android/contacts/model/EntitySet.java
index adc87ee..be2f70f 100644
--- a/src/com/android/contacts/model/EntitySet.java
+++ b/src/com/android/contacts/model/EntitySet.java
@@ -43,6 +43,8 @@
  * and applying another {@link EntitySet} over it.
  */
 public class EntitySet extends ArrayList<EntityDelta> implements Parcelable {
+    private boolean mSplitRawContacts;
+
     private EntitySet() {
     }
 
@@ -128,15 +130,22 @@
         }
 
         final int assertMark = diff.size();
+        int backRefs[] = new int[size()];
+
+        int rawContactIndex = 0;
 
         // Second pass builds actual operations
         for (EntityDelta delta : this) {
             final int firstBatch = diff.size();
+            backRefs[rawContactIndex++] = firstBatch;
             delta.buildDiff(diff);
 
             // Only create rules for inserts
             if (!delta.isContactInsert()) continue;
 
+            // If we are going to split all contacts, there is no point in first combining them
+            if (mSplitRawContacts) continue;
+
             if (rawContactId != -1) {
                 // Has existing contact, so bind to it strongly
                 final Builder builder = beginKeepTogether();
@@ -157,6 +166,10 @@
             }
         }
 
+        if (mSplitRawContacts) {
+            buildSplitContactDiff(diff, backRefs);
+        }
+
         // No real changes if only left with asserts
         if (diff.size() == assertMark) {
             diff.clear();
@@ -177,6 +190,47 @@
     }
 
     /**
+     * Builds {@link AggregationExceptions} to split all constituent raw contacts into
+     * separate contacts.
+     */
+    private void buildSplitContactDiff(final ArrayList<ContentProviderOperation> diff,
+            int[] backRefs) {
+        int count = size();
+        for (int i = 0; i < count; i++) {
+            for (int j = 0; j < count; j++) {
+                if (i != j) {
+                    buildSplitContactDiff(diff, i, j, backRefs);
+                }
+            }
+        }
+    }
+
+    /**
+     * Construct a {@link AggregationExceptions#TYPE_KEEP_SEPARATE}.
+     */
+    private void buildSplitContactDiff(ArrayList<ContentProviderOperation> diff, int index1,
+            int index2, int[] backRefs) {
+        Builder builder =
+                ContentProviderOperation.newUpdate(AggregationExceptions.CONTENT_URI);
+        builder.withValue(AggregationExceptions.TYPE, AggregationExceptions.TYPE_KEEP_SEPARATE);
+
+        Long rawContactId1 = get(index1).getValues().getAsLong(RawContacts._ID);
+        if (rawContactId1 != null && rawContactId1 >= 0) {
+            builder.withValue(AggregationExceptions.RAW_CONTACT_ID1, rawContactId1);
+        } else {
+            builder.withValueBackReference(AggregationExceptions.RAW_CONTACT_ID1, backRefs[index1]);
+        }
+
+        Long rawContactId2 = get(index2).getValues().getAsLong(RawContacts._ID);
+        if (rawContactId2 != null && rawContactId2 >= 0) {
+            builder.withValue(AggregationExceptions.RAW_CONTACT_ID2, rawContactId2);
+        } else {
+            builder.withValueBackReference(AggregationExceptions.RAW_CONTACT_ID2, backRefs[index2]);
+        }
+        diff.add(builder.build());
+    }
+
+    /**
      * Search all contained {@link EntityDelta} for the first one with an
      * existing {@link RawContacts#_ID} value. Usually used when creating
      * {@link AggregationExceptions} during an update.
@@ -249,6 +303,10 @@
         return randomEntry;
     }
 
+    public void splitRawContacts() {
+        mSplitRawContacts = true;
+    }
+
     /** {@inheritDoc} */
     public int describeContents() {
         // Nothing special about this parcel
diff --git a/src/com/android/contacts/model/FallbackSource.java b/src/com/android/contacts/model/FallbackSource.java
index fa545be..ebef42b 100644
--- a/src/com/android/contacts/model/FallbackSource.java
+++ b/src/com/android/contacts/model/FallbackSource.java
@@ -25,6 +25,7 @@
 import android.database.Cursor;
 import android.provider.ContactsContract.CommonDataKinds.BaseTypes;
 import android.provider.ContactsContract.CommonDataKinds.Email;
+import android.provider.ContactsContract.CommonDataKinds.Event;
 import android.provider.ContactsContract.CommonDataKinds.Im;
 import android.provider.ContactsContract.CommonDataKinds.Nickname;
 import android.provider.ContactsContract.CommonDataKinds.Note;
@@ -74,6 +75,7 @@
         inflatePhoto(inflateLevel);
         inflateNote(inflateLevel);
         inflateWebsite(inflateLevel);
+        inflateEvent(inflateLevel);
 
         setInflatedLevel(inflateLevel);
 
@@ -376,6 +378,19 @@
         return kind;
     }
 
+    protected DataKind inflateEvent(int inflateLevel) {
+        DataKind kind = getKindForMimetype(Event.CONTENT_ITEM_TYPE);
+        if (kind == null) {
+            kind = addKind(new DataKind(Event.CONTENT_ITEM_TYPE,
+                    R.string.eventLabelsGroup, -1, 150, false));
+            kind.secondary = true;
+            kind.actionHeader = new EventActionInflater();
+            kind.actionBody = new SimpleInflater(Event.START_DATE);
+        }
+
+        return kind;
+    }
+
     /**
      * Simple inflater that assumes a string resource has a "%s" that will be
      * filled from the given column.
@@ -558,6 +573,13 @@
         }
     }
 
+    public static class EventActionInflater extends CommonInflater {
+        @Override
+        protected int getTypeLabelResource(Integer type) {
+            return Event.getTypeResource(type);
+        }
+    }
+
     public static class PostalActionInflater extends CommonInflater {
         @Override
         protected int getTypeLabelResource(Integer type) {
diff --git a/src/com/android/contacts/model/GoogleSource.java b/src/com/android/contacts/model/GoogleSource.java
index 6706ec0..010982c 100644
--- a/src/com/android/contacts/model/GoogleSource.java
+++ b/src/com/android/contacts/model/GoogleSource.java
@@ -61,6 +61,7 @@
         inflatePhoto(inflateLevel);
         inflateNote(inflateLevel);
         inflateWebsite(inflateLevel);
+        inflateEvent(inflateLevel);
 
         // TODO: GOOGLE: GROUPMEMBERSHIP
 
diff --git a/src/com/android/contacts/ui/DisplayGroupsActivity.java b/src/com/android/contacts/ui/DisplayGroupsActivity.java
index 7bd7b9d..ce68dcb 100644
--- a/src/com/android/contacts/ui/DisplayGroupsActivity.java
+++ b/src/com/android/contacts/ui/DisplayGroupsActivity.java
@@ -299,7 +299,7 @@
             } else if (isUpdate()) {
                 // When has changes and "before" exists, then "update"
                 final Builder builder = ContentProviderOperation
-                        .newUpdate(mUngrouped ? Settings.CONTENT_URI : Groups.CONTENT_URI);
+                        .newUpdate(mUngrouped ? Settings.CONTENT_URI : addCallerIsSyncAdapterParameter(Groups.CONTENT_URI));
                 if (mUngrouped) {
                     builder.withSelection(Settings.ACCOUNT_NAME + "=? AND " + Settings.ACCOUNT_TYPE
                             + "=?", new String[] {
@@ -323,6 +323,12 @@
         }
     }
 
+    private static Uri addCallerIsSyncAdapterParameter(Uri uri) {
+        return uri.buildUpon()
+	        .appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER, "true")
+		.build();
+    }
+
     /**
      * {@link Comparator} to sort by {@link Groups#_ID}.
      */
diff --git a/src/com/android/contacts/ui/EditContactActivity.java b/src/com/android/contacts/ui/EditContactActivity.java
index 9c0c69a..7c644f0 100644
--- a/src/com/android/contacts/ui/EditContactActivity.java
+++ b/src/com/android/contacts/ui/EditContactActivity.java
@@ -32,12 +32,15 @@
 import android.content.Entity;
 import android.content.Intent;
 import android.content.OperationApplicationException;
+import android.content.ContentProviderOperation.Builder;
+import android.database.Cursor;
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
 import android.net.Uri;
 import android.os.Bundle;
 import android.os.RemoteException;
 import android.provider.ContactsContract;
+import android.provider.ContactsContract.AggregationExceptions;
 import android.provider.ContactsContract.Contacts;
 import android.provider.ContactsContract.RawContacts;
 import android.provider.ContactsContract.CommonDataKinds.Email;
@@ -60,8 +63,7 @@
 import android.widget.TextView;
 import android.widget.Toast;
 
-import com.google.android.collect.Lists;
-
+import com.android.contacts.ContactsListActivity;
 import com.android.contacts.ContactsUtils;
 import com.android.contacts.R;
 import com.android.contacts.ScrollingTabWidget;
@@ -78,6 +80,7 @@
 import com.android.contacts.util.EmptyService;
 import com.android.contacts.util.WeakAsyncTask;
 import com.android.internal.widget.ContactHeaderWidget;
+import com.google.android.collect.Lists;
 
 import java.lang.ref.WeakReference;
 import java.util.ArrayList;
@@ -93,9 +96,20 @@
     /** The launch code when picking a photo and the raw data is returned */
     private static final int PHOTO_PICKED_WITH_DATA = 3021;
 
+    /** The launch code when a contact to join with is returned */
+    private static final int REQUEST_JOIN_CONTACT = 3022;
+
     private static final String KEY_EDIT_STATE = "state";
     private static final String KEY_SELECTED_RAW_CONTACT = "selected";
 
+    /** The result code when view activity should close after edit returns */
+    public static final int RESULT_CLOSE_VIEW_ACTIVITY = 777;
+
+    public static final int SAVE_MODE_DEFAULT = 0;
+    public static final int SAVE_MODE_SPLIT = 1;
+    public static final int SAVE_MODE_JOIN = 2;
+
+
     private String mQuerySelection;
 
     private ScrollingTabWidget mTabWidget;
@@ -105,6 +119,7 @@
     private ContactEditorView mEditor;
 
     private EntitySet mState;
+    private long mContactIdForJoin;
 
     private ArrayList<Dialog> mManagedDialogs = Lists.newArrayList();
 
@@ -363,7 +378,7 @@
             this.setSelectedRawContactId(selectedRawContactId);
         } else {
             // Nothing remains to edit, save and bail entirely
-            this.doSaveAction();
+            this.doSaveAction(SAVE_MODE_DEFAULT);
         }
 
         // Show editor now that we've loaded state
@@ -461,7 +476,7 @@
     public void onClick(View view) {
         switch (view.getId()) {
             case R.id.btn_done:
-                doSaveAction();
+                doSaveAction(SAVE_MODE_DEFAULT);
                 break;
             case R.id.btn_discard:
                 doRevertAction();
@@ -472,7 +487,7 @@
     /** {@inheritDoc} */
     @Override
     public void onBackPressed() {
-        doSaveAction();
+        doSaveAction(SAVE_MODE_DEFAULT);
     }
 
     /** {@inheritDoc} */
@@ -490,11 +505,16 @@
                 bindHeader();
                 break;
             }
+
+            case REQUEST_JOIN_CONTACT: {
+                if (resultCode == RESULT_OK && data != null) {
+                    final long contactId = ContentUris.parseId(data.getData());
+                    joinAggregate(contactId);
+                }
+            }
         }
     }
 
-
-
     @Override
     public boolean onCreateOptionsMenu(Menu menu) {
         super.onCreateOptionsMenu(menu);
@@ -519,7 +539,7 @@
     public boolean onOptionsItemSelected(MenuItem item) {
         switch (item.getItemId()) {
             case R.id.menu_done:
-                return doSaveAction();
+                return doSaveAction(SAVE_MODE_DEFAULT);
             case R.id.menu_discard:
                 return doRevertAction();
             case R.id.menu_add:
@@ -530,6 +550,10 @@
                 return doPickPhotoAction();
             case R.id.menu_photo_remove:
                 return doRemovePhotoAction();
+            case R.id.menu_split:
+                return doSplitContactAction();
+            case R.id.menu_join:
+                return doJoinContactAction();
         }
         return false;
     }
@@ -548,12 +572,14 @@
         private static final int RESULT_SUCCESS = 1;
         private static final int RESULT_FAILURE = 2;
 
-        private long mSavedId;
-
         private WeakReference<ProgressDialog> progress;
 
-        public PersistTask(EditContactActivity target) {
+        private int mSaveMode;
+        private Uri mContactLookupUri = null;
+
+        public PersistTask(EditContactActivity target, int saveMode) {
             super(target);
+            mSaveMode = saveMode;
         }
 
         /** {@inheritDoc} */
@@ -587,20 +613,19 @@
                 try {
                     // Build operations and try applying
                     final ArrayList<ContentProviderOperation> diff = state.buildDiff();
-                    ContentProviderResult[] results;
+                    ContentProviderResult[] results = null;
                     if (!diff.isEmpty()) {
                          results = resolver.applyBatch(ContactsContract.AUTHORITY, diff);
-                         Intent intent = new Intent();
-                         final long rawContactId = getRawContactId(state, diff, results);
-                         final Uri rawContactUri = ContentUris.withAppendedId(
-                                 RawContacts.CONTENT_URI, rawContactId);
+                    }
 
-                         // convert the raw contact URI to a contact URI
-                         final Uri contactLookupUri = RawContacts.getContactLookupUri(resolver,
-                                 rawContactUri);
-                         intent.setData(contactLookupUri);
-                         target.setResult(RESULT_OK, intent);
-                         target.finish();
+                    final long rawContactId = getRawContactId(state, diff, results);
+                    if (rawContactId != -1) {
+                        final Uri rawContactUri = ContentUris.withAppendedId(
+                                RawContacts.CONTENT_URI, rawContactId);
+
+                        // convert the raw contact URI to a contact URI
+                        mContactLookupUri = RawContacts.getContactLookupUri(resolver,
+                                rawContactUri);
                     }
                     result = (diff.size() > 0) ? RESULT_SUCCESS : RESULT_UNCHANGED;
                     break;
@@ -648,16 +673,18 @@
         protected void onPostExecute(EditContactActivity target, Integer result) {
             final Context context = target;
 
-            if (result == RESULT_SUCCESS) {
+            if (result == RESULT_SUCCESS && mSaveMode != SAVE_MODE_JOIN) {
                 Toast.makeText(context, R.string.contactSavedToast, Toast.LENGTH_SHORT).show();
             } else if (result == RESULT_FAILURE) {
                 Toast.makeText(context, R.string.contactSavedErrorToast, Toast.LENGTH_LONG).show();
             }
 
             progress.get().dismiss();
-            target.finish();
+
             // Stop the service that was protecting us
             context.stopService(new Intent(context, EmptyService.class));
+
+            target.onSaveCompleted(result != RESULT_FAILURE, mSaveMode, mContactLookupUri);
         }
     }
 
@@ -665,15 +692,127 @@
      * Saves or creates the contact based on the mode, and if successful
      * finishes the activity.
      */
-    private boolean doSaveAction() {
+    private boolean doSaveAction(int saveMode) {
         if (!hasValidState()) return false;
 
-        final PersistTask task = new PersistTask(this);
+        final PersistTask task = new PersistTask(this, saveMode);
         task.execute(mState);
 
         return true;
     }
 
+    private void onSaveCompleted(boolean success, int saveMode, Uri contactLookupUri) {
+        switch (saveMode) {
+            case SAVE_MODE_DEFAULT:
+                if (success) {
+                    Intent intent = new Intent();
+                    intent.setData(contactLookupUri);
+                    setResult(RESULT_OK, intent);
+                }
+                finish();
+                break;
+
+            case SAVE_MODE_SPLIT:
+                if (success) {
+                    Intent intent = new Intent();
+                    intent.setData(contactLookupUri);
+                    setResult(RESULT_CLOSE_VIEW_ACTIVITY, intent);
+                }
+                finish();
+                break;
+
+            case SAVE_MODE_JOIN:
+                if (success) {
+                    showJoinAggregateActivity(contactLookupUri);
+                }
+                break;
+        }
+    }
+
+    /**
+     * Shows a list of aggregates that can be joined into the currently viewed aggregate.
+     *
+     * @param contactLookupUri the fresh URI for the currently edited contact (after saving it)
+     */
+    public void showJoinAggregateActivity(Uri contactLookupUri) {
+        if (contactLookupUri == null) {
+            return;
+        }
+
+        mContactIdForJoin = ContentUris.parseId(contactLookupUri);
+        Intent intent = new Intent(ContactsListActivity.JOIN_AGGREGATE);
+        intent.putExtra(ContactsListActivity.EXTRA_AGGREGATE_ID, mContactIdForJoin);
+        startActivityForResult(intent, REQUEST_JOIN_CONTACT);
+    }
+
+    /**
+     * Performs aggregation with the contact selected by the user from suggestions or A-Z list.
+     */
+    private void joinAggregate(final long contactId) {
+        ContentResolver resolver = getContentResolver();
+
+        // Load raw contact IDs for all raw contacts involved - currently edited and selected
+        // in the join UIs
+        Cursor c = resolver.query(RawContacts.CONTENT_URI,
+                new String[] {RawContacts._ID},
+                RawContacts.CONTACT_ID + "=" + contactId
+                + " OR " + RawContacts.CONTACT_ID + "=" + mContactIdForJoin, null, null);
+
+        long rawContactIds[];
+        try {
+            rawContactIds = new long[c.getCount()];
+            for (int i = 0; i < rawContactIds.length; i++) {
+                c.moveToNext();
+                rawContactIds[i] = c.getLong(0);
+            }
+        } finally {
+            c.close();
+        }
+
+        // For each pair of raw contacts, insert an aggregation exception
+        ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>();
+        for (int i = 0; i < rawContactIds.length; i++) {
+            for (int j = 0; j < rawContactIds.length; j++) {
+                if (i != j) {
+                    buildJoinContactDiff(operations, rawContactIds[i], rawContactIds[j]);
+                }
+            }
+        }
+
+        // Apply all aggregation exceptions as one batch
+        try {
+            getContentResolver().applyBatch(ContactsContract.AUTHORITY, operations);
+
+            // We can use any of the constituent raw contacts to refresh the UI - why not the first
+            Intent intent = new Intent();
+            intent.setData(ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactIds[0]));
+
+            // Reload the new state from database
+            new QueryEntitiesTask(this).execute(intent);
+
+            Toast.makeText(this, R.string.contactsJoinedMessage, Toast.LENGTH_LONG).show();
+        } catch (RemoteException e) {
+            Log.e(TAG, "Failed to apply aggregation exception batch", e);
+            Toast.makeText(this, R.string.contactSavedErrorToast, Toast.LENGTH_LONG).show();
+        } catch (OperationApplicationException e) {
+            Log.e(TAG, "Failed to apply aggregation exception batch", e);
+            Toast.makeText(this, R.string.contactSavedErrorToast, Toast.LENGTH_LONG).show();
+        }
+    }
+
+    /**
+     * Construct a {@link AggregationExceptions#TYPE_KEEP_TOGETHER} ContentProviderOperation.
+     */
+    private void buildJoinContactDiff(ArrayList<ContentProviderOperation> operations,
+            long rawContactId1, long rawContactId2) {
+        Builder builder =
+                ContentProviderOperation.newUpdate(AggregationExceptions.CONTENT_URI);
+        builder.withValue(AggregationExceptions.TYPE, AggregationExceptions.TYPE_KEEP_TOGETHER);
+        builder.withValue(AggregationExceptions.RAW_CONTACT_ID1, rawContactId1);
+        builder.withValue(AggregationExceptions.RAW_CONTACT_ID2, rawContactId2);
+        operations.add(builder.build());
+    }
+
     /**
      * Revert any changes the user has made, and finish the activity.
      */
@@ -751,6 +890,15 @@
         }
     }
 
+    private boolean doSplitContactAction() {
+        mState.splitRawContacts();
+        return doSaveAction(SAVE_MODE_SPLIT);
+    }
+
+    private boolean doJoinContactAction() {
+        return doSaveAction(SAVE_MODE_JOIN);
+    }
+
 
 
 
diff --git a/src/com/android/contacts/ui/FastTrackActivity.java b/src/com/android/contacts/ui/QuickContactActivity.java
similarity index 61%
rename from src/com/android/contacts/ui/FastTrackActivity.java
rename to src/com/android/contacts/ui/QuickContactActivity.java
index 6958298..5cd2d18 100644
--- a/src/com/android/contacts/ui/FastTrackActivity.java
+++ b/src/com/android/contacts/ui/QuickContactActivity.java
@@ -21,22 +21,23 @@
 import android.graphics.Rect;
 import android.net.Uri;
 import android.os.Bundle;
-import android.provider.ContactsContract.FastTrack;
+import android.provider.ContactsContract.QuickContact;
 
 /**
- * Stub translucent activity that just shows {@link FastTrackWindow} floating
+ * Stub translucent activity that just shows {@link QuickContactWindow} floating
  * above the caller. This temporary hack should eventually be replaced with
  * direct framework support.
  */
-public final class FastTrackActivity extends Activity implements FastTrackWindow.OnDismissListener {
-    private FastTrackWindow mFastTrack;
+public final class QuickContactActivity extends Activity implements
+        QuickContactWindow.OnDismissListener {
+    private QuickContactWindow mQuickContact;
 
     @Override
     protected void onCreate(Bundle icicle) {
         super.onCreate(icicle);
 
-        if (FastTrackWindow.TRACE_LAUNCH) {
-            android.os.Debug.startMethodTracing(FastTrackWindow.TRACE_TAG);
+        if (QuickContactWindow.TRACE_LAUNCH) {
+            android.os.Debug.startMethodTracing(QuickContactWindow.TRACE_TAG);
         }
 
         // Use our local window token for now
@@ -45,22 +46,22 @@
         final Bundle extras = intent.getExtras();
 
         // Read requested parameters for displaying
-        final Rect target = (Rect)extras.getParcelable(FastTrack.EXTRA_TARGET_RECT);
-        final int mode = extras.getInt(FastTrack.EXTRA_MODE, FastTrack.MODE_MEDIUM);
-        final String[] excludeMimes = extras.getStringArray(FastTrack.EXTRA_EXCLUDE_MIMES);
+        final Rect target = (Rect)extras.getParcelable(QuickContact.EXTRA_TARGET_RECT);
+        final int mode = extras.getInt(QuickContact.EXTRA_MODE, QuickContact.MODE_MEDIUM);
+        final String[] excludeMimes = extras.getStringArray(QuickContact.EXTRA_EXCLUDE_MIMES);
 
-        mFastTrack = new FastTrackWindow(this, this);
-        mFastTrack.show(lookupUri, target, mode, excludeMimes);
+        mQuickContact = new QuickContactWindow(this, this);
+        mQuickContact.show(lookupUri, target, mode, excludeMimes);
     }
 
     @Override
     protected void onStop() {
         super.onStop();
-        mFastTrack.dismiss();
+        mQuickContact.dismiss();
     }
 
     /** {@inheritDoc} */
-    public void onDismiss(FastTrackWindow dialog) {
+    public void onDismiss(QuickContactWindow dialog) {
         // When dismissed, finish this activity
         finish();
     }
diff --git a/src/com/android/contacts/ui/FastTrackWindow.java b/src/com/android/contacts/ui/QuickContactWindow.java
similarity index 95%
rename from src/com/android/contacts/ui/FastTrackWindow.java
rename to src/com/android/contacts/ui/QuickContactWindow.java
index 25a0167..6059079 100644
--- a/src/com/android/contacts/ui/FastTrackWindow.java
+++ b/src/com/android/contacts/ui/QuickContactWindow.java
@@ -40,7 +40,7 @@
 import android.net.Uri;
 import android.provider.ContactsContract.Contacts;
 import android.provider.ContactsContract.Data;
-import android.provider.ContactsContract.FastTrack;
+import android.provider.ContactsContract.QuickContact;
 import android.provider.ContactsContract.Presence;
 import android.provider.ContactsContract.RawContacts;
 import android.provider.ContactsContract.CommonDataKinds.Email;
@@ -86,17 +86,17 @@
  * Window that shows fast-track contact details for a specific
  * {@link Contacts#_ID}.
  */
-public class FastTrackWindow implements Window.Callback,
+public class QuickContactWindow implements Window.Callback,
         NotifyingAsyncQueryHandler.AsyncQueryListener, View.OnClickListener,
         AbsListView.OnItemClickListener, CompoundButton.OnCheckedChangeListener {
-    private static final String TAG = "FastTrackWindow";
+    private static final String TAG = "QuickContactWindow";
 
     /**
-     * Interface used to allow the person showing a {@link FastTrackWindow} to
+     * Interface used to allow the person showing a {@link QuickContactWindow} to
      * know when the window has been dismissed.
      */
     public interface OnDismissListener {
-        public void onDismiss(FastTrackWindow dialog);
+        public void onDismiss(QuickContactWindow dialog);
     }
 
     private final Context mContext;
@@ -164,13 +164,13 @@
     private static final int TOKEN_DATA = 3;
 
     static final boolean TRACE_LAUNCH = false;
-    static final String TRACE_TAG = "fasttrack";
+    static final String TRACE_TAG = "quickcontact";
 
     /**
      * Prepare a fast-track window to show in the given {@link Context}.
      */
-    public FastTrackWindow(Context context) {
-        mContext = new ContextThemeWrapper(context, R.style.FastTrack);
+    public QuickContactWindow(Context context) {
+        mContext = new ContextThemeWrapper(context, R.style.QuickContact);
         mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
         mWindowManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
 
@@ -178,7 +178,7 @@
         mWindow.setCallback(this);
         mWindow.setWindowManager(mWindowManager, null, null);
 
-        mWindow.setContentView(R.layout.fasttrack);
+        mWindow.setContentView(R.layout.quickcontact);
 
         mArrowUp = (ImageView)mWindow.findViewById(R.id.arrow_up);
         mArrowDown = (ImageView)mWindow.findViewById(R.id.arrow_down);
@@ -186,9 +186,9 @@
         mResolveCache = new ResolveCache(mContext);
 
         final Resources res = mContext.getResources();
-        mShadowHeight = res.getDimensionPixelSize(R.dimen.fasttrack_shadow);
+        mShadowHeight = res.getDimensionPixelSize(R.dimen.quickcontact_shadow);
 
-        mTrack = (ViewGroup)mWindow.findViewById(R.id.fasttrack);
+        mTrack = (ViewGroup)mWindow.findViewById(R.id.quickcontact);
         mTrackScroll = (HorizontalScrollView)mWindow.findViewById(R.id.scroll);
 
         mFooter = mWindow.findViewById(R.id.footer);
@@ -199,7 +199,7 @@
         mSetPrimaryCheckBox.setOnCheckedChangeListener(this);
 
         // Prepare track entrance animation
-        mTrackAnim = AnimationUtils.loadAnimation(mContext, R.anim.fasttrack);
+        mTrackAnim = AnimationUtils.loadAnimation(mContext, R.anim.quickcontact);
         mTrackAnim.setInterpolator(new Interpolator() {
             public float getInterpolation(float t) {
                 // Pushes past the target area, then snaps back into place.
@@ -215,7 +215,7 @@
      * notify the given {@link OnDismissListener} each time this dialog is
      * dismissed.
      */
-    public FastTrackWindow(Context context, OnDismissListener dismissListener) {
+    public QuickContactWindow(Context context, OnDismissListener dismissListener) {
         this(context);
         mDismissListener = dismissListener;
     }
@@ -223,13 +223,13 @@
     private View getHeaderView(int mode) {
         View header = null;
         switch (mode) {
-            case FastTrack.MODE_SMALL:
+            case QuickContact.MODE_SMALL:
                 header = mWindow.findViewById(R.id.header_small);
                 break;
-            case FastTrack.MODE_MEDIUM:
+            case QuickContact.MODE_MEDIUM:
                 header = mWindow.findViewById(R.id.header_medium);
                 break;
-            case FastTrack.MODE_LARGE:
+            case QuickContact.MODE_LARGE:
                 header = mWindow.findViewById(R.id.header_large);
                 break;
         }
@@ -264,7 +264,7 @@
         mHeader = getHeaderView(mode);
         mExcludeMimes = excludeMimes;
 
-        setHeaderText(R.id.name, R.string.fasttrack_missing_name);
+        setHeaderText(R.id.name, R.string.quickcontact_missing_name);
         setHeaderText(R.id.status, null);
         setHeaderImage(R.id.presence, null);
 
@@ -325,14 +325,14 @@
             // edge with top of anchor area, and adjusting to inset arrow.
             showArrow(R.id.arrow_down, mAnchor.centerX());
             l.y = mAnchor.top - blockHeight + mShadowHeight;
-            l.windowAnimations = R.style.FastTrackAboveAnimation;
+            l.windowAnimations = R.style.QuickContactAboveAnimation;
 
         } else {
             // Otherwise show upwards callout, aligning block top with bottom of
             // anchor area, and adjusting to inset arrow.
             showArrow(R.id.arrow_up, mAnchor.centerX());
             l.y = mAnchor.bottom - mShadowHeight;
-            l.windowAnimations = R.style.FastTrackBelowAnimation;
+            l.windowAnimations = R.style.QuickContactBelowAnimation;
 
         }
 
@@ -418,10 +418,10 @@
      */
     private synchronized void considerShowing() {
         if (mHasSummary && mHasSocial && mHasActions && !mShowing) {
-            if (mMode == FastTrack.MODE_MEDIUM && !mHasValidSocial) {
+            if (mMode == QuickContact.MODE_MEDIUM && !mHasValidSocial) {
                 // Missing valid social, swap medium for small header
                 mHeader.setVisibility(View.GONE);
-                mHeader = getHeaderView(FastTrack.MODE_SMALL);
+                mHeader = getHeaderView(QuickContact.MODE_SMALL);
             }
 
             // All queries have returned, pull curtain
@@ -546,21 +546,21 @@
         int resId = -1;
         switch (status) {
             case Presence.AVAILABLE:
-                resId = R.drawable.fasttrack_slider_presence_active;
+                resId = R.drawable.quickcontact_slider_presence_active;
                 break;
             case Presence.IDLE:
             case Presence.AWAY:
-                resId = R.drawable.fasttrack_slider_presence_away;
+                resId = R.drawable.quickcontact_slider_presence_away;
                 break;
             case Presence.DO_NOT_DISTURB:
-                resId = R.drawable.fasttrack_slider_presence_busy;
+                resId = R.drawable.quickcontact_slider_presence_busy;
                 break;
             case Presence.INVISIBLE:
-                resId = R.drawable.fasttrack_slider_presence_inactive;
+                resId = R.drawable.quickcontact_slider_presence_inactive;
                 break;
             case Presence.OFFLINE:
             default:
-                resId = R.drawable.fasttrack_slider_presence_inactive;
+                resId = R.drawable.quickcontact_slider_presence_inactive;
         }
         return mContext.getResources().getDrawable(resId);
     }
@@ -675,6 +675,7 @@
                 // Otherwise fall back to default VIEW action
                 mIntent = new Intent(Intent.ACTION_VIEW, mDataUri);
             }
+	    mIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         }
 
         /** {@inheritDoc} */
@@ -759,7 +760,9 @@
         /** {@inheritDoc} */
         public Intent getIntent() {
             final Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, mId);
-            return new Intent(Intent.ACTION_VIEW, contactUri);
+            final Intent intent = new Intent(Intent.ACTION_VIEW, contactUri);
+	    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+	    return intent;
         }
 
         /** {@inheritDoc} */
@@ -996,7 +999,8 @@
      * the icon provided by the {@link DataKind}.
      */
     private View inflateAction(String mimeType) {
-        CheckableImageView view = (CheckableImageView)mInflater.inflate(R.layout.fasttrack_item, mTrack, false);
+        CheckableImageView view = (CheckableImageView)mInflater.inflate(
+                R.layout.quickcontact_item, mTrack, false);
         boolean isActionSet = false;
 
         // Add direct intent if single child, otherwise flag for multiple
@@ -1092,7 +1096,8 @@
                 }
 
             } catch (ActivityNotFoundException e) {
-                Toast.makeText(mContext, R.string.fasttrack_missing_app, Toast.LENGTH_SHORT).show();
+                Toast.makeText(mContext, R.string.quickcontact_missing_app, Toast.LENGTH_SHORT)
+                        .show();
             }
         } else if (tag instanceof ActionList) {
             // Incoming tag is a MIME-type, so show resolution list
@@ -1117,7 +1122,8 @@
 
                 public View getView(int position, View convertView, ViewGroup parent) {
                     if (convertView == null) {
-                        convertView = mInflater.inflate(R.layout.fasttrack_resolve_item, parent, false);
+                        convertView = mInflater.inflate(
+                                R.layout.quickcontact_resolve_item, parent, false);
                     }
 
                     // Set action title based on summary value
diff --git a/src/com/android/contacts/ui/widget/CheckableImageView.java b/src/com/android/contacts/ui/widget/CheckableImageView.java
index ceddf57..ff5abc0 100644
--- a/src/com/android/contacts/ui/widget/CheckableImageView.java
+++ b/src/com/android/contacts/ui/widget/CheckableImageView.java
@@ -23,7 +23,7 @@
 
 /**
  * A special variation of ImageView that can be used as a checkable object.
- * This is used as the background view of fasttrack chiclet, which is in checked state
+ * This is used as the background view of quickcontact chiclet, which is in checked state
  * when disambig list is shown. Otherwise, it works identically to a ImageView.
  */
 public class CheckableImageView extends ImageView implements Checkable {
diff --git a/src/com/android/contacts/ui/widget/ContactEditorView.java b/src/com/android/contacts/ui/widget/ContactEditorView.java
index 245986b..c723f6f 100644
--- a/src/com/android/contacts/ui/widget/ContactEditorView.java
+++ b/src/com/android/contacts/ui/widget/ContactEditorView.java
@@ -35,7 +35,6 @@
 import android.provider.ContactsContract.RawContacts;
 import android.provider.ContactsContract.CommonDataKinds.Photo;
 import android.provider.ContactsContract.CommonDataKinds.StructuredName;
-import android.text.TextWatcher;
 import android.util.AttributeSet;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -205,6 +204,9 @@
                 parent.addView(section);
             }
         }
+        final int secondaryVisibility = mSecondary.getChildCount() > 0 ? View.VISIBLE : View.GONE;
+        mSecondary.setVisibility(secondaryVisibility);
+        mSecondaryHeader.setVisibility(secondaryVisibility);
     }
 
     /**