Merge "Set ContactInfo.normalizedNumber to null for SIP addresses"
diff --git a/res/drawable-hdpi/btn_dial_action_left_disable.9.png b/res/drawable-hdpi/btn_dial_action_left_disable.9.png
index 7ba8672..8a2625b 100644
--- a/res/drawable-hdpi/btn_dial_action_left_disable.9.png
+++ b/res/drawable-hdpi/btn_dial_action_left_disable.9.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_dial_action_left_disable_focused.9.png b/res/drawable-hdpi/btn_dial_action_left_disable_focused.9.png
index b4300b6..32c9772 100644
--- a/res/drawable-hdpi/btn_dial_action_left_disable_focused.9.png
+++ b/res/drawable-hdpi/btn_dial_action_left_disable_focused.9.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_dial_action_left_normal.9.png b/res/drawable-hdpi/btn_dial_action_left_normal.9.png
index 7ba8672..255ae18 100644
--- a/res/drawable-hdpi/btn_dial_action_left_normal.9.png
+++ b/res/drawable-hdpi/btn_dial_action_left_normal.9.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_dial_action_left_pressed.9.png b/res/drawable-hdpi/btn_dial_action_left_pressed.9.png
index 1dc40b7..f63fee6 100644
--- a/res/drawable-hdpi/btn_dial_action_left_pressed.9.png
+++ b/res/drawable-hdpi/btn_dial_action_left_pressed.9.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_dial_action_left_selected.9.png b/res/drawable-hdpi/btn_dial_action_left_selected.9.png
index 4f6c7cf..77ddcb0 100644
--- a/res/drawable-hdpi/btn_dial_action_left_selected.9.png
+++ b/res/drawable-hdpi/btn_dial_action_left_selected.9.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_dial_action_middle_disable.9.png b/res/drawable-hdpi/btn_dial_action_middle_disable.9.png
index 0a6cd66..8556118 100644
--- a/res/drawable-hdpi/btn_dial_action_middle_disable.9.png
+++ b/res/drawable-hdpi/btn_dial_action_middle_disable.9.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_dial_action_middle_disable_focused.9.png b/res/drawable-hdpi/btn_dial_action_middle_disable_focused.9.png
index b28176f..965fe7d 100644
--- a/res/drawable-hdpi/btn_dial_action_middle_disable_focused.9.png
+++ b/res/drawable-hdpi/btn_dial_action_middle_disable_focused.9.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_dial_action_middle_normal.9.png b/res/drawable-hdpi/btn_dial_action_middle_normal.9.png
index 0a6cd66..cef64b3 100644
--- a/res/drawable-hdpi/btn_dial_action_middle_normal.9.png
+++ b/res/drawable-hdpi/btn_dial_action_middle_normal.9.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_dial_action_middle_pressed.9.png b/res/drawable-hdpi/btn_dial_action_middle_pressed.9.png
index 58f187d..971ea2d 100644
--- a/res/drawable-hdpi/btn_dial_action_middle_pressed.9.png
+++ b/res/drawable-hdpi/btn_dial_action_middle_pressed.9.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_dial_action_middle_selected.9.png b/res/drawable-hdpi/btn_dial_action_middle_selected.9.png
index f201dee..3fa740c 100644
--- a/res/drawable-hdpi/btn_dial_action_middle_selected.9.png
+++ b/res/drawable-hdpi/btn_dial_action_middle_selected.9.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_dial_action_right_disable.9.png b/res/drawable-hdpi/btn_dial_action_right_disable.9.png
index 6e6fa30..c9bb623 100644
--- a/res/drawable-hdpi/btn_dial_action_right_disable.9.png
+++ b/res/drawable-hdpi/btn_dial_action_right_disable.9.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_dial_action_right_disable_focused.9.png b/res/drawable-hdpi/btn_dial_action_right_disable_focused.9.png
index 46a042f..1b909d4 100644
--- a/res/drawable-hdpi/btn_dial_action_right_disable_focused.9.png
+++ b/res/drawable-hdpi/btn_dial_action_right_disable_focused.9.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_dial_action_right_normal.9.png b/res/drawable-hdpi/btn_dial_action_right_normal.9.png
index 6e6fa30..d994935 100644
--- a/res/drawable-hdpi/btn_dial_action_right_normal.9.png
+++ b/res/drawable-hdpi/btn_dial_action_right_normal.9.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_dial_action_right_pressed.9.png b/res/drawable-hdpi/btn_dial_action_right_pressed.9.png
index d66a509..416a925 100644
--- a/res/drawable-hdpi/btn_dial_action_right_pressed.9.png
+++ b/res/drawable-hdpi/btn_dial_action_right_pressed.9.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_dial_action_right_selected.9.png b/res/drawable-hdpi/btn_dial_action_right_selected.9.png
index d2ee98b..9e1d474 100644
--- a/res/drawable-hdpi/btn_dial_action_right_selected.9.png
+++ b/res/drawable-hdpi/btn_dial_action_right_selected.9.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_dial_normal.9.png b/res/drawable-hdpi/btn_dial_normal.9.png
index 5702e47..8126679 100644
--- a/res/drawable-hdpi/btn_dial_normal.9.png
+++ b/res/drawable-hdpi/btn_dial_normal.9.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_dial_pressed.9.png b/res/drawable-hdpi/btn_dial_pressed.9.png
index a5b51d5..e38ae1e 100644
--- a/res/drawable-hdpi/btn_dial_pressed.9.png
+++ b/res/drawable-hdpi/btn_dial_pressed.9.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_dial_selected.9.png b/res/drawable-hdpi/btn_dial_selected.9.png
index b578146..f38b767 100644
--- a/res/drawable-hdpi/btn_dial_selected.9.png
+++ b/res/drawable-hdpi/btn_dial_selected.9.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_dial_textfield_activated.9.png b/res/drawable-hdpi/btn_dial_textfield_activated.9.png
index c937c5e..58d0b6a 100644
--- a/res/drawable-hdpi/btn_dial_textfield_activated.9.png
+++ b/res/drawable-hdpi/btn_dial_textfield_activated.9.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_dial_textfield_normal.9.png b/res/drawable-hdpi/btn_dial_textfield_normal.9.png
index 0c38b39..6234b7b 100644
--- a/res/drawable-hdpi/btn_dial_textfield_normal.9.png
+++ b/res/drawable-hdpi/btn_dial_textfield_normal.9.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_dial_textfield_pressed.9.png b/res/drawable-hdpi/btn_dial_textfield_pressed.9.png
index 22d8235..dbceaf2 100644
--- a/res/drawable-hdpi/btn_dial_textfield_pressed.9.png
+++ b/res/drawable-hdpi/btn_dial_textfield_pressed.9.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_dial_textfield_selected.9.png b/res/drawable-hdpi/btn_dial_textfield_selected.9.png
index 1fe4dfc..710c88c 100644
--- a/res/drawable-hdpi/btn_dial_textfield_selected.9.png
+++ b/res/drawable-hdpi/btn_dial_textfield_selected.9.png
Binary files differ
diff --git a/res/drawable-hdpi/dial_num_0_wht.png b/res/drawable-hdpi/dial_num_0_wht.png
index d46f5f8..d9a139c 100644
--- a/res/drawable-hdpi/dial_num_0_wht.png
+++ b/res/drawable-hdpi/dial_num_0_wht.png
Binary files differ
diff --git a/res/drawable-hdpi/dial_num_1_no_vm_wht.png b/res/drawable-hdpi/dial_num_1_no_vm_wht.png
index b40dbed..30329ae 100644
--- a/res/drawable-hdpi/dial_num_1_no_vm_wht.png
+++ b/res/drawable-hdpi/dial_num_1_no_vm_wht.png
Binary files differ
diff --git a/res/drawable-hdpi/dial_num_2_wht.png b/res/drawable-hdpi/dial_num_2_wht.png
index bcd2908..3ac9d36 100644
--- a/res/drawable-hdpi/dial_num_2_wht.png
+++ b/res/drawable-hdpi/dial_num_2_wht.png
Binary files differ
diff --git a/res/drawable-hdpi/dial_num_3_wht.png b/res/drawable-hdpi/dial_num_3_wht.png
index 8d2257c..c3896cd 100644
--- a/res/drawable-hdpi/dial_num_3_wht.png
+++ b/res/drawable-hdpi/dial_num_3_wht.png
Binary files differ
diff --git a/res/drawable-hdpi/dial_num_4_wht.png b/res/drawable-hdpi/dial_num_4_wht.png
index 41456ba..2366755 100644
--- a/res/drawable-hdpi/dial_num_4_wht.png
+++ b/res/drawable-hdpi/dial_num_4_wht.png
Binary files differ
diff --git a/res/drawable-hdpi/dial_num_5_wht.png b/res/drawable-hdpi/dial_num_5_wht.png
index b80302c..437ce93 100644
--- a/res/drawable-hdpi/dial_num_5_wht.png
+++ b/res/drawable-hdpi/dial_num_5_wht.png
Binary files differ
diff --git a/res/drawable-hdpi/dial_num_6_wht.png b/res/drawable-hdpi/dial_num_6_wht.png
index f264730..ca6a87b 100644
--- a/res/drawable-hdpi/dial_num_6_wht.png
+++ b/res/drawable-hdpi/dial_num_6_wht.png
Binary files differ
diff --git a/res/drawable-hdpi/dial_num_7_wht.png b/res/drawable-hdpi/dial_num_7_wht.png
index 7d85570..1e6a2ed 100644
--- a/res/drawable-hdpi/dial_num_7_wht.png
+++ b/res/drawable-hdpi/dial_num_7_wht.png
Binary files differ
diff --git a/res/drawable-hdpi/dial_num_8_wht.png b/res/drawable-hdpi/dial_num_8_wht.png
index 29ab93d..113a58a 100644
--- a/res/drawable-hdpi/dial_num_8_wht.png
+++ b/res/drawable-hdpi/dial_num_8_wht.png
Binary files differ
diff --git a/res/drawable-hdpi/dial_num_9_wht.png b/res/drawable-hdpi/dial_num_9_wht.png
index 0d7c515..ed52823 100644
--- a/res/drawable-hdpi/dial_num_9_wht.png
+++ b/res/drawable-hdpi/dial_num_9_wht.png
Binary files differ
diff --git a/res/drawable-hdpi/dial_num_pound_blk.png b/res/drawable-hdpi/dial_num_pound_blk.png
index fcfc58c..ee772f1 100644
--- a/res/drawable-hdpi/dial_num_pound_blk.png
+++ b/res/drawable-hdpi/dial_num_pound_blk.png
Binary files differ
diff --git a/res/drawable-hdpi/dial_num_pound_wht.png b/res/drawable-hdpi/dial_num_pound_wht.png
index 8c7bce3..0bad3f9 100644
--- a/res/drawable-hdpi/dial_num_pound_wht.png
+++ b/res/drawable-hdpi/dial_num_pound_wht.png
Binary files differ
diff --git a/res/drawable-hdpi/dial_num_star_blk.png b/res/drawable-hdpi/dial_num_star_blk.png
index ddda118..28a4504 100644
--- a/res/drawable-hdpi/dial_num_star_blk.png
+++ b/res/drawable-hdpi/dial_num_star_blk.png
Binary files differ
diff --git a/res/drawable-hdpi/dial_num_star_wht.png b/res/drawable-hdpi/dial_num_star_wht.png
index 6fd5d0a..fa8b047 100644
--- a/res/drawable-hdpi/dial_num_star_wht.png
+++ b/res/drawable-hdpi/dial_num_star_wht.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_contact_list_picture.png b/res/drawable-hdpi/ic_contact_list_picture.png
old mode 100755
new mode 100644
index 296ab9f..b96fbf4
--- a/res/drawable-hdpi/ic_contact_list_picture.png
+++ b/res/drawable-hdpi/ic_contact_list_picture.png
Binary files differ
diff --git a/res/drawable-hdpi/aizy_bottom.png b/res/drawable-hdpi/temp_aizy_bottom.png
similarity index 100%
rename from res/drawable-hdpi/aizy_bottom.png
rename to res/drawable-hdpi/temp_aizy_bottom.png
Binary files differ
diff --git a/res/drawable-mdpi/btn_dial_action_left_disable.9.png b/res/drawable-mdpi/btn_dial_action_left_disable.9.png
index 6ab27d8..af596d1 100644
--- a/res/drawable-mdpi/btn_dial_action_left_disable.9.png
+++ b/res/drawable-mdpi/btn_dial_action_left_disable.9.png
Binary files differ
diff --git a/res/drawable-mdpi/btn_dial_action_left_disable_focused.9.png b/res/drawable-mdpi/btn_dial_action_left_disable_focused.9.png
index 5bba3c4..b0188dc 100644
--- a/res/drawable-mdpi/btn_dial_action_left_disable_focused.9.png
+++ b/res/drawable-mdpi/btn_dial_action_left_disable_focused.9.png
Binary files differ
diff --git a/res/drawable-mdpi/btn_dial_action_left_normal.9.png b/res/drawable-mdpi/btn_dial_action_left_normal.9.png
index 6ab27d8..6f7d991 100644
--- a/res/drawable-mdpi/btn_dial_action_left_normal.9.png
+++ b/res/drawable-mdpi/btn_dial_action_left_normal.9.png
Binary files differ
diff --git a/res/drawable-mdpi/btn_dial_action_left_pressed.9.png b/res/drawable-mdpi/btn_dial_action_left_pressed.9.png
index 542abe7..31f9e70 100644
--- a/res/drawable-mdpi/btn_dial_action_left_pressed.9.png
+++ b/res/drawable-mdpi/btn_dial_action_left_pressed.9.png
Binary files differ
diff --git a/res/drawable-mdpi/btn_dial_action_left_selected.9.png b/res/drawable-mdpi/btn_dial_action_left_selected.9.png
index 34caba1..96e3aec 100644
--- a/res/drawable-mdpi/btn_dial_action_left_selected.9.png
+++ b/res/drawable-mdpi/btn_dial_action_left_selected.9.png
Binary files differ
diff --git a/res/drawable-mdpi/btn_dial_action_right_disable.9.png b/res/drawable-mdpi/btn_dial_action_right_disable.9.png
index 85dfff0..9bde573 100644
--- a/res/drawable-mdpi/btn_dial_action_right_disable.9.png
+++ b/res/drawable-mdpi/btn_dial_action_right_disable.9.png
Binary files differ
diff --git a/res/drawable-mdpi/btn_dial_action_right_disable_focused.9.png b/res/drawable-mdpi/btn_dial_action_right_disable_focused.9.png
index 1f76f0c..c2aa050 100644
--- a/res/drawable-mdpi/btn_dial_action_right_disable_focused.9.png
+++ b/res/drawable-mdpi/btn_dial_action_right_disable_focused.9.png
Binary files differ
diff --git a/res/drawable-mdpi/btn_dial_action_right_normal.9.png b/res/drawable-mdpi/btn_dial_action_right_normal.9.png
index 85dfff0..7d408e6 100644
--- a/res/drawable-mdpi/btn_dial_action_right_normal.9.png
+++ b/res/drawable-mdpi/btn_dial_action_right_normal.9.png
Binary files differ
diff --git a/res/drawable-mdpi/btn_dial_action_right_pressed.9.png b/res/drawable-mdpi/btn_dial_action_right_pressed.9.png
index 226633f..229e6ba 100644
--- a/res/drawable-mdpi/btn_dial_action_right_pressed.9.png
+++ b/res/drawable-mdpi/btn_dial_action_right_pressed.9.png
Binary files differ
diff --git a/res/drawable-mdpi/btn_dial_action_right_selected.9.png b/res/drawable-mdpi/btn_dial_action_right_selected.9.png
index 9cca52c..e11a660 100644
--- a/res/drawable-mdpi/btn_dial_action_right_selected.9.png
+++ b/res/drawable-mdpi/btn_dial_action_right_selected.9.png
Binary files differ
diff --git a/res/drawable-mdpi/aizy_bottom.png b/res/drawable-mdpi/temp_aizy_bottom.png
similarity index 100%
rename from res/drawable-mdpi/aizy_bottom.png
rename to res/drawable-mdpi/temp_aizy_bottom.png
Binary files differ
diff --git a/res/drawable-mdpi/temp_aizy_knob.png b/res/drawable-mdpi/temp_aizy_knob.png
new file mode 100644
index 0000000..daa8242
--- /dev/null
+++ b/res/drawable-mdpi/temp_aizy_knob.png
Binary files differ
diff --git a/res/layout-xlarge/contact_detail_fragment.xml b/res/layout-xlarge/contact_detail_fragment.xml
index 034d1ce..391a2fe 100644
--- a/res/layout-xlarge/contact_detail_fragment.xml
+++ b/res/layout-xlarge/contact_detail_fragment.xml
@@ -69,9 +69,13 @@
             android:layout_height="match_parent"
             ex:layout_wideParentWidth="800dip"
             ex:layout_wideLeftMargin="144dip"
+            ex:layout_wideRightMargin="64dip"
             ex:layout_narrowParentWidth="500dip"
             ex:layout_narrowLeftMargin="42dip"
+            ex:layout_narrowRightMargin="0dip"
             android:cacheColorHint="#00000000"
+            android:divider="#ffe5e5e5"
+            android:dividerHeight="1px"
         />
     </com.android.contacts.widget.InterpolatingLayout>
     
diff --git a/res/layout-xlarge/contact_detail_header_view.xml b/res/layout-xlarge/contact_detail_header_view.xml
index be86255..3299b34 100644
--- a/res/layout-xlarge/contact_detail_header_view.xml
+++ b/res/layout-xlarge/contact_detail_header_view.xml
@@ -22,7 +22,7 @@
     android:paddingTop="40dip"
     android:paddingRight="5dip">
 
-    <android.widget.QuickContactBadge android:id="@+id/photo"
+    <ImageView android:id="@+id/photo"
         android:layout_marginRight="8dip"
         android:layout_marginLeft="-1dip"
         android:layout_width="96dip"
diff --git a/res/layout/aizy_popup_window.xml b/res/layout/aizy_popup_window.xml
index 801b481..5e83766 100644
--- a/res/layout/aizy_popup_window.xml
+++ b/res/layout/aizy_popup_window.xml
@@ -18,7 +18,7 @@
     android:orientation="vertical"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
-    android:background="@drawable/aizy_bottom"
+    android:background="@drawable/temp_aizy_bottom"
     >
 
     <TextView
diff --git a/res/layout/contact_detail_header_view.xml b/res/layout/contact_detail_header_view.xml
index b7c7988..2417e45 100644
--- a/res/layout/contact_detail_header_view.xml
+++ b/res/layout/contact_detail_header_view.xml
@@ -22,11 +22,11 @@
     android:background="@drawable/title_bar_medium"
     android:paddingRight="5dip">
 
-    <android.widget.QuickContactBadge android:id="@+id/photo"
+    <ImageView android:id="@+id/photo"
         android:layout_gravity="center_vertical"
         android:layout_marginRight="8dip"
         android:layout_marginLeft="-1dip"
-        style="@*android:style/Widget.QuickContactBadge.WindowSmall" />
+        android:src="@*android:drawable/ic_contact_picture"
     />
 
     <LinearLayout
diff --git a/res/values-xlarge/colors.xml b/res/values-xlarge/colors.xml
index 4eaa941..0f8f8de 100644
--- a/res/values-xlarge/colors.xml
+++ b/res/values-xlarge/colors.xml
@@ -16,12 +16,6 @@
 
 <resources>
 
-    <!-- Color used in the Aizy visual scroll control for empty section -->
-    <color name="aizy_empty_section">#ffcccccc</color>
-
-    <!-- Color used in the Aizy visual scroll control for non-empty sections -->
-    <color name="aizy_non_empty_section">#ff9490a0</color>
-
     <!-- Color used for the letter in the A-Z section header -->
     <color name="section_header_text_color">#ff000000</color>
 
diff --git a/res/values/colors.xml b/res/values/colors.xml
index 9da6a61..cea3573 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -27,10 +27,7 @@
     <color name="translucent_search_background">#cc000000</color>
 
     <!-- Color used in the Aizy visual scroll control for empty section -->
-    <color name="aizy_empty_section">#ff666666</color>
-
-    <!-- Color used in the Aizy visual scroll control for non-empty sections -->
-    <color name="aizy_non_empty_section">#ffcccccc</color>
+    <color name="aizy_line_color">#ff689afe</color>
 
     <!-- Color used for the letter in the A-Z section header -->
     <color name="section_header_text_color">#ff999999</color>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index a15619a..9b43a31 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -982,7 +982,7 @@
     <!-- Title for data source when creating or editing a contact that doesn't
          belong to a specific account.  This contact will only exist on the phone
          and will not be synced. -->
-    <string name="account_phone">Phone-only (unsynced)</string>
+    <string name="account_phone">Phone-only, unsynced</string>
 
     <!-- Action string for calling a custom phone number -->
     <string name="call_custom">Call <xliff:g id="custom">%s</xliff:g></string>
@@ -1308,16 +1308,6 @@
     <!-- The button next to the message about multiple contact aggregation suggestions in Contact editor. [CHAR LIMIT=12]-->
     <string name="aggregation_suggestion_view_button">View</string>
 
-    <!-- Primary alphabet of this language. Each of these characters always has its own section in
-         the visual scroll control next to the contact list. These letters must be uppercase.
-         While there is no hard limit on the number of characters, there should not be more than
-         40. If the language requires more, this string should instead be empty so that the
-         visual scroll control adapts to the contents.
-         This text must only contain letters that can appear as sections, otherwise they would
-         only be empty.
-         Translations require extensive QA! -->
-    <string name="visualScrollerAlphabet">A;B;C;D;E;F;G;H;I;J;K;L;M;N;O;P;Q;R;S;T;U;V;W;X;Y;Z</string>
-
     <!-- The menu item (or button) that creates a local copy of a corporate contact. [CHAR LIMIT=40]-->
     <string name="menu_copyContact">Copy to my contacts</string>
 
diff --git a/src/com/android/contacts/activities/ContactBrowserActivity.java b/src/com/android/contacts/activities/ContactBrowserActivity.java
index 2deb549..a70fbc4 100644
--- a/src/com/android/contacts/activities/ContactBrowserActivity.java
+++ b/src/com/android/contacts/activities/ContactBrowserActivity.java
@@ -35,7 +35,6 @@
 import com.android.contacts.views.ContactSaveService;
 import com.android.contacts.views.detail.ContactDetailFragment;
 import com.android.contacts.views.detail.ContactNoneFragment;
-import com.android.contacts.views.editor.ContactEditorFragment;
 import com.android.contacts.widget.ContextMenuAdapter;
 
 import android.accounts.Account;
@@ -104,9 +103,6 @@
     private ContactDetailFragment mDetailFragment;
     private DetailFragmentListener mDetailFragmentListener = new DetailFragmentListener();
 
-    private ContactEditorFragment mEditorFragment;
-    private EditorFragmentListener mEditorFragmentListener = new EditorFragmentListener();
-
     private PhoneNumberInteraction mPhoneNumberCallInteraction;
     private PhoneNumberInteraction mSendTextMessageInteraction;
     private ContactDeletionInteraction mContactDeletionInteraction;
@@ -135,9 +131,6 @@
         } else if (fragment instanceof ContactDetailFragment) {
             mDetailFragment = (ContactDetailFragment)fragment;
             mDetailFragment.setListener(mDetailFragmentListener);
-        } else if (fragment instanceof ContactEditorFragment) {
-            mEditorFragment = (ContactEditorFragment)fragment;
-            mEditorFragment.setListener(mEditorFragmentListener);
         }
     }
 
@@ -237,9 +230,28 @@
     private void configureListFragment(boolean fromRequest) {
         boolean searchMode = mSearchMode;
         if (fromRequest) {
-            if (mRequest.getDisplayWithPhoneNumbersOnly()) {
-                mContactListFilterController.setContactListFilter(new ContactListFilter(
-                        ContactListFilter.FILTER_TYPE_WITH_PHONE_NUMBERS_ONLY), false);
+            ContactListFilter filter = null;
+            int actionCode = mRequest.getActionCode();
+            switch (actionCode) {
+                case ContactsRequest.ACTION_ALL_CONTACTS:
+                    filter = new ContactListFilter(ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS);
+                    break;
+                case ContactsRequest.ACTION_CONTACTS_WITH_PHONES:
+                    filter = new ContactListFilter(
+                            ContactListFilter.FILTER_TYPE_WITH_PHONE_NUMBERS_ONLY);
+                    break;
+
+                // TODO: handle FREQUENT and STREQUENT according to the spec
+                case ContactsRequest.ACTION_FREQUENT:
+                case ContactsRequest.ACTION_STREQUENT:
+                    // For now they are treated the same as STARRED
+                case ContactsRequest.ACTION_STARRED:
+                    filter = new ContactListFilter(ContactListFilter.FILTER_TYPE_STARRED);
+                    break;
+            }
+
+            if (filter != null) {
+                mContactListFilterController.setContactListFilter(filter, false);
                 searchMode = false;
             } else if (mRequest.getActionCode() == ContactsRequest.ACTION_ALL_CONTACTS) {
                 mContactListFilterController.setContactListFilter(new ContactListFilter(
@@ -248,16 +260,6 @@
         } else {
             if (mHasActionBar) {
                 searchMode = mActionBarAdapter.isSearchMode();
-            } else {
-// TODO: reenable FREQUENT, STARRED and STREQUENT
-//                int actionCode = mRequest.getActionCode();
-//                if (actionCode == ContactsRequest.ACTION_FREQUENT ||
-//                        actionCode == ContactsRequest.ACTION_STARRED ||
-//                        actionCode == ContactsRequest.ACTION_STREQUENT) {
-//                    mode = ContactBrowserMode.MODE_FAVORITES;
-//                } else {
-//                    mode = ContactBrowserMode.MODE_CONTACTS;
-//                }
             }
         }
 
@@ -333,25 +335,11 @@
     }
 
     private void setupContactDetailFragment(Uri contactLookupUri) {
-
-        // If we are already editing this URI - just continue editing
-        if (mEditorFragment != null && contactLookupUri != null
-                && contactLookupUri.equals(mEditorFragment.getLookupUri())) {
-            return;
-        }
-
         if (mDetailFragment != null && contactLookupUri != null
                 && contactLookupUri.equals(mDetailFragment.getUri())) {
             return;
         }
 
-        // If we are closing the editor, it's a good idea to scroll the list
-        // to the contact we have just finished editing.
-        boolean scrollToSelection = mEditorFragment != null;
-
-        // No editor here
-        closeEditorFragment(true);
-
         if (contactLookupUri != null) {
             // Already showing? Nothing to do
             if (mDetailFragment != null) {
@@ -376,27 +364,6 @@
                     .replace(R.id.detail_container, mEmptyFragment)
                     .commit();
         }
-        if (scrollToSelection) {
-            mListFragment.requestSelectionOnScreen(true);
-        }
-    }
-
-    private void setupContactEditorFragment(Uri contactLookupUri) {
-        // No detail view here
-        closeDetailFragment();
-        closeEmptyFragment();
-
-        // Already showing? Nothing to do
-        if (mEditorFragment != null) return;
-
-        mEditorFragment = new ContactEditorFragment();
-        mEditorFragment.load(Intent.ACTION_EDIT, contactLookupUri,
-                Contacts.CONTENT_ITEM_TYPE, new Bundle());
-
-        // Nothing showing yet? Create (this happens during Activity-Startup)
-        getFragmentManager().openTransaction()
-                .replace(R.id.detail_container, mEditorFragment)
-                .commit();
     }
 
     private void closeDetailFragment() {
@@ -406,23 +373,6 @@
         }
     }
 
-    /**
-     * Closes the editor, if it is currently open
-     * @param save Whether the changes should be saved. This should always be true, unless
-     * this is called from a Revert/Undo button
-     */
-    private void closeEditorFragment(boolean save) {
-        Log.d(TAG, "closeEditorFragment(" + save + ")");
-
-        if (mEditorFragment != null) {
-            // Remove the listener before saving, because it will be used to forward the onClose
-            // after save
-            mEditorFragment.setListener(null);
-            if (save) mEditorFragment.save(true);
-            mEditorFragment = null;
-        }
-    }
-
     private void closeEmptyFragment() {
         mEmptyFragment = null;
     }
@@ -515,9 +465,9 @@
     }
 
     private final class ContactBrowserActionListener implements OnContactBrowserActionListener {
-        public void onViewContactAction(Uri contactLookupUri, boolean force) {
+        @Override
+        public void onViewContactAction(Uri contactLookupUri) {
             if (mContactContentDisplayed) {
-                if (force) closeEditorFragment(true);
                 setSelectedContactUri(contactLookupUri);
                 setupContactDetailFragment(contactLookupUri);
             } else {
@@ -525,6 +475,7 @@
             }
         }
 
+        @Override
         public void onCreateNewContactAction() {
             Intent intent = new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI);
             Bundle extras = getIntent().getExtras();
@@ -534,45 +485,46 @@
             startActivity(intent);
         }
 
+        @Override
         public void onEditContactAction(Uri contactLookupUri) {
-            if (mContactContentDisplayed) {
-                closeEditorFragment(true);
-                setSelectedContactUri(contactLookupUri);
-                setupContactEditorFragment(contactLookupUri);
-            } else {
-                Intent intent = new Intent(Intent.ACTION_EDIT, contactLookupUri);
-                Bundle extras = getIntent().getExtras();
-                if (extras != null) {
-                    intent.putExtras(extras);
-                }
-                startActivityForResult(intent, SUBACTIVITY_EDIT_CONTACT);
+            Intent intent = new Intent(Intent.ACTION_EDIT, contactLookupUri);
+            Bundle extras = getIntent().getExtras();
+            if (extras != null) {
+                intent.putExtras(extras);
             }
+            startActivityForResult(intent, SUBACTIVITY_EDIT_CONTACT);
         }
 
+        @Override
         public void onAddToFavoritesAction(Uri contactUri) {
             ContentValues values = new ContentValues(1);
             values.put(Contacts.STARRED, 1);
             getContentResolver().update(contactUri, values, null, null);
         }
 
+        @Override
         public void onRemoveFromFavoritesAction(Uri contactUri) {
             ContentValues values = new ContentValues(1);
             values.put(Contacts.STARRED, 0);
             getContentResolver().update(contactUri, values, null, null);
         }
 
+        @Override
         public void onCallContactAction(Uri contactUri) {
             getPhoneNumberCallInteraction().startInteraction(contactUri);
         }
 
+        @Override
         public void onSmsContactAction(Uri contactUri) {
             getSendTextMessageInteraction().startInteraction(contactUri);
         }
 
+        @Override
         public void onDeleteContactAction(Uri contactUri) {
             getContactDeletionInteraction().deleteContact(contactUri);
         }
 
+        @Override
         public void onFinishAction() {
             onBackPressed();
         }
@@ -614,54 +566,6 @@
         }
     }
 
-    private class EditorFragmentListener implements ContactEditorFragment.Listener {
-        @Override
-        public void onReverted() {
-            final Uri uri = mEditorFragment.getLookupUri();
-            closeEditorFragment(false);
-            setupContactDetailFragment(uri);
-        }
-
-        @Override
-        public void onSaveFinished(int resultCode, Intent resultIntent) {
-            Log.d(TAG, "onSaveFinished(" + resultCode + "," + resultIntent + ")");
-            // it is already saved, so no need to save again here
-            final Uri uri = mEditorFragment.getLookupUri();
-            closeEditorFragment(false);
-            setupContactDetailFragment(uri);
-        }
-
-        @Override
-        public void onAggregationChangeFinished(Uri newLookupUri) {
-            // We have already saved. Close the editor so that we can open again with the
-            // new contact
-            Log.d(TAG, "onAggregationChangeFinished(" + newLookupUri + ")");
-            closeEditorFragment(false);
-            setSelectedContactUri(newLookupUri);
-            setupContactDetailFragment(newLookupUri);
-        }
-
-        @Override
-        public void onAccountSelectorAborted() {
-            Toast.makeText(ContactBrowserActivity.this, "closeBecauseAccountSelectorAborted",
-                    Toast.LENGTH_LONG).show();
-        }
-
-        @Override
-        public void onContactNotFound() {
-            setupContactDetailFragment(null);
-        }
-
-        @Override
-        public void setTitleTo(int resourceId) {
-        }
-
-        @Override
-        public void onDeleteRequested(Uri contactLookupUri) {
-            getContactDeletionInteraction().deleteContact(contactLookupUri);
-        }
-    }
-
     public void startActivityAndForwardResult(final Intent intent) {
         intent.setFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
 
diff --git a/src/com/android/contacts/activities/ContactSearchActivity.java b/src/com/android/contacts/activities/ContactSearchActivity.java
index 708099c..5b52d9a 100644
--- a/src/com/android/contacts/activities/ContactSearchActivity.java
+++ b/src/com/android/contacts/activities/ContactSearchActivity.java
@@ -75,10 +75,12 @@
         mSearchEditText = (SearchEditText)findViewById(R.id.search_src_text);
         mSearchEditText.setText(mRequest.getQueryString());
         mSearchEditText.setOnFilterTextListener(new OnFilterTextListener() {
+            @Override
             public void onFilterChange(String queryString) {
                 mListFragment.setQueryString(queryString);
             }
 
+            @Override
             public void onCancelSearch() {
                 finish();
             }
@@ -106,13 +108,16 @@
     }
 
     private final class ContactBrowserActionListener implements OnContactBrowserActionListener {
-        public void onViewContactAction(Uri contactLookupUri, boolean force) {
+        @Override
+        public void onViewContactAction(Uri contactLookupUri) {
             startActivity(new Intent(Intent.ACTION_VIEW, contactLookupUri));
         }
 
+        @Override
         public void onCreateNewContactAction() {
         }
 
+        @Override
         public void onEditContactAction(Uri contactLookupUri) {
             Intent intent = new Intent(Intent.ACTION_EDIT, contactLookupUri);
             Bundle extras = getIntent().getExtras();
@@ -122,30 +127,36 @@
             startActivity(intent);
         }
 
+        @Override
         public void onAddToFavoritesAction(Uri contactUri) {
             ContentValues values = new ContentValues(1);
             values.put(Contacts.STARRED, 1);
             getContentResolver().update(contactUri, values, null, null);
         }
 
+        @Override
         public void onRemoveFromFavoritesAction(Uri contactUri) {
             ContentValues values = new ContentValues(1);
             values.put(Contacts.STARRED, 0);
             getContentResolver().update(contactUri, values, null, null);
         }
 
+        @Override
         public void onCallContactAction(Uri contactUri) {
             getPhoneNumberCallInteraction().startInteraction(contactUri);
         }
 
+        @Override
         public void onSmsContactAction(Uri contactUri) {
             getSendTextMessageInteraction().startInteraction(contactUri);
         }
 
+        @Override
         public void onDeleteContactAction(Uri contactUri) {
             getContactDeletionInteraction().deleteContact(contactUri);
         }
 
+        @Override
         public void onFinishAction() {
             onBackPressed();
         }
diff --git a/src/com/android/contacts/activities/ContactSelectionActivity.java b/src/com/android/contacts/activities/ContactSelectionActivity.java
index bd2834d..938bf0a 100644
--- a/src/com/android/contacts/activities/ContactSelectionActivity.java
+++ b/src/com/android/contacts/activities/ContactSelectionActivity.java
@@ -49,14 +49,8 @@
  * purposes of selecting one.
  */
 public class ContactSelectionActivity extends Activity implements View.OnCreateContextMenuListener {
-
     private static final String TAG = "ContactSelectionActivity";
 
-    private static final int SUBACTIVITY_NEW_CONTACT = 1;
-    private static final int SUBACTIVITY_VIEW_CONTACT = 2;
-    private static final int SUBACTIVITY_DISPLAY_GROUP = 3;
-    private static final int SUBACTIVITY_SEARCH = 4;
-
     private ContactsIntentResolver mIntentResolver;
     protected ContactEntryListFragment<?> mListFragment;
 
@@ -113,10 +107,12 @@
         mSearchEditText = (SearchEditText)findViewById(R.id.search_src_text);
         mSearchEditText.setText(mRequest.getQueryString());
         mSearchEditText.setOnFilterTextListener(new OnFilterTextListener() {
+            @Override
             public void onFilterChange(String queryString) {
                 mListFragment.setQueryString(queryString);
             }
 
+            @Override
             public void onCancelSearch() {
                 finish();
             }
@@ -229,10 +225,12 @@
     }
 
     private final class ContactBrowserActionListener implements OnContactBrowserActionListener {
-        public void onViewContactAction(Uri contactLookupUri, boolean force) {
+        @Override
+        public void onViewContactAction(Uri contactLookupUri) {
             throw new UnsupportedOperationException();
         }
 
+        @Override
         public void onCreateNewContactAction() {
             Intent intent = new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI);
             Bundle extras = getIntent().getExtras();
@@ -242,6 +240,7 @@
             startActivity(intent);
         }
 
+        @Override
         public void onEditContactAction(Uri contactLookupUri) {
             Intent intent = new Intent(Intent.ACTION_EDIT, contactLookupUri);
             Bundle extras = getIntent().getExtras();
@@ -251,43 +250,52 @@
             startActivity(intent);
         }
 
+        @Override
         public void onAddToFavoritesAction(Uri contactUri) {
             throw new UnsupportedOperationException();
         }
 
+        @Override
         public void onRemoveFromFavoritesAction(Uri contactUri) {
             throw new UnsupportedOperationException();
         }
 
+        @Override
         public void onCallContactAction(Uri contactUri) {
             throw new UnsupportedOperationException();
         }
 
+        @Override
         public void onSmsContactAction(Uri contactUri) {
             throw new UnsupportedOperationException();
         }
 
+        @Override
         public void onDeleteContactAction(Uri contactUri) {
             throw new UnsupportedOperationException();
         }
 
+        @Override
         public void onFinishAction() {
             onBackPressed();
         }
     }
 
     private final class ContactPickerActionListener implements OnContactPickerActionListener {
+        @Override
         public void onCreateNewContactAction() {
             Intent intent = new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI);
             startActivityAndForwardResult(intent);
         }
 
+        @Override
         public void onPickContactAction(Uri contactUri) {
             Intent intent = new Intent();
             setResult(RESULT_OK, intent.setData(contactUri));
             finish();
         }
 
+        @Override
         public void onShortcutIntentCreated(Intent intent) {
             setResult(RESULT_OK, intent);
             finish();
@@ -296,12 +304,14 @@
 
     private final class PhoneNumberPickerActionListener implements
             OnPhoneNumberPickerActionListener {
+        @Override
         public void onPickPhoneNumberAction(Uri dataUri) {
             Intent intent = new Intent();
             setResult(RESULT_OK, intent.setData(dataUri));
             finish();
         }
 
+        @Override
         public void onShortcutIntentCreated(Intent intent) {
             setResult(RESULT_OK, intent);
             finish();
@@ -310,6 +320,7 @@
 
     private final class PostalAddressPickerActionListener implements
             OnPostalAddressPickerActionListener {
+        @Override
         public void onPickPostalAddressAction(Uri dataUri) {
             Intent intent = new Intent();
             setResult(RESULT_OK, intent.setData(dataUri));
diff --git a/src/com/android/contacts/list/ContactBrowseListContextMenuAdapter.java b/src/com/android/contacts/list/ContactBrowseListContextMenuAdapter.java
index 9ed6ad9..f2a53ca 100644
--- a/src/com/android/contacts/list/ContactBrowseListContextMenuAdapter.java
+++ b/src/com/android/contacts/list/ContactBrowseListContextMenuAdapter.java
@@ -48,6 +48,7 @@
         this.mContactListFragment = fragment;
     }
 
+    @Override
     public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfo) {
         AdapterView.AdapterContextMenuInfo info;
         try {
@@ -89,6 +90,7 @@
         menu.add(0, MENU_ITEM_DELETE, 0, R.string.menu_deleteContact);
     }
 
+    @Override
     public boolean onContextItemSelected(MenuItem item) {
         AdapterView.AdapterContextMenuInfo info;
         try {
@@ -105,7 +107,7 @@
         final Uri contactUri = adapter.getContactUri(position);
         switch (item.getItemId()) {
             case MENU_ITEM_VIEW_CONTACT: {
-                mContactListFragment.viewContact(contactUri, true);
+                mContactListFragment.viewContact(contactUri);
                 return true;
             }
 
diff --git a/src/com/android/contacts/list/ContactBrowseListFragment.java b/src/com/android/contacts/list/ContactBrowseListFragment.java
index e780c5c..f99134b 100644
--- a/src/com/android/contacts/list/ContactBrowseListFragment.java
+++ b/src/com/android/contacts/list/ContactBrowseListFragment.java
@@ -203,8 +203,8 @@
         mListener.onCreateNewContactAction();
     }
 
-    public void viewContact(Uri contactUri, boolean finishEditing) {
-        mListener.onViewContactAction(contactUri, finishEditing);
+    public void viewContact(Uri contactUri) {
+        mListener.onViewContactAction(contactUri);
     }
 
     public void editContact(Uri contactUri) {
diff --git a/src/com/android/contacts/list/ContactEntryListFragment.java b/src/com/android/contacts/list/ContactEntryListFragment.java
index afb748e..98c01d4 100644
--- a/src/com/android/contacts/list/ContactEntryListFragment.java
+++ b/src/com/android/contacts/list/ContactEntryListFragment.java
@@ -417,7 +417,7 @@
         mAdapter.changeCursor(partitionIndex, data);
         showCount(partitionIndex, data);
         if (partitionIndex == mAdapter.getIndexedPartition()) {
-            mAizy.readFromIndexer(mAdapter.getIndexer());
+            mAizy.setIndexer(mAdapter.getIndexer(), data.getCount());
         }
 
         // TODO should probably only restore instance state after all directories are loaded
@@ -676,8 +676,7 @@
         mAizy.setListener(new ContactListAizyView.Listener() {
             @Override
             public void onScroll(int position) {
-                mListView.smoothScrollToPositionFromTop(
-                        position + mListView.getHeaderViewsCount(),
+                mListView.smoothScrollToPositionFromTop(position + mListView.getHeaderViewsCount(),
                         0);
             }
         });
@@ -734,6 +733,9 @@
     @Override
     public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
             int totalItemCount) {
+        if (isAizyEnabled()) {
+            mAizy.listOnScroll(firstVisibleItem);
+        }
     }
 
     public void onScrollStateChanged(AbsListView view, int scrollState) {
diff --git a/src/com/android/contacts/list/ContactListAizyView.java b/src/com/android/contacts/list/ContactListAizyView.java
index d2cc279..69a10cf 100644
--- a/src/com/android/contacts/list/ContactListAizyView.java
+++ b/src/com/android/contacts/list/ContactListAizyView.java
@@ -17,16 +17,12 @@
 package com.android.contacts.list;
 
 import com.android.contacts.R;
-import com.android.contacts.util.PhonebookCollatorFactory;
 
 import android.content.Context;
 import android.content.res.Resources;
 import android.graphics.Canvas;
 import android.graphics.Paint;
-import android.graphics.Paint.Align;
-import android.graphics.Paint.FontMetrics;
-import android.graphics.Rect;
-import android.graphics.Typeface;
+import android.graphics.drawable.Drawable;
 import android.util.AttributeSet;
 import android.view.Gravity;
 import android.view.LayoutInflater;
@@ -36,9 +32,6 @@
 import android.widget.SectionIndexer;
 import android.widget.TextView;
 
-import java.text.Collator;
-import java.util.ArrayList;
-
 /**
  * A View that displays the sections given by an Indexer and their relative sizes. For
  * English and similar languages, this is an A to Z list (where only the used letters are
@@ -48,51 +41,19 @@
 public class ContactListAizyView extends View {
     private static final String TAG = "ContactListAizyView";
 
-    private static final int PREVIEW_TIME_DELAY_MS = 400;
+    private SectionIndexer mIndexer;
+    private int mItemCount;
+    private int[] mSectionPositions;
 
     private Listener mListener;
+    private float mPosition;
     private PopupWindow mPreviewPopupWindow;
     private TextView mPreviewPopupTextView;
+    private boolean mPreviewPopupVisible;
+    private final int[] mWindowOffset = new int[2];
 
     private ResourceValues mResourceValues;
 
-    /**
-     * True if the popup window is currently visible.
-     */
-    private boolean mPreviewPopupVisible;
-
-    /**
-     * Time when the user started tapping. This is used to calculate the time delay before fading
-     * in the PopupWindow
-     */
-    private long mPreviewPopupStartTime;
-
-    /**
-     * Needed only inside {@link #onTouchEvent(MotionEvent)} to get the location of touch events.
-     */
-    private int[] mWindowOffset;
-
-    /**
-     * Needed to measure text. Used inside {@link #onDraw(Canvas)}
-     */
-    private final Rect bounds = new Rect();
-
-    /**
-     * Used and cached inside {@link #onDraw(Canvas)}
-     */
-    private FontMetrics mFontMetrics;
-
-    /**
-     * Used and cached inside {@link #onDraw(Canvas)}
-     */
-    private Paint mPaint;
-
-    /**
-     * The list of displayed sections. "Virtual" sections can be empty and therefore don't show
-     * up as regular sections
-     */
-    private final ArrayList<VirtualSection> mVirtualSections = new ArrayList<VirtualSection>();
-
     public ContactListAizyView(Context context) {
         super(context);
     }
@@ -109,78 +70,37 @@
     protected void onAttachedToWindow() {
         super.onAttachedToWindow();
 
-        mResourceValues = new ResourceValues(getResources());
+        mResourceValues = new ResourceValues(getContext().getResources());
 
         final LayoutInflater inflater =
                 (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
         mPreviewPopupWindow = new PopupWindow(
                 inflater.inflate(R.layout.aizy_popup_window, null, false),
-                (int) mResourceValues.previewWidth, (int) mResourceValues.previewHeight);
-        mPreviewPopupWindow.setAnimationStyle(android.R.style.Animation_Toast);
+                mResourceValues.getPreviewWidth(), mResourceValues.getPreviewHeight());
         mPreviewPopupTextView =
                 (TextView) mPreviewPopupWindow.getContentView().findViewById(R.id.caption);
     }
 
-    /**
-     * Sets up the Aizy based on the indexer and completely reads its contents.
-     * This function has to be called everytime the data is changed.
-     */
-    public void readFromIndexer(SectionIndexer indexer) {
-        mVirtualSections.clear();
-        final String alphabetString = getResources().getString(R.string.visualScrollerAlphabet);
-        final String[] alphabet = alphabetString.split(";");
-
-        // We expect to get 10 additional items that the base alphabet
-        mVirtualSections.ensureCapacity(alphabet.length + 10);
-
-        if (indexer != null) {
-            // Add the real sections
-            final Object[] sections = indexer.getSections();
-            for (int sectionIndex = 0; sectionIndex < sections.length; sectionIndex++) {
-                final Object section = sections[sectionIndex];
-                final String caption = section == null ? "" : section.toString();
-                final int position = indexer.getPositionForSection(sectionIndex);
-                mVirtualSections.add(new VirtualSection(caption, sectionIndex, position));
-            }
+    public void setIndexer(SectionIndexer indexer, int itemCount) {
+        mIndexer = indexer;
+        mItemCount = itemCount;
+        if (mIndexer == null) {
+            mSectionPositions = null;
+            return;
         }
 
-        final Collator collator = PhonebookCollatorFactory.getCollator();
-
-        // Add the base alphabet if missing
-        for (String caption : alphabet) {
-            boolean insertAtEnd = true;
-            VirtualSection previousVirtualSection = null;
-            for (int i = 0; i < mVirtualSections.size(); i++) {
-                final VirtualSection virtualSection = mVirtualSections.get(i);
-                final String virtualSectionCaption = virtualSection.getCaption();
-                final int comparison = collator.compare(virtualSectionCaption, caption);
-                if (comparison == 0) {
-                    // element is already in the list.
-                    insertAtEnd = false;
-                    break;
-                }
-                if (comparison > 0) {
-                    // we stepped too far. the element belongs before the element at i
-                    insertAtEnd = false;
-                    final int realSectionPosition = previousVirtualSection == null ? 0
-                            : previousVirtualSection.getRealSectionPosition();
-                    mVirtualSections.add(i, new VirtualSection(caption, -1, realSectionPosition));
-                    break;
-                }
-                previousVirtualSection = virtualSection;
-            }
-            if (insertAtEnd) {
-                final int realSectionPosition = previousVirtualSection == null ? 0
-                        : previousVirtualSection.getRealSectionPosition();
-                mVirtualSections.add(new VirtualSection(caption, -1, realSectionPosition));
-            }
+        // Read the section positions
+        final Object[] sections = mIndexer.getSections();
+        final int sectionCount = sections.length;
+        if (mSectionPositions == null || mSectionPositions.length != sectionCount) {
+            mSectionPositions = new int[sectionCount];
         }
-        invalidate();
+        for (int i = 0; i < sectionCount; i++) {
+            mSectionPositions[i] = mIndexer.getPositionForSection(i);
+        }
+
     }
 
-    /**
-     * Sets the Listener that is called everytime the user taps on this control.
-     */
     public void setListener(Listener listener) {
         mListener = listener;
     }
@@ -192,75 +112,19 @@
 
     @Override
     protected void onDraw(Canvas canvas) {
-        if (mPaint == null) {
-            mPaint = new Paint();
-            mPaint.setTextSize(mResourceValues.textSize);
-            mPaint.setAntiAlias(true);
-            mPaint.setTextAlign(Align.CENTER);
-            mPaint.setTypeface(Typeface.DEFAULT_BOLD);
-        }
-        if (mFontMetrics == null) {
-            mFontMetrics = mPaint.getFontMetrics();
-        }
-        final float fontHeight = mFontMetrics.descent - mFontMetrics.ascent;
-        final int halfWidth = getWidth() / 2;
-        // Draw
-        float lastVisibleY = Float.NEGATIVE_INFINITY;
-        final float sectionHeight = (float) getHeight() / mVirtualSections.size();
-        for (int i = 0; i < mVirtualSections.size(); i++) {
-            final VirtualSection virtualSection = mVirtualSections.get(i);
-            final String caption = virtualSection.getCaption();
-            if (!virtualSection.isMeasured()) {
-                mPaint.getTextBounds(caption, 0, caption.length(), bounds);
-                virtualSection.setMeasuredSize(-bounds.top);
-            }
-            final float y = i * sectionHeight;
-            if (lastVisibleY + fontHeight < y) {
-                mPaint.setColor(virtualSection.getRealSectionIndex() != -1
-                        ? mResourceValues.nonEmptySectionColor : mResourceValues.emptySectionColor);
+        if (mIndexer == null) return;
 
-                canvas.drawText(caption, halfWidth,
-                        y + sectionHeight / 2 + virtualSection.getMeasuredSize() / 2, mPaint);
-                lastVisibleY = y;
-            }
-        }
+        drawLineAndText(canvas);
     }
 
     @Override
     public boolean onTouchEvent(MotionEvent event) {
-        if (mWindowOffset == null) {
-            mWindowOffset = new int[2];
-            getLocationInWindow(mWindowOffset);
-        }
+        getLocationInWindow(mWindowOffset);
 
-        // Not initialized? Ignore
-        if (mVirtualSections.size() == 0) return true;
-
-        // Scroll the list itself
-        final int boundedY = Math.min(Math.max(0, (int) (event.getY())), getHeight() - 1);
-        final int index = boundedY * mVirtualSections.size() / getHeight();
-        final VirtualSection virtualSection = mVirtualSections.get(index);
-        final int sectionY = index * getHeight() / mVirtualSections.size();
-        mPreviewPopupTextView.setText(virtualSection.getCaption());
-        mPreviewPopupTextView.setTextColor(virtualSection.getRealSectionIndex() != -1
-                ? mResourceValues.nonEmptySectionColor : mResourceValues.emptySectionColor);
-
-        // Draw popup window
         final int previewX = mWindowOffset[0] + getWidth();
-        final float sectionHeight = (float) getHeight() / mVirtualSections.size();
-        final int previewY = (int) (sectionY + mWindowOffset[1] + (sectionHeight -
-                mPreviewPopupWindow.getHeight()) / 2);
-        final int actionMasked = event.getActionMasked();
-        final boolean fingerIsDown = actionMasked == MotionEvent.ACTION_DOWN;
-        if (fingerIsDown) {
-            mPreviewPopupStartTime = System.currentTimeMillis();
-        }
-        final boolean fingerIsDownOrScrubbing =
-            actionMasked == MotionEvent.ACTION_MOVE || actionMasked == MotionEvent.ACTION_DOWN;
-
-        final boolean previewPopupVisible = fingerIsDownOrScrubbing &&
-                (System.currentTimeMillis() > mPreviewPopupStartTime + PREVIEW_TIME_DELAY_MS);
-
+        final int previewY = (int) event.getY() + mWindowOffset[1]
+                - mPreviewPopupWindow.getHeight() / 2;
+        final boolean previewPopupVisible = event.getActionMasked() == MotionEvent.ACTION_MOVE;
         if (previewPopupVisible != mPreviewPopupVisible) {
             if (previewPopupVisible) {
                 mPreviewPopupWindow.showAtLocation(this, Gravity.LEFT | Gravity.TOP,
@@ -272,70 +136,88 @@
         } else {
             mPreviewPopupWindow.update(previewX, previewY, -1, -1);
         }
+        final float yFactor = (float) getHeight() / mItemCount;
+        final int position = Math.max(0, (int) (event.getY() / yFactor));
+        if (mIndexer != null) {
+            final int index = mIndexer.getSectionForPosition(position);
+            final Object[] sections = mIndexer.getSections();
+            final String caption =
+                    (index != -1 && index < sections.length) ? sections[index].toString() : "";
+            mPreviewPopupTextView.setText(caption);
+        }
 
-        // Perform the actual scrolling
-        if (mListener != null) mListener.onScroll(virtualSection.getRealSectionPosition());
+        if (mListener != null) mListener.onScroll(position);
 
+        super.onTouchEvent(event);
         return true;
     }
 
-    /**
-     * Reads an provides all values from the resource files
-     */
-    private static class ResourceValues {
-        private final int emptySectionColor;
-        private final int nonEmptySectionColor;
-        private final float textSize;
-        private final float previewWidth;
-        private final float previewHeight;
+    private void drawLineAndText(Canvas canvas) {
+        final float yFactor = (float) getHeight() / mItemCount;
 
-        private ResourceValues(Resources resources) {
-            emptySectionColor = resources.getColor(R.color.aizy_empty_section);
-            nonEmptySectionColor = resources.getColor(R.color.aizy_non_empty_section);
-            textSize = resources.getDimension(R.dimen.aizy_text_size);
-            previewWidth = resources.getDimension(R.dimen.aizy_preview_width);
-            previewHeight = resources.getDimension(R.dimen.aizy_preview_height);
+        final Paint paint = new Paint();
+
+        paint.setColor(mResourceValues.getLineColor());
+        paint.setAntiAlias(true);
+
+        // Draw sections
+        final float centerX = getWidth() * 0.5f;
+        for (int i = 1; i < mSectionPositions.length; i++) {
+            final float y1 = mSectionPositions[i - 1] * yFactor;
+            final float y2 = mSectionPositions[i] * yFactor;
+            canvas.drawLine(
+                    centerX, y1 + 1.0f,
+                    centerX, y2 - 1.0f,
+                    paint);
         }
+
+        // Draw knob
+        final Drawable knob = mResourceValues.getKnobDrawable();
+        final int w = knob.getIntrinsicWidth();
+        final int h = knob.getIntrinsicWidth();
+        final float y = mPosition * yFactor;
+        knob.setBounds(
+                (int) (centerX - w / 2.0f), (int) (y - h / 2.0f),
+                (int) (centerX + w / 2.0f), (int) (y + h / 2.0f));
+        knob.draw(canvas);
     }
 
-    private static class VirtualSection {
-        private final String mCaption;
-        private final int mRealSectionIndex;
-        private final int mRealSectionPosition;
-        private float mMeasuredSize = Float.NaN;
+    public void listOnScroll(int firstVisibleItem) {
+        mPosition = firstVisibleItem;
+        invalidate();
+    }
 
-        public String getCaption() {
-            return mCaption;
+    private static class ResourceValues {
+        private int mLineColor;
+        private Drawable mKnobDrawable;
+        private int mPreviewWidth;
+        private int mPreviewHeight;
+
+        public int getLineColor() {
+            return mLineColor;
         }
 
-        public int getRealSectionIndex() {
-            return mRealSectionIndex;
+        public Drawable getKnobDrawable() {
+            return mKnobDrawable;
         }
 
-        public int getRealSectionPosition() {
-            return mRealSectionPosition;
+        public int getPreviewWidth() {
+            return mPreviewWidth;
         }
 
-        public boolean isMeasured() {
-            return mMeasuredSize == Float.NaN;
+        public int getPreviewHeight() {
+            return mPreviewHeight;
         }
 
-        public void setMeasuredSize(float value) {
-            mMeasuredSize = value;
-        }
-
-        public float getMeasuredSize() {
-            return mMeasuredSize;
-        }
-
-        public VirtualSection(String caption, int realSectionIndex, int realSectionPosition) {
-            mCaption = caption;
-            mRealSectionIndex = realSectionIndex;
-            mRealSectionPosition = realSectionPosition;
+        public ResourceValues(Resources resources) {
+            mLineColor = resources.getColor(R.color.aizy_line_color);
+            mKnobDrawable = resources.getDrawable(R.drawable.temp_aizy_knob);
+            mPreviewWidth = resources.getDimensionPixelSize(R.dimen.aizy_preview_width);
+            mPreviewHeight = resources.getDimensionPixelSize(R.dimen.aizy_preview_height);
         }
     }
 
     public interface Listener {
         void onScroll(int position);
     }
-}
+}
\ No newline at end of file
diff --git a/src/com/android/contacts/list/ContactsIntentResolver.java b/src/com/android/contacts/list/ContactsIntentResolver.java
index 2386cc6..3b34cb5 100644
--- a/src/com/android/contacts/list/ContactsIntentResolver.java
+++ b/src/com/android/contacts/list/ContactsIntentResolver.java
@@ -63,8 +63,7 @@
         } else if (UI.LIST_ALL_CONTACTS_ACTION.equals(action)) {
             request.setActionCode(ContactsRequest.ACTION_ALL_CONTACTS);
         } else if (UI.LIST_CONTACTS_WITH_PHONES_ACTION.equals(action)) {
-            request.setActionCode(ContactsRequest.ACTION_DEFAULT);
-            request.setDisplayWithPhoneNumbersOnly(true);
+            request.setActionCode(ContactsRequest.ACTION_CONTACTS_WITH_PHONES);
         } else if (UI.LIST_STARRED_ACTION.equals(action)) {
             request.setActionCode(ContactsRequest.ACTION_STARRED);
         } else if (UI.LIST_FREQUENT_ACTION.equals(action)) {
diff --git a/src/com/android/contacts/list/ContactsRequest.java b/src/com/android/contacts/list/ContactsRequest.java
index 21e66ac..aefa451 100644
--- a/src/com/android/contacts/list/ContactsRequest.java
+++ b/src/com/android/contacts/list/ContactsRequest.java
@@ -32,6 +32,9 @@
     /** Show all contacts */
     public static final int ACTION_ALL_CONTACTS = 15;
 
+    /** Show all contacts with phone numbers */
+    public static final int ACTION_CONTACTS_WITH_PHONES = 17;
+
     /** Show contents of a specific group */
     public static final int ACTION_GROUP = 20;
 
@@ -77,7 +80,6 @@
     private CharSequence mTitle;
     private boolean mSearchMode;
     private String mQueryString;
-    private boolean mDisplayOnlyWithPhones;
     private String mGroupName;
     private boolean mLegacyCompatibilityMode;
     private boolean mDirectorySearchEnabled = true;
@@ -93,7 +95,6 @@
         mTitle = request.mTitle;
         mSearchMode = request.mSearchMode;
         mQueryString = request.mQueryString;
-        mDisplayOnlyWithPhones = request.mDisplayOnlyWithPhones;
         mGroupName = request.mGroupName;
         mLegacyCompatibilityMode = request.mLegacyCompatibilityMode;
         mDirectorySearchEnabled = request.mDirectorySearchEnabled;
@@ -115,7 +116,6 @@
             request.mTitle = source.readCharSequence();
             request.mSearchMode = source.readInt() != 0;
             request.mQueryString = source.readString();
-            request.mDisplayOnlyWithPhones = source.readInt() != 0;
             request.mGroupName = source.readString();
             request.mLegacyCompatibilityMode  = source.readInt() != 0;
             request.mDirectorySearchEnabled = source.readInt() != 0;
@@ -131,7 +131,6 @@
         dest.writeCharSequence(mTitle);
         dest.writeInt(mSearchMode ? 1 : 0);
         dest.writeString(mQueryString);
-        dest.writeInt(mDisplayOnlyWithPhones ? 1 : 0);
         dest.writeString(mGroupName);
         dest.writeInt(mLegacyCompatibilityMode ? 1 : 0);
         dest.writeInt(mDirectorySearchEnabled ? 1 : 0);
@@ -174,14 +173,6 @@
         mActionCode = actionCode;
     }
 
-    public boolean getDisplayWithPhoneNumbersOnly() {
-        return mDisplayOnlyWithPhones;
-    }
-
-    public void setDisplayWithPhoneNumbersOnly(boolean option) {
-        mDisplayOnlyWithPhones = option;
-    }
-
     public boolean isSearchMode() {
         return mSearchMode;
     }
diff --git a/src/com/android/contacts/list/DefaultContactBrowseListFragment.java b/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
index 10f2290..4d66dd2 100644
--- a/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
+++ b/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
@@ -91,7 +91,7 @@
                 editContact(adapter.getContactUri(position));
             }
         } else {
-            viewContact(adapter.getContactUri(position), false);
+            viewContact(adapter.getContactUri(position));
         }
     }
 
diff --git a/src/com/android/contacts/list/OnContactBrowserActionListener.java b/src/com/android/contacts/list/OnContactBrowserActionListener.java
index 5291639..239f8e1 100644
--- a/src/com/android/contacts/list/OnContactBrowserActionListener.java
+++ b/src/com/android/contacts/list/OnContactBrowserActionListener.java
@@ -26,9 +26,8 @@
      * Opens the specified contact for viewing.
      *
      * @param contactLookupUri The lookup-uri of the Contact that should be opened
-     * @param finishEditing The user has explicitly requested to leave the edit mode
      */
-    void onViewContactAction(Uri contactLookupUri, boolean finishEditing);
+    void onViewContactAction(Uri contactLookupUri);
 
     /**
      * Creates a new contact.
diff --git a/src/com/android/contacts/list/StrequentContactListFragment.java b/src/com/android/contacts/list/StrequentContactListFragment.java
index 722e3b7..393e698 100644
--- a/src/com/android/contacts/list/StrequentContactListFragment.java
+++ b/src/com/android/contacts/list/StrequentContactListFragment.java
@@ -58,7 +58,7 @@
     @Override
     protected void onItemClick(int position, long id) {
         ContactListAdapter adapter = getAdapter();
-        viewContact(adapter.getContactUri(position), false);
+        viewContact(adapter.getContactUri(position));
     }
 
     @Override
@@ -94,6 +94,7 @@
         setEmptyText(R.string.noFavoritesHelpText);
     }
 
+    @Override
     public void onClick(View v) {
         int id = v.getId();
         switch (id) {
diff --git a/src/com/android/contacts/model/EntityDeltaList.java b/src/com/android/contacts/model/EntityDeltaList.java
index e68b6ef..455cced 100644
--- a/src/com/android/contacts/model/EntityDeltaList.java
+++ b/src/com/android/contacts/model/EntityDeltaList.java
@@ -141,7 +141,9 @@
         // Second pass builds actual operations
         for (EntityDelta delta : this) {
             final int firstBatch = diff.size();
-            backRefs[rawContactIndex++] = firstBatch;
+            final boolean isInsert = delta.isContactInsert();
+            backRefs[rawContactIndex++] = isInsert ? firstBatch : -1;
+
             delta.buildDiff(diff);
 
             // If the user chose to join with some other existing raw contact(s) at save time,
@@ -161,7 +163,7 @@
             }
 
             // Only create rules for inserts
-            if (!delta.isContactInsert()) continue;
+            if (!isInsert) continue;
 
             // If we are going to split all contacts, there is no point in first combining them
             if (mSplitRawContacts) continue;
@@ -236,18 +238,25 @@
         builder.withValue(AggregationExceptions.TYPE, AggregationExceptions.TYPE_KEEP_SEPARATE);
 
         Long rawContactId1 = get(index1).getValues().getAsLong(RawContacts._ID);
+        int backRef1 = backRefs[index1];
         if (rawContactId1 != null && rawContactId1 >= 0) {
             builder.withValue(AggregationExceptions.RAW_CONTACT_ID1, rawContactId1);
+        } else if (backRef1 >= 0) {
+            builder.withValueBackReference(AggregationExceptions.RAW_CONTACT_ID1, backRef1);
         } else {
-            builder.withValueBackReference(AggregationExceptions.RAW_CONTACT_ID1, backRefs[index1]);
+            return;
         }
 
         Long rawContactId2 = get(index2).getValues().getAsLong(RawContacts._ID);
+        int backRef2 = backRefs[index2];
         if (rawContactId2 != null && rawContactId2 >= 0) {
             builder.withValue(AggregationExceptions.RAW_CONTACT_ID2, rawContactId2);
+        } else if (backRef2 >= 0) {
+            builder.withValueBackReference(AggregationExceptions.RAW_CONTACT_ID2, backRef2);
         } else {
-            builder.withValueBackReference(AggregationExceptions.RAW_CONTACT_ID2, backRefs[index2]);
+            return;
         }
+
         diff.add(builder.build());
     }
 
diff --git a/src/com/android/contacts/ui/QuickContactWindow.java b/src/com/android/contacts/ui/QuickContactWindow.java
index 4cf0d1d..ca40066 100644
--- a/src/com/android/contacts/ui/QuickContactWindow.java
+++ b/src/com/android/contacts/ui/QuickContactWindow.java
@@ -27,6 +27,7 @@
 import com.android.contacts.util.Constants;
 import com.android.contacts.util.DataStatus;
 import com.android.contacts.util.NotifyingAsyncQueryHandler;
+import com.android.contacts.util.PhoneCapabilityTester;
 import com.android.internal.policy.PolicyManager;
 import com.google.android.collect.Sets;
 
@@ -768,10 +769,12 @@
 
             // Handle well-known MIME-types with special care
             if (Phone.CONTENT_ITEM_TYPE.equals(mimeType)) {
-                final String number = getAsString(cursor, Phone.NUMBER);
-                if (!TextUtils.isEmpty(number)) {
-                    final Uri callUri = Uri.fromParts(Constants.SCHEME_TEL, number, null);
-                    mIntent = new Intent(Intent.ACTION_CALL_PRIVILEGED, callUri);
+                if (PhoneCapabilityTester.isPhone(mContext)) {
+                    final String number = getAsString(cursor, Phone.NUMBER);
+                    if (!TextUtils.isEmpty(number)) {
+                        final Uri callUri = Uri.fromParts(Constants.SCHEME_TEL, number, null);
+                        mIntent = new Intent(Intent.ACTION_CALL_PRIVILEGED, callUri);
+                    }
                 }
             } else if (SipAddress.CONTENT_ITEM_TYPE.equals(mimeType)) {
                 final String address = getAsString(cursor, SipAddress.SIP_ADDRESS);
@@ -786,12 +789,13 @@
                     // for the SIP-related intent-filters in its manifest.
                 }
             } else if (Constants.MIME_SMS_ADDRESS.equals(mimeType)) {
-                final String number = getAsString(cursor, Phone.NUMBER);
-                if (!TextUtils.isEmpty(number)) {
-                    final Uri smsUri = Uri.fromParts(Constants.SCHEME_SMSTO, number, null);
-                    mIntent = new Intent(Intent.ACTION_SENDTO, smsUri);
+                if (PhoneCapabilityTester.isSmsIntentRegistered(mContext)) {
+                    final String number = getAsString(cursor, Phone.NUMBER);
+                    if (!TextUtils.isEmpty(number)) {
+                        final Uri smsUri = Uri.fromParts(Constants.SCHEME_SMSTO, number, null);
+                        mIntent = new Intent(Intent.ACTION_SENDTO, smsUri);
+                    }
                 }
-
             } else if (Email.CONTENT_ITEM_TYPE.equals(mimeType)) {
                 final String address = getAsString(cursor, Email.DATA);
                 if (!TextUtils.isEmpty(address)) {
diff --git a/src/com/android/contacts/vcard/ImportProcessor.java b/src/com/android/contacts/vcard/ImportProcessor.java
index 14cba46..6a7dbe6 100644
--- a/src/com/android/contacts/vcard/ImportProcessor.java
+++ b/src/com/android/contacts/vcard/ImportProcessor.java
@@ -84,7 +84,7 @@
             mBound = false;
         }
 
-        public void sendFinisheNotification() {
+        public void sendFinishNotification() {
             try {
                 mMessenger.send(Message.obtain(null,
                         VCardService.MSG_NOTIFY_IMPORT_FINISHED,
@@ -233,7 +233,7 @@
             // Currenty we don't have an appropriate way to let users see all URIs imported.
             // Instead, we show one only when there's just one created uri.
             doFinishNotification(mCreatedUris.size() > 0 ? mCreatedUris.get(0) : null);
-            mConnection.sendFinisheNotification();
+            mConnection.sendFinishNotification();
         } finally {
             // TODO: verify this works fine.
             mReadyForRequest = false;  // Just in case.
diff --git a/src/com/android/contacts/vcard/VCardService.java b/src/com/android/contacts/vcard/VCardService.java
index b5a216e..1e855ab 100644
--- a/src/com/android/contacts/vcard/VCardService.java
+++ b/src/com/android/contacts/vcard/VCardService.java
@@ -66,7 +66,7 @@
                     } else {
                         final ImportRequest parameter = (ImportRequest)msg.obj;
 
-                        if (mImportProcessor == null) {
+                        if (mImportProcessor == null || !mImportProcessor.isReadyForRequest()) {
                             mImportProcessor = new ImportProcessor(VCardService.this);
                         } else if (mImportProcessor.isCanceled()) {
                             Log.i(LOG_TAG,
diff --git a/src/com/android/contacts/views/detail/ContactDetailFragment.java b/src/com/android/contacts/views/detail/ContactDetailFragment.java
index b456f59..4a3f46f 100644
--- a/src/com/android/contacts/views/detail/ContactDetailFragment.java
+++ b/src/com/android/contacts/views/detail/ContactDetailFragment.java
@@ -190,9 +190,6 @@
         mInflater = inflater;
 
         mHeaderView = (ContactDetailHeaderView) view.findViewById(R.id.contact_header_widget);
-        mHeaderView.setExcludeMimes(new String[] {
-            Contacts.CONTENT_ITEM_TYPE
-        });
         mHeaderView.setListener(mHeaderViewListener);
 
         mListView = (ListView) view.findViewById(android.R.id.list);
@@ -924,11 +921,7 @@
 
     @Override
     public void onPrepareOptionsMenu(Menu menu) {
-        if (mContactData == null) {
-            return;
-        }
-
-        boolean isDirectoryEntry = mContactData.isDirectoryEntry();
+        boolean isDirectoryEntry = mContactData != null && mContactData.isDirectoryEntry();
 
         // Options only shows telephony-related settings (ringtone, send to voicemail).
         // ==> Hide if we don't have a telephone
@@ -958,6 +951,7 @@
                 return true;
             }
             case R.id.menu_options: {
+                if (mContactData == null) return false;
                 final Intent intent = new Intent(mContext, ContactOptionsActivity.class);
                 intent.setData(mContactData.getLookupUri());
                 mContext.startActivity(intent);
@@ -965,6 +959,7 @@
             }
             case R.id.menu_share: {
                 if (mAllRestricted) return false;
+                if (mContactData == null) return false;
 
                 final String lookupKey = mContactData.getLookupKey();
                 final Uri shareUri = Uri.withAppendedPath(Contacts.CONTENT_VCARD_URI, lookupKey);
diff --git a/src/com/android/contacts/views/detail/ContactDetailHeaderView.java b/src/com/android/contacts/views/detail/ContactDetailHeaderView.java
index 8ac9ce7..16a2320 100644
--- a/src/com/android/contacts/views/detail/ContactDetailHeaderView.java
+++ b/src/com/android/contacts/views/detail/ContactDetailHeaderView.java
@@ -43,7 +43,6 @@
 import android.view.View;
 import android.widget.CheckBox;
 import android.widget.ImageButton;
-import android.widget.QuickContactBadge;
 import android.widget.FrameLayout;
 import android.widget.ImageView;
 import android.widget.TextView;
@@ -60,7 +59,7 @@
     private TextView mDisplayNameView;
     private TextView mPhoneticNameView;
     private CheckBox mStarredView;
-    private QuickContactBadge mPhotoView;
+    private ImageView mPhotoView;
     private ImageView mPresenceView;
     private View mStatusContainerView;
     private TextView mStatusView;
@@ -100,7 +99,7 @@
         mStarredView = (CheckBox)findViewById(R.id.star);
         mStarredView.setOnClickListener(this);
 
-        mPhotoView = (QuickContactBadge) findViewById(R.id.photo);
+        mPhotoView = (ImageView) findViewById(R.id.photo);
 
         mPresenceView = (ImageView) findViewById(R.id.presence);
         mStatusContainerView = findViewById(R.id.status_container);
@@ -116,7 +115,6 @@
      */
     public void loadData(ContactLoader.Result contactData) {
         mContactUri = contactData.getLookupUri();
-        mPhotoView.assignContactUri(contactData.getLookupUri());
 
         setDisplayName(contactData.getDisplayName(), contactData.getPhoneticName());
         setPhoto(findPhoto(contactData));
@@ -241,15 +239,6 @@
     }
 
     /**
-     * Set a list of specific MIME-types to exclude and not display. For
-     * example, this can be used to hide the {@link Contacts#CONTENT_ITEM_TYPE}
-     * profile icon.
-     */
-    public void setExcludeMimes(String[] excludeMimes) {
-        mPhotoView.setExcludeMimes(excludeMimes);
-    }
-
-    /**
      * Set all the status values to display in the header.
      * @param status             The status of the contact. If this is either null or empty,
      *                           the status is cleared and the other parameters are ignored.