diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 7d7579d..a6821db 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -16,8 +16,8 @@
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="com.android.contacts"
-    android:versionCode="20000"
-    android:versionName="2.0.0">
+    android:versionCode="20001"
+    android:versionName="2.0.1">
 
     <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="25" />
 
@@ -268,7 +268,7 @@
 
         <!-- Displays the members of a group in a list -->
         <activity android:name=".activities.GroupMembersActivity"
-            android:theme="@style/PeopleActivityTheme">
+            android:theme="@style/GroupActivityTheme">
 
             <intent-filter>
                 <action android:name="android.intent.action.VIEW" />
diff --git a/proguard.flags b/proguard.flags
index d9dad57..d6e3755 100644
--- a/proguard.flags
+++ b/proguard.flags
@@ -19,20 +19,23 @@
 -keep class com.android.contacts.common.database.NoNullCursorAsyncQueryHandler { *; }
 -keep class com.android.contacts.common.format.FormatUtils { *; }
 -keep class com.android.contacts.common.format.TextHighlighter { *; }
--keep class com.android.contacts.common.list.ContactListFilter { *; }
 -keep class com.android.contacts.common.list.ContactListItemView { *; }
 -keep class com.android.contacts.common.list.ContactsSectionIndexer { *; }
 -keep class com.android.contacts.common.location.CountryDetector { *; }
+-keep class com.android.contacts.common.model.account.AccountDisplayInfo { *; }
+-keep class com.android.contacts.common.model.account.AccountDisplayInfoFactory { *; }
 -keep class com.android.contacts.common.model.account.AccountType { *; }
 -keep class com.android.contacts.common.model.account.AccountType$* { *; }
 -keep class com.android.contacts.common.model.account.AccountTypeWithDataSet { *; }
 -keep class com.android.contacts.common.model.account.AccountWithDataSet { *; }
 -keep class com.android.contacts.common.model.account.BaseAccountType { *; }
 -keep class com.android.contacts.common.model.account.BaseAccountType$* { *; }
+-keep class com.android.contacts.common.model.account.DeviceLocalAccountType { *; }
 -keep class com.android.contacts.common.model.account.ExchangeAccountType { *; }
 -keep class com.android.contacts.common.model.account.ExternalAccountType { *; }
 -keep class com.android.contacts.common.model.account.FallbackAccountType { *; }
 -keep class com.android.contacts.common.model.account.GoogleAccountType { *; }
+-keep class com.android.contacts.common.model.account.SimAccountType { *; }
 -keep class com.android.contacts.common.model.AccountTypeManager { *; }
 -keep class com.android.contacts.common.model.AccountTypeManagerImpl { *; }
 -keep class com.android.contacts.common.model.BuilderWrapper { *; }
@@ -53,6 +56,7 @@
 -keep class com.android.contacts.common.model.dataitem.StructuredNameDataItem { *; }
 -keep class com.android.contacts.common.model.dataitem.StructuredPostalDataItem { *; }
 -keep class com.android.contacts.common.model.dataitem.WebsiteDataItem { *; }
+-keep class com.android.contacts.common.model.DeviceLocalAccountLocator { *; }
 -keep class com.android.contacts.common.model.RawContact { *; }
 -keep class com.android.contacts.common.model.RawContactDelta { *; }
 -keep class com.android.contacts.common.model.RawContactDeltaList { *; }
@@ -64,14 +68,11 @@
 -keep class com.android.contacts.common.util.BitmapUtil { *; }
 -keep class com.android.contacts.common.util.ContactDisplayUtils { *; }
 -keep class com.android.contacts.common.util.DateUtils { *; }
+-keep class com.android.contacts.common.util.DeviceLocalAccountTypeFactory { *; }
+-keep class com.android.contacts.common.util.DeviceLocalAccountTypeFactory$* { *; }
 -keep class com.android.contacts.common.util.NameConverter { *; }
 -keep class com.android.contacts.common.util.SearchUtil { *; }
 -keep class com.android.contacts.common.util.SearchUtil$* { *; }
--keep class com.android.contacts.common.util.DeviceAccountFilter { *; }
--keep class com.android.contacts.common.util.DeviceAccountFilter$* { *; }
--keep class com.android.contacts.common.util.DeviceAccountPresentationValues { *; }
--keep class com.android.contacts.common.util.DeviceAccountPresentationValues$* { *; }
--keep class com.android.contacts.common.util.DeviceLocalContactsFilterProvider { *; }
 -keep class com.android.contacts.ContactsApplication { *; }
 -keep class com.android.contacts.ContactSaveService { *; }
 -keep class com.android.contacts.ContactSaveService$* { *; }
diff --git a/res/drawable/ic_sim_card_black_24dp.xml b/res/drawable/ic_sim_card_tinted_24dp.xml
similarity index 92%
rename from res/drawable/ic_sim_card_black_24dp.xml
rename to res/drawable/ic_sim_card_tinted_24dp.xml
index 40ee84f..9a20abf 100644
--- a/res/drawable/ic_sim_card_black_24dp.xml
+++ b/res/drawable/ic_sim_card_tinted_24dp.xml
@@ -19,7 +19,8 @@
         android:width="24dp"
         android:height="24dp"
         android:viewportWidth="24.0"
-        android:viewportHeight="24.0">
+        android:viewportHeight="24.0"
+        android:tint="@color/device_account_tint_color">
     <path
         android:fillColor="#FF000000"
         android:pathData="M19.99,4c0,-1.1 -0.89,-2 -1.99,-2h-8L4,8v12c0,1.1 0.9,2 2,2h12.01c1.1,0 1.99,-0.9 1.99,-2l-0.01,-16zM9,19L7,19v-2h2v2zM17,19h-2v-2h2v2zM9,15L7,15v-4h2v4zM13,19h-2v-4h2v4zM13,13h-2v-2h2v2zM17,15h-2v-4h2v4z"/>
diff --git a/res/layout-land/compact_contact_editor_fragment.xml b/res/layout-land/compact_contact_editor_fragment.xml
index 09bb5bb..4f333bd 100644
--- a/res/layout-land/compact_contact_editor_fragment.xml
+++ b/res/layout-land/compact_contact_editor_fragment.xml
@@ -44,8 +44,7 @@
                 android:orientation="vertical">
 
             <include layout="@layout/editor_all_rawcontacts_accounts_selector" />
-            <include layout="@layout/compact_account_info" />
-            <include layout="@layout/editor_account_selector" />
+            <include layout="@layout/editor_account_header" />
 
             <include layout="@layout/compact_contact_editor_fields"/>
 
diff --git a/res/layout/compact_account_info.xml b/res/layout/compact_account_info.xml
deleted file mode 100644
index dda4fe4..0000000
--- a/res/layout/compact_account_info.xml
+++ /dev/null
@@ -1,70 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     Copyright (C) 2015 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.
--->
-
-<!-- Copy of editor_account_header_expandable, but w/o the expand account button. -->
-<LinearLayout
-        xmlns:android="http://schemas.android.com/apk/res/android"
-        android:id="@+id/account_container"
-        android:layout_height="wrap_content"
-        android:layout_width="match_parent"
-        android:minHeight="@dimen/editor_min_line_item_height"
-        android:orientation="horizontal"
-        android:background="?android:attr/selectableItemBackground"
-        android:layout_marginBottom="@dimen/compact_editor_name_top_margin"
-        android:visibility="gone"
-        >
-
-
-    <ImageView
-            android:id="@+id/account_type_icon"
-            style="@style/EditSelectorIconStyle"/>
-
-    <LinearLayout
-            android:layout_height="wrap_content"
-            android:layout_width="0dp"
-            android:layout_weight="1"
-            android:layout_marginTop="@dimen/compact_editor_account_header_top_margin"
-            android:layout_marginStart="@dimen/compact_editor_account_left_margin"
-            android:layout_gravity="center_vertical"
-            android:orientation="vertical"
-            >
-
-        <TextView
-                android:id="@+id/account_type"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:textSize="16sp"
-                android:singleLine="true"
-                android:textColor="@color/primary_text_color"
-                android:ellipsize="end"
-                android:textAlignment="viewStart"
-                />
-
-        <TextView
-                android:id="@+id/account_name"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:textSize="14sp"
-                android:singleLine="true"
-                android:textColor="@color/secondary_text_color"
-                android:ellipsize="end"
-                android:textAlignment="viewStart"
-                />
-
-    </LinearLayout>
-
-</LinearLayout>
\ No newline at end of file
diff --git a/res/layout/compact_contact_editor_fragment.xml b/res/layout/compact_contact_editor_fragment.xml
index 1e134e0..e00c648 100644
--- a/res/layout/compact_contact_editor_fragment.xml
+++ b/res/layout/compact_contact_editor_fragment.xml
@@ -40,8 +40,7 @@
             android:focusableInTouchMode="true"/>
 
         <include layout="@layout/editor_all_rawcontacts_accounts_selector" />
-        <include layout="@layout/compact_account_info" />
-        <include layout="@layout/editor_account_selector" />
+        <include layout="@layout/editor_account_header" />
 
         <include layout="@layout/compact_contact_editor_fields" />
 
diff --git a/res/layout/editor_account_header.xml b/res/layout/editor_account_header.xml
index 59ae3b1..5a93b58 100644
--- a/res/layout/editor_account_header.xml
+++ b/res/layout/editor_account_header.xml
@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
+<!--
+     Copyright (C) 2015 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.
@@ -15,59 +16,64 @@
 -->
 
 <LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/account_container"
-    android:layout_height="wrap_content"
-    android:layout_width="match_parent"
-    android:minHeight="48dip"
-    android:background="#EEEEEE"
-    android:orientation="horizontal"
-    android:paddingTop="8dip"
-    android:paddingBottom="8dip"
-    android:gravity="center_vertical"
-    android:paddingLeft="@dimen/account_container_left_padding"
-    android:paddingRight="28dip"
-    android:paddingStart="@dimen/account_container_left_padding"
-    android:paddingEnd="28dip">
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        android:id="@+id/account_header_container"
+        android:layout_height="wrap_content"
+        android:layout_width="match_parent"
+        android:minHeight="@dimen/editor_min_line_item_height"
+        android:orientation="horizontal"
+        android:paddingBottom="@dimen/compact_editor_name_top_margin"
+        >
+
+
+    <ImageView
+            android:id="@+id/account_type_icon"
+            style="@style/EditSelectorIconStyle"/>
 
     <LinearLayout
-        android:id="@+id/account"
-        android:layout_height="wrap_content"
-        android:layout_width="0dip"
-        android:layout_weight="1"
-        android:orientation="vertical"
-        android:background="?android:attr/selectableItemBackground">
-
-        <TextView
-            android:id="@+id/account_type"
-            android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:textAppearance="?android:attr/textAppearanceMedium"
-            android:singleLine="true"
-            android:textColor="@color/primary_text_color"
-            android:ellipsize="end" />
+            android:layout_width="0dp"
+            android:layout_weight="1"
+            android:layout_marginTop="@dimen/compact_editor_account_header_top_margin"
+            android:layout_marginStart="@dimen/compact_editor_account_left_margin"
+            android:layout_gravity="center_vertical"
+            android:orientation="vertical"
+            >
 
         <TextView
-             android:id="@+id/account_name"
-             android:layout_width="match_parent"
-             android:layout_height="wrap_content"
-             android:textAppearance="?android:attr/textAppearanceSmall"
-             android:textColor="@color/primary_text_color"
-             android:singleLine="true"
-             android:ellipsize="end" />
+                android:id="@+id/account_type"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:textSize="16sp"
+                android:singleLine="true"
+                android:textColor="@color/primary_text_color"
+                android:ellipsize="end"
+                android:textAlignment="viewStart"
+                />
+
+        <TextView
+                android:id="@+id/account_name"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:textSize="14sp"
+                android:singleLine="true"
+                android:textColor="@color/secondary_text_color"
+                android:ellipsize="end"
+                android:textAlignment="viewStart"
+                />
 
     </LinearLayout>
 
-    <FrameLayout
+    <ImageView
+        android:id="@+id/account_expander_icon"
+        android:src="@drawable/ic_menu_expander_minimized_holo_light"
         android:layout_width="wrap_content"
-        android:layout_height="match_parent">
-
-        <ImageView
-             android:id="@+id/account_icon"
-             android:layout_width="32dip"
-             android:layout_height="32dip"
-             android:layout_gravity="center_vertical" />
-
-    </FrameLayout>
-
+        android:layout_height="wrap_content"
+        android:layout_gravity="center_vertical|end"
+        android:layout_alignParentEnd="true"
+        android:paddingStart="@dimen/editor_round_button_padding_left"
+        android:paddingEnd="@dimen/editor_round_button_padding_right"
+        android:paddingTop="@dimen/editor_round_button_padding_top"
+        android:paddingBottom="@dimen/editor_round_button_padding_bottom"
+        android:visibility="gone"/>
 </LinearLayout>
\ No newline at end of file
diff --git a/res/layout/editor_account_header_expandable.xml b/res/layout/editor_account_header_expandable.xml
deleted file mode 100644
index c3d9e31..0000000
--- a/res/layout/editor_account_header_expandable.xml
+++ /dev/null
@@ -1,86 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2014 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.
--->
-
-<!-- Header at the top of a raw contact editor. This is clickable to expand/collapse the editor. -->
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/account_header_container"
-    android:layout_height="wrap_content"
-    android:layout_width="match_parent"
-    android:background="?android:attr/selectableItemBackground"
-    android:paddingStart="16dp"
-    android:focusable="true"
-    >
-
-    <!-- TODO: consider making this a new style, like EditKindIconStyle -->
-    <ImageView
-        android:id="@android:id/icon"
-        android:layout_width="@dimen/editor_kind_icon_size"
-        android:layout_height="@dimen/editor_kind_icon_size"
-        android:layout_marginEnd="28dp"
-        android:layout_gravity="center_vertical"
-        />
-
-    <LinearLayout
-        android:id="@+id/account_info"
-        android:layout_height="wrap_content"
-        android:layout_width="match_parent"
-        android:layout_weight="1"
-        android:paddingBottom="@dimen/editor_account_header_expandable_top_bottom_padding"
-        android:paddingTop="@dimen/editor_account_header_expandable_top_bottom_padding"
-        android:orientation="vertical"
-        >
-
-        <TextView
-            android:id="@+id/account_type"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:textSize="16sp"
-            android:singleLine="true"
-            android:textColor="@color/primary_text_color"
-            android:ellipsize="end"
-            android:textAlignment="viewStart"
-            />
-
-        <TextView
-            android:id="@+id/account_name"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:textSize="14sp"
-            android:singleLine="true"
-            android:textColor="@color/secondary_text_color"
-            android:ellipsize="end"
-            android:textAlignment="viewStart"
-            />
-
-    </LinearLayout>
-
-    <ImageView
-        android:id="@+id/expand_account_button"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_weight="0"
-        android:layout_gravity="center_vertical|end"
-        android:clickable="false"
-        android:paddingLeft="@dimen/editor_round_button_padding_left"
-        android:paddingRight="@dimen/editor_round_button_padding_right"
-        android:paddingStart="@dimen/editor_round_button_padding_left"
-        android:paddingEnd="@dimen/editor_round_button_padding_right"
-        android:paddingTop="@dimen/editor_round_button_padding_top"
-        android:paddingBottom="@dimen/editor_round_button_padding_bottom"
-        />
-
-</LinearLayout>
\ No newline at end of file
diff --git a/res/layout/editor_account_selector.xml b/res/layout/editor_account_selector.xml
deleted file mode 100644
index dcd0e28..0000000
--- a/res/layout/editor_account_selector.xml
+++ /dev/null
@@ -1,81 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<!-- Header at the top of a raw contact editor. This allows users to change the account that
-    the raw contact is saved in. -->
-<LinearLayout
-        xmlns:android="http://schemas.android.com/apk/res/android"
-        android:id="@+id/account_selector_container"
-        android:focusable="true"
-        android:layout_height="wrap_content"
-        android:layout_width="match_parent"
-        android:minHeight="@dimen/editor_min_line_item_height"
-        android:orientation="horizontal"
-        android:layout_marginBottom="@dimen/compact_editor_name_top_margin"
-        android:visibility="gone">
-
-    <ImageView
-        android:id="@+id/kind_icon"
-        android:src="@drawable/ic_account_circle_black_24dp"
-        android:tint="@color/editor_icon_color"
-        android:contentDescription="@string/header_account_entry"
-        style="@style/EditSelectorIconStyle"/>
-
-    <LinearLayout
-        android:id="@+id/account"
-        android:layout_height="wrap_content"
-        android:layout_width="0dip"
-        android:layout_weight="1"
-        android:layout_gravity="center_vertical"
-        android:orientation="vertical"
-        android:layout_marginStart="4dp"
-        android:layout_marginEnd="48dp">
-
-        <TextView
-            android:id="@+id/account_type_selector"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:textSize="16sp"
-            android:singleLine="true"
-            android:textColor="@color/primary_text_color"
-            android:textAlignment="viewStart"
-            android:ellipsize="end" />
-
-        <TextView
-             android:id="@+id/account_name_selector"
-             android:layout_width="match_parent"
-             android:layout_height="wrap_content"
-             android:textSize="14sp"
-             android:singleLine="true"
-             android:textColor="@color/secondary_text_color"
-             android:textAlignment="viewStart"
-             android:ellipsize="end" />
-
-    </LinearLayout>
-
-    <ImageView
-        android:src="@drawable/ic_menu_expander_minimized_holo_light"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_gravity="center_vertical|end"
-        android:layout_alignParentEnd="true"
-        android:paddingStart="@dimen/editor_round_button_padding_left"
-        android:paddingEnd="@dimen/editor_round_button_padding_right"
-        android:paddingTop="@dimen/editor_round_button_padding_top"
-        android:paddingBottom="@dimen/editor_round_button_padding_bottom"/>
-
-
-</LinearLayout>
\ No newline at end of file
diff --git a/res/layout/raw_contact_editor_view.xml b/res/layout/raw_contact_editor_view.xml
index 97c1b49..004418d 100644
--- a/res/layout/raw_contact_editor_view.xml
+++ b/res/layout/raw_contact_editor_view.xml
@@ -21,12 +21,8 @@
     android:layout_height="wrap_content"
     android:orientation="vertical" >
 
-    <!-- There are two mutually exclusive account headers that look significantly different.
-        The editor_account_selector is used when an account needs to be chosen. -->
     <include
-        layout="@layout/editor_account_header_expandable" />
-    <include
-        layout="@layout/editor_account_selector" />
+        layout="@layout/editor_account_header" />
 
     <LinearLayout
         android:id="@+id/collapsable_section"
diff --git a/res/layout/raw_contact_readonly_editor_view.xml b/res/layout/raw_contact_readonly_editor_view.xml
index 25699ce..e50aa98 100644
--- a/res/layout/raw_contact_readonly_editor_view.xml
+++ b/res/layout/raw_contact_readonly_editor_view.xml
@@ -21,7 +21,7 @@
     android:orientation="vertical" >
 
     <include
-        layout="@layout/editor_account_header_expandable" />
+        layout="@layout/editor_account_header" />
 
     <LinearLayout
         android:id="@+id/collapsable_section"
diff --git a/res/values-ky-rKG/strings.xml b/res/values-ky-rKG/strings.xml
index dc23283..567b36a 100644
--- a/res/values-ky-rKG/strings.xml
+++ b/res/values-ky-rKG/strings.xml
@@ -440,7 +440,7 @@
     <string name="list_filter_phones_work" msgid="1470173699551475015">"Жумуш профилиндеги байланыштар"</string>
     <string name="view_updates_from_group" msgid="1782685984905600034">"Жаңыртууларды көрүү"</string>
     <string name="account_phone" msgid="7128032778471187553">"Түзмөк"</string>
-    <string name="account_sim" msgid="6519016427905087952">"SIM карта"</string>
+    <string name="account_sim" msgid="6519016427905087952">"SIM-карта"</string>
     <!-- no translation found for nameLabelsGroup (2034640839640477827) -->
     <skip />
     <!-- no translation found for nicknameLabelsGroup (2891682101053358010) -->
diff --git a/res/values/colors.xml b/res/values/colors.xml
index 355a4e8..771ba44 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -28,7 +28,6 @@
     <color name="action_bar_button_text_color">#FFFFFF</color>
 
     <color name="actionbar_background_color">@color/primary_color</color>
-    <color name="actionbar_background_color_dark">@color/primary_color_dark</color>
 
     <color name="contextual_selection_bar_color">#f6f6f6</color>
     <!-- Color of the status bar above the contextual selection bar. -->
@@ -37,6 +36,9 @@
     <color name="primary_color_dark">#0277bd</color>
     <color name="primary_color">#0288d1</color>
 
+    <color name="group_primary_color_dark">#546E7A</color>
+    <color name="group_primary_color">#607D8B</color>
+
     <!-- Color of the selected tab underline -->
     <color name="contacts_accent_color">#FFFFFF</color>
 
@@ -252,4 +254,7 @@
 
     <!-- Primary text color in Contacts app -->
     <color name="contacts_text_color">#333333</color>
+
+    <!-- tint color for device account icons -->
+    <color name="device_account_tint_color">#7f7f7f</color>
 </resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 14207d2..04f2b0d 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -712,8 +712,6 @@
     <string name="expanding_entry_card_view_see_more">See more</string>
     <!-- Button Label to see less on an ExpandingEntryCardView [CHAR LIMIT=40] -->
     <string name="expanding_entry_card_view_see_less">See less</string>
-    <!-- Button Label to see all on an ExpandingEntryCardView [CHAR LIMIT=40] -->
-    <string name="expanding_entry_card_view_see_all">See all</string>
 
     <!-- Title of recent card. [CHAR LIMIT=60] -->
     <string name="recent_card_title">Recent</string>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 8ebe761..432f0a8 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -103,6 +103,11 @@
         <item name="android:listSelector">?android:attr/listChoiceBackgroundIndicator</item>
     </style>
 
+    <style name="GroupActivityTheme" parent="@style/PeopleActivityTheme">
+        <item name="android:colorPrimaryDark">@color/group_primary_color_dark</item>
+        <item name="colorPrimaryDark">@color/group_primary_color_dark</item>
+    </style>
+
     <style name="PeopleThemeAppCompat" parent="Theme.AppCompat.Light">
         <!-- Styles that require AppCompat compatibility, remember to update both sets -->
         <item name="android:actionBarStyle">@style/ContactsActionBarStyleAppCompat</item>
diff --git a/src-bind/com/android/contactsbind/ObjectFactory.java b/src-bind/com/android/contactsbind/ObjectFactory.java
index f6dc0c7..ecdb967 100644
--- a/src-bind/com/android/contactsbind/ObjectFactory.java
+++ b/src-bind/com/android/contactsbind/ObjectFactory.java
@@ -15,8 +15,7 @@
 
 import com.android.contacts.common.logging.Logger;
 import com.android.contacts.common.preference.PreferenceManager;
-import com.android.contacts.common.util.DeviceAccountFilter;
-import com.android.contacts.common.util.DeviceAccountPresentationValues;
+import com.android.contacts.common.util.DeviceLocalAccountTypeFactory;
 
 import android.content.Context;
 
@@ -31,11 +30,7 @@
 
     public static PreferenceManager getPreferenceManager(Context context) { return null; }
 
-    public static DeviceAccountPresentationValues createDeviceAccountPresentationValues(Context context) {
-        return new DeviceAccountPresentationValues.Default(context);
-    }
-
-    public static DeviceAccountFilter getDeviceAccountFilter(Context context) {
-        return DeviceAccountFilter.ONLY_NULL;
+    public static DeviceLocalAccountTypeFactory getDeviceLocalAccountTypeFactory(Context context) {
+        return new DeviceLocalAccountTypeFactory.Default(context);
     }
 }
diff --git a/src/com/android/contacts/ContactsDrawerActivity.java b/src/com/android/contacts/ContactsDrawerActivity.java
index f976807..34c95c6 100644
--- a/src/com/android/contacts/ContactsDrawerActivity.java
+++ b/src/com/android/contacts/ContactsDrawerActivity.java
@@ -54,12 +54,10 @@
 import com.android.contacts.common.list.ContactListFilter;
 import com.android.contacts.common.list.ContactListFilterController;
 import com.android.contacts.common.model.AccountTypeManager;
-import com.android.contacts.common.model.account.AccountType;
 import com.android.contacts.common.model.account.AccountWithDataSet;
 import com.android.contacts.common.preference.ContactsPreferenceActivity;
 import com.android.contacts.common.util.AccountFilterUtil;
 import com.android.contacts.common.util.AccountsListAdapter.AccountListFilter;
-import com.android.contacts.common.util.DeviceAccountPresentationValues;
 import com.android.contacts.common.util.ImplicitIntentsUtil;
 import com.android.contacts.common.util.ViewUtil;
 import com.android.contacts.editor.ContactEditorFragment;
@@ -72,10 +70,11 @@
 import com.android.contacts.interactions.AccountFiltersFragment;
 import com.android.contacts.interactions.AccountFiltersFragment.AccountFiltersListener;
 import com.android.contacts.quickcontact.QuickContactActivity;
+import com.android.contacts.common.model.account.AccountDisplayInfo;
+import com.android.contacts.common.model.account.AccountDisplayInfoFactory;
 import com.android.contacts.util.SharedPreferenceUtil;
 import com.android.contactsbind.Assistants;
 import com.android.contactsbind.HelpUtils;
-import com.android.contactsbind.ObjectFactory;
 
 import java.util.HashMap;
 import java.util.Iterator;
@@ -173,7 +172,6 @@
 
     // The account the new group will be created under.
     private AccountWithDataSet mNewGroupAccount;
-    private DeviceAccountPresentationValues mDeviceAccountPresentationValues;
 
     private int mPositionOfLastGroup;
 
@@ -186,8 +184,6 @@
 
         super.setContentView(R.layout.contacts_drawer_activity);
 
-        mDeviceAccountPresentationValues = ObjectFactory.createDeviceAccountPresentationValues(this);
-
         // Set up the action bar.
         mToolbar = getView(R.id.toolbar);
         setSupportActionBar(mToolbar);
@@ -461,6 +457,9 @@
 
     @Override
     public void onFiltersLoaded(List<ContactListFilter> accountFilterItems) {
+        final AccountDisplayInfoFactory accountDisplayFactory = AccountDisplayInfoFactory.
+                fromListFilters(this, accountFilterItems);
+
         final Menu menu = mNavigationView.getMenu();
         final MenuItem filtersMenuItem = menu.findItem(R.id.nav_filters);
         final SubMenu subMenu = filtersMenuItem.getSubMenu();
@@ -473,12 +472,12 @@
 
         int positionOfLastFilter = mPositionOfLastGroup + GAP_BETWEEN_TWO_MENU_GROUPS;
 
-        mDeviceAccountPresentationValues.setFilters(accountFilterItems);
-
         for (int i = 0; i < accountFilterItems.size(); i++) {
             positionOfLastFilter++;
             final ContactListFilter filter = accountFilterItems.get(i);
-            final CharSequence menuName = mDeviceAccountPresentationValues.getLabel(i);
+            final AccountDisplayInfo displayableAccount =
+                    accountDisplayFactory.getAccountDisplayInfoFor(filter);
+            final CharSequence menuName = displayableAccount.getNameLabel();
             final MenuItem menuItem = subMenu.add(R.id.nav_filters_items, Menu.NONE,
                     positionOfLastFilter, menuName);
             mFilterMenuMap.put(filter, menuItem);
@@ -502,17 +501,15 @@
                     return true;
                 }
             });
-            menuItem.setIcon(mDeviceAccountPresentationValues.getIcon(i));
+            menuItem.setIcon(displayableAccount.getIcon());
             // Get rid of the default menu item overlay and show original account icons.
             menuItem.getIcon().setColorFilter(Color.TRANSPARENT, PorterDuff.Mode.SRC_ATOP);
             // Create a dummy action view to attach extra hidden content description to the menuItem
             // for Talkback. We want Talkback to read out the account type but not have it be part
             // of the menuItem title.
-            final AccountType account = AccountTypeManager.getInstance(this)
-                    .getAccountType(filter.accountType, filter.dataSet);
             LinearLayout view = (LinearLayout) LayoutInflater.from(this)
                     .inflate(R.layout.account_type_info, null);
-            view.setContentDescription(account.getDisplayLabel(this));
+            view.setContentDescription(displayableAccount.getTypeLabel());
             view.setVisibility(View.VISIBLE);
             menuItem.setActionView(view);
         }
diff --git a/src/com/android/contacts/activities/ActionBarAdapter.java b/src/com/android/contacts/activities/ActionBarAdapter.java
index 9d7907d..e046e71 100644
--- a/src/com/android/contacts/activities/ActionBarAdapter.java
+++ b/src/com/android/contacts/activities/ActionBarAdapter.java
@@ -584,8 +584,9 @@
                     mActivity, R.color.contextual_selection_bar_status_bar_color);
             runStatusBarAnimation(/* colorTo */ cabStatusBarColor);
         } else {
-            final int normalStatusBarColor = ContextCompat.getColor(
-                    mActivity, R.color.primary_color_dark);
+            final int normalStatusBarColor = mActivity instanceof GroupMembersActivity
+                    ? ContextCompat.getColor(mActivity, R.color.group_primary_color_dark)
+                    : ContextCompat.getColor(mActivity, R.color.primary_color_dark);
             if (shouldAnimate) {
                 runStatusBarAnimation(/* colorTo */ normalStatusBarColor);
             } else {
diff --git a/src/com/android/contacts/activities/ContactEditorAccountsChangedActivity.java b/src/com/android/contacts/activities/ContactEditorAccountsChangedActivity.java
index c4c0e27..9b211ab 100644
--- a/src/com/android/contacts/activities/ContactEditorAccountsChangedActivity.java
+++ b/src/com/android/contacts/activities/ContactEditorAccountsChangedActivity.java
@@ -106,7 +106,7 @@
                     AccountListFilter.ACCOUNTS_CONTACT_WRITABLE);
             accountListView.setAdapter(mAccountListAdapter);
             accountListView.setOnItemClickListener(mAccountListItemClickListener);
-        } else if (numAccounts == 1) {
+        } else if (numAccounts == 1 && !accounts.get(0).isLocalAccount()) {
             // If the user has 1 writable account we will just show the user a message with 2
             // possible action buttons.
             view = View.inflate(this,
diff --git a/src/com/android/contacts/activities/ContactEditorBaseActivity.java b/src/com/android/contacts/activities/ContactEditorBaseActivity.java
index 8a8ce1d..55fcddb 100644
--- a/src/com/android/contacts/activities/ContactEditorBaseActivity.java
+++ b/src/com/android/contacts/activities/ContactEditorBaseActivity.java
@@ -71,6 +71,16 @@
     // 3 used for ContactDeletionInteraction.RESULT_CODE_DELETED
     public static final int RESULT_CODE_EDITED = 4;
 
+    /**
+     * The contact will be saved to the device local account when this is set for an insert. This
+     * is necessary because {@link android.accounts.Account} cannot be created with null values
+     * for the name and type and an Account is needed for
+     * {@link android.provider.ContactsContract.Intents.Insert#EXTRA_ACCOUNT}
+     */
+    public static final String EXTRA_SAVE_TO_DEVICE_FLAG =
+            "com.android.contacts.SAVE_TO_DEVICE_FLAG";
+
+
     protected int mActionBarTitleResId;
 
     /**
diff --git a/src/com/android/contacts/activities/GroupMembersActivity.java b/src/com/android/contacts/activities/GroupMembersActivity.java
index 000cae4..758481e 100644
--- a/src/com/android/contacts/activities/GroupMembersActivity.java
+++ b/src/com/android/contacts/activities/GroupMembersActivity.java
@@ -20,20 +20,22 @@
 import android.content.Context;
 import android.content.Intent;
 import android.database.Cursor;
+import android.graphics.drawable.ColorDrawable;
 import android.net.Uri;
 import android.os.AsyncTask;
 import android.os.Bundle;
 import android.provider.ContactsContract.RawContacts;
+import android.support.v4.content.ContextCompat;
 import android.support.v4.view.GravityCompat;
 import android.util.Log;
 import android.view.Menu;
 import android.view.MenuItem;
+import android.widget.FrameLayout;
 import android.widget.Toast;
 
 import com.android.contacts.ContactSaveService;
 import com.android.contacts.ContactsDrawerActivity;
 import com.android.contacts.R;
-import com.android.contacts.common.GroupMetaData;
 import com.android.contacts.common.logging.ListEvent;
 import com.android.contacts.common.logging.Logger;
 import com.android.contacts.common.logging.ScreenEvent.ScreenType;
@@ -196,6 +198,9 @@
         // Set up the view
         setContentView(R.layout.group_members_activity);
 
+        findViewById(R.id.toolbar_frame).setBackgroundColor(
+                ContextCompat.getColor(this, R.color.group_primary_color));
+
         // Set up the action bar
         mActionBarAdapter = new ActionBarAdapter(this, this, getSupportActionBar(),
                 /* portraitTabs */ null, /* landscapeTabs */ null, mToolbar,
diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java
index 492cd8b..7358fb7 100644
--- a/src/com/android/contacts/activities/PeopleActivity.java
+++ b/src/com/android/contacts/activities/PeopleActivity.java
@@ -37,7 +37,6 @@
 import android.provider.ContactsContract.ProviderStatus;
 import android.provider.ContactsContract.QuickContact;
 import android.support.design.widget.CoordinatorLayout;
-import android.support.design.widget.FloatingActionButton;
 import android.support.design.widget.Snackbar;
 import android.support.v13.app.FragmentPagerAdapter;
 import android.support.v4.content.LocalBroadcastManager;
@@ -59,6 +58,8 @@
 import android.widget.ImageButton;
 import android.widget.Toast;
 
+import com.android.contacts.common.model.account.AccountDisplayInfo;
+import com.android.contacts.common.model.account.AccountDisplayInfoFactory;
 import com.android.contacts.ContactSaveService;
 import com.android.contacts.ContactsDrawerActivity;
 import com.android.contacts.R;
@@ -78,7 +79,6 @@
 import com.android.contacts.common.logging.ScreenEvent.ScreenType;
 import com.android.contacts.common.model.AccountTypeManager;
 import com.android.contacts.common.model.account.AccountWithDataSet;
-import com.android.contacts.common.model.account.GoogleAccountType;
 import com.android.contacts.common.util.Constants;
 import com.android.contacts.common.util.ImplicitIntentsUtil;
 import com.android.contacts.common.widget.FloatingActionButtonController;
@@ -1441,19 +1441,24 @@
 
     public void onFabClicked() {
         final Intent intent = new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI);
-        final Bundle extras = getIntent().getExtras();
-        if (extras != null) {
-            final ContactListFilter filter = mContactListFilterController.getFilter();
-            // If we are in account view, we pass the account explicitly in order to
-            // create contact in the account. This will prevent the default account dialog
-            // from being displayed.
-            if (!isAllContactsFilter(filter) && !isDeviceContactsFilter(filter)) {
-                final Account account = new Account(filter.accountName, filter.accountType);
-                extras.putParcelable(Intents.Insert.EXTRA_ACCOUNT, account);
-                extras.putString(Intents.Insert.EXTRA_DATA_SET, filter.dataSet);
-            }
-            intent.putExtras(extras);
+        // Copy our extras into the new intent.
+        intent.putExtras(getIntent());
+
+        final ContactListFilter filter = mContactListFilterController.getFilter();
+        // If we are in account view, we pass the account explicitly in order to
+        // create contact in the account. This will prevent the default account dialog
+        // from being displayed.
+        if (!isAllContactsFilter(filter) && filter.accountName != null &&
+                filter.accountType != null) {
+            final Account account = new Account(filter.accountName, filter.accountType);
+            intent.putExtra(Intents.Insert.EXTRA_ACCOUNT, account);
+            intent.putExtra(Intents.Insert.EXTRA_DATA_SET, filter.dataSet);
+        } else if (isDeviceContactsFilter(filter)) {
+            // It's OK to add this even though it's an implicit intent. If a different app
+            // receives the intent it should just ignore the flag.
+            intent.putExtra(CompactContactEditorActivity.EXTRA_SAVE_TO_DEVICE_FLAG, true);
         }
+
         try {
             ImplicitIntentsUtil.startActivityInApp(PeopleActivity.this, intent);
         } catch (ActivityNotFoundException ex) {
@@ -1502,10 +1507,15 @@
     }
 
     private String getActionBarTitleForAccount(ContactListFilter filter) {
-        if (GoogleAccountType.ACCOUNT_TYPE.equals(filter.accountType)) {
+        final AccountDisplayInfoFactory factory =
+                AccountDisplayInfoFactory.forWritableAccounts(this);
+        final AccountDisplayInfo displayableAccount = factory.getAccountDisplayInfoFor(filter);
+        if (displayableAccount.hasGoogleAccountType()) {
             return getString(R.string.title_from_google);
+        } else {
+            return displayableAccount.withFormattedName(this, R.string.title_from_other_accounts)
+                    .getNameLabel().toString();
         }
-        return getString(R.string.title_from_other_accounts, filter.accountName);
     }
 
     // Persist filter only when it's of the type FILTER_TYPE_ALL_ACCOUNTS.
diff --git a/src/com/android/contacts/common/list/ContactListFilter.java b/src/com/android/contacts/common/list/ContactListFilter.java
index e99c374..2bae617 100644
--- a/src/com/android/contacts/common/list/ContactListFilter.java
+++ b/src/com/android/contacts/common/list/ContactListFilter.java
@@ -25,6 +25,7 @@
 import android.text.TextUtils;
 
 import com.android.contacts.common.logging.ListEvent;
+import com.android.contacts.common.model.account.AccountWithDataSet;
 
 /**
  * Contact list filter parameters.
@@ -330,6 +331,17 @@
         return uriBuilder;
     }
 
+    public AccountWithDataSet toAccountWithDataSet() {
+        if (filterType == FILTER_TYPE_ACCOUNT) {
+            return new AccountWithDataSet(accountName, accountType, dataSet);
+        } else if (filterType == FILTER_TYPE_DEVICE_CONTACTS) {
+            return AccountWithDataSet.getLocalAccount();
+        } else {
+            throw new IllegalStateException("Cannot create Account from filter type " +
+                    filterTypeToString(filterType));
+        }
+    }
+
     public String toDebugString() {
         final StringBuilder builder = new StringBuilder();
         builder.append("[filter type: " + filterType + " (" + filterTypeToString(filterType) + ")");
diff --git a/src/com/android/contacts/common/list/CustomContactListFilterActivity.java b/src/com/android/contacts/common/list/CustomContactListFilterActivity.java
index 74e8f84..4de57bb 100644
--- a/src/com/android/contacts/common/list/CustomContactListFilterActivity.java
+++ b/src/com/android/contacts/common/list/CustomContactListFilterActivity.java
@@ -56,6 +56,8 @@
 import android.widget.ExpandableListView.ExpandableListContextMenuInfo;
 import android.widget.TextView;
 
+import com.android.contacts.common.model.account.AccountDisplayInfo;
+import com.android.contacts.common.model.account.AccountDisplayInfoFactory;
 import com.android.contacts.common.R;
 import com.android.contacts.common.model.AccountTypeManager;
 import com.android.contacts.common.model.ValuesDelta;
@@ -71,6 +73,7 @@
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.Iterator;
+import java.util.List;
 
 /**
  * Shows a list of all available {@link Groups} available, letting the user
@@ -139,7 +142,11 @@
             final ContentResolver resolver = context.getContentResolver();
 
             final AccountSet accounts = new AccountSet();
-            for (AccountWithDataSet account : accountTypes.getAccounts(false)) {
+
+            final List<AccountWithDataSet> sourceAccounts = accountTypes.getAccounts(false);
+            final AccountDisplayInfoFactory displayableAccountFactory =
+                    new AccountDisplayInfoFactory(context, sourceAccounts);
+            for (AccountWithDataSet account : sourceAccounts) {
                 final AccountType accountType = accountTypes.getAccountTypeForAccount(account);
                 if (accountType.isExtension() && !account.hasData(context)) {
                     // Extension with no data -- skip.
@@ -147,7 +154,8 @@
                 }
 
                 AccountDisplay accountDisplay =
-                        new AccountDisplay(resolver, account.name, account.type, account.dataSet);
+                        new AccountDisplay(resolver, account.name, account.type, account.dataSet,
+                                displayableAccountFactory.getAccountDisplayInfo(account));
 
                 final Uri.Builder groupsUri = Groups.CONTENT_URI.buildUpon()
                         .appendQueryParameter(Groups.ACCOUNT_NAME, account.name)
@@ -466,20 +474,30 @@
         public final String mName;
         public final String mType;
         public final String mDataSet;
+        public final AccountDisplayInfo mAccountDisplayInfo;
 
         public GroupDelta mUngrouped;
         public ArrayList<GroupDelta> mSyncedGroups = Lists.newArrayList();
         public ArrayList<GroupDelta> mUnsyncedGroups = Lists.newArrayList();
 
+        public GroupDelta getGroup(int position) {
+            if (position < mSyncedGroups.size()) {
+                return mSyncedGroups.get(position);
+            }
+            position -= mSyncedGroups.size();
+            return mUnsyncedGroups.get(position);
+        }
+
         /**
          * Build an {@link AccountDisplay} covering all {@link Groups} under the
          * given {@link AccountWithDataSet}.
          */
         public AccountDisplay(ContentResolver resolver, String accountName, String accountType,
-                String dataSet) {
+                String dataSet, AccountDisplayInfo displayableInfo) {
             mName = accountName;
             mType = accountType;
             mDataSet = dataSet;
+            mAccountDisplayInfo = displayableInfo;
         }
 
         /**
@@ -593,12 +611,11 @@
 
             final AccountDisplay account = (AccountDisplay)this.getGroup(groupPosition);
 
-            final AccountType accountType = mAccountTypes.getAccountType(
-                    account.mType, account.mDataSet);
-
-            text1.setText(account.mName);
-            text1.setVisibility(account.mName == null ? View.GONE : View.VISIBLE);
-            text2.setText(accountType.getDisplayLabel(mContext));
+            text1.setText(account.mAccountDisplayInfo.getNameLabel());
+            text1.setVisibility(!account.mAccountDisplayInfo.isDeviceAccount()
+                    || account.mAccountDisplayInfo.hasDistinctName()
+                    ? View.VISIBLE : View.GONE);
+            text2.setText(account.mAccountDisplayInfo.getTypeLabel());
 
             final int textColor = mContext.getResources().getColor(isExpanded
                     ? R.color.dialtacts_theme_color
@@ -650,9 +667,10 @@
         public Object getChild(int groupPosition, int childPosition) {
             final AccountDisplay account = mAccounts.get(groupPosition);
             final boolean validChild = childPosition >= 0
-                    && childPosition < account.mSyncedGroups.size();
+                    && childPosition < account.mSyncedGroups.size()
+                    + account.mUnsyncedGroups.size();
             if (validChild) {
-                return account.mSyncedGroups.get(childPosition);
+                return account.getGroup(childPosition);
             } else {
                 return null;
             }
@@ -673,8 +691,7 @@
         public int getChildrenCount(int groupPosition) {
             // Count is any synced groups, plus possible footer
             final AccountDisplay account = mAccounts.get(groupPosition);
-            final boolean anyHidden = account.mUnsyncedGroups.size() > 0;
-            return account.mSyncedGroups.size() + (anyHidden ? 1 : 0);
+            return account.mSyncedGroups.size() + account.mUnsyncedGroups.size();
         }
 
         @Override
diff --git a/src/com/android/contacts/common/model/AccountTypeManager.java b/src/com/android/contacts/common/model/AccountTypeManager.java
index 35a7a3a..c9f68d4 100644
--- a/src/com/android/contacts/common/model/AccountTypeManager.java
+++ b/src/com/android/contacts/common/model/AccountTypeManager.java
@@ -29,6 +29,7 @@
 import android.content.SyncStatusObserver;
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
+import android.database.ContentObserver;
 import android.net.Uri;
 import android.os.AsyncTask;
 import android.os.Handler;
@@ -37,6 +38,7 @@
 import android.os.Message;
 import android.os.SystemClock;
 import android.provider.ContactsContract;
+import android.support.v4.content.ContextCompat;
 import android.text.TextUtils;
 import android.util.Log;
 import android.util.TimingLogger;
@@ -53,7 +55,7 @@
 import com.android.contacts.common.model.account.SamsungAccountType;
 import com.android.contacts.common.model.dataitem.DataKind;
 import com.android.contacts.common.util.Constants;
-import com.android.contacts.common.util.DeviceAccountFilter;
+import com.android.contacts.common.util.DeviceLocalAccountTypeFactory;
 import com.android.contactsbind.ObjectFactory;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Objects;
@@ -65,13 +67,14 @@
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.atomic.AtomicBoolean;
 
+import static com.android.contacts.common.util.DeviceLocalAccountTypeFactory.Util.isLocalAccountType;
+
 /**
  * Singleton holder for all parsed {@link AccountType} available on the
  * system, typically filled through {@link PackageManager} queries.
@@ -87,11 +90,16 @@
      * the available authenticators. This method can safely be called from the UI thread.
      */
     public static AccountTypeManager getInstance(Context context) {
+        if (!hasRequiredPermissions(context)) {
+            // Hopefully any component that depends on the values returned by this class
+            // will be restarted if the permissions change.
+            return EMPTY;
+        }
         synchronized (mInitializationLock) {
             if (mAccountTypeManager == null) {
                 context = context.getApplicationContext();
                 mAccountTypeManager = new AccountTypeManagerImpl(context,
-                        ObjectFactory.getDeviceAccountFilter(context));
+                        ObjectFactory.getDeviceLocalAccountTypeFactory(context));
             }
         }
         return mAccountTypeManager;
@@ -110,6 +118,37 @@
         }
     }
 
+    private static final AccountTypeManager EMPTY = new AccountTypeManager() {
+        @Override
+        public List<AccountWithDataSet> getAccounts(boolean contactWritableOnly) {
+            return Collections.emptyList();
+        }
+
+        @Override
+        public void sortAccounts(AccountWithDataSet defaultAccount) {
+        }
+
+        @Override
+        public List<AccountWithDataSet> getGroupWritableAccounts() {
+            return Collections.emptyList();
+        }
+
+        @Override
+        public AccountType getAccountType(AccountTypeWithDataSet accountTypeWithDataSet) {
+            return null;
+        }
+
+        @Override
+        public Map<AccountTypeWithDataSet, AccountType> getUsableInvitableAccountTypes() {
+            return null;
+        }
+
+        @Override
+        public List<AccountType> getAccountTypes(boolean contactWritableOnly) {
+            return Collections.emptyList();
+        }
+    };
+
     /**
      * Returns the list of all accounts (if contactWritableOnly is false) or just the list of
      * contact writable accounts (if contactWritableOnly is true).
@@ -183,6 +222,15 @@
         }
         return false;
     }
+
+    private static boolean hasRequiredPermissions(Context context) {
+        final boolean canGetAccounts = ContextCompat.checkSelfPermission(context,
+                android.Manifest.permission.GET_ACCOUNTS) == PackageManager.PERMISSION_GRANTED;
+        final boolean canReadContacts = ContextCompat.checkSelfPermission(context,
+                android.Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED;
+        return canGetAccounts && canReadContacts;
+    }
+
 }
 
 class AccountComparator implements Comparator<AccountWithDataSet> {
@@ -251,7 +299,7 @@
 
     private Context mContext;
     private AccountManager mAccountManager;
-    private DeviceAccountFilter mDeviceAccountFilter;
+    private DeviceLocalAccountTypeFactory mDeviceLocalAccountTypeFactory;
 
     private AccountType mFallbackAccountType;
 
@@ -306,10 +354,11 @@
     /**
      * Internal constructor that only performs initial parsing.
      */
-    public AccountTypeManagerImpl(Context context, DeviceAccountFilter deviceAccountFilter) {
+    public AccountTypeManagerImpl(Context context,
+            DeviceLocalAccountTypeFactory deviceLocalAccountTypeFactory) {
         mContext = context;
         mFallbackAccountType = new FallbackAccountType(context);
-        mDeviceAccountFilter = deviceAccountFilter;
+        mDeviceLocalAccountTypeFactory = deviceLocalAccountTypeFactory;
 
         mAccountManager = AccountManager.get(mContext);
 
@@ -351,6 +400,27 @@
 
         ContentResolver.addStatusChangeListener(ContentResolver.SYNC_OBSERVER_TYPE_SETTINGS, this);
 
+        // Observe changes to RAW_CONTACTS so that we will update the list of "Device" accounts
+        // if a new device contact is added.
+        mContext.getContentResolver().registerContentObserver(
+                ContactsContract.RawContacts.CONTENT_URI, /* notifyDescendents */ true,
+                new ContentObserver(mListenerHandler) {
+            @Override
+            public boolean deliverSelfNotifications() {
+                return true;
+            }
+
+            @Override
+            public void onChange(boolean selfChange) {
+                mListenerHandler.sendEmptyMessage(MESSAGE_LOAD_DATA);
+            }
+
+            @Override
+            public void onChange(boolean selfChange, Uri uri) {
+                mListenerHandler.sendEmptyMessage(MESSAGE_LOAD_DATA);
+            }
+        });
+
         mListenerHandler.sendEmptyMessage(MESSAGE_LOAD_DATA);
     }
 
@@ -378,6 +448,7 @@
         if (latch == null) {
             return;
         }
+
         while (true) {
             try {
                 latch.await();
@@ -443,8 +514,11 @@
             } else if (SamsungAccountType.isSamsungAccountType(mContext, type,
                     auth.packageName)) {
                 accountType = new SamsungAccountType(mContext, auth.packageName, type);
-            } else if (mDeviceAccountFilter.isDeviceAccountType(type)) {
-                accountType = new FallbackAccountType(mContext);
+            } else if (!ExternalAccountType.hasContactsXml(mContext, auth.packageName)
+                    && isLocalAccountType(mDeviceLocalAccountTypeFactory, type)) {
+                // This will be loaded by the DeviceLocalAccountLocator so don't try to create an
+                // ExternalAccountType for it.
+                continue;
             } else {
                 Log.d(TAG, "Registering external account type=" + type
                         + ", packageName=" + auth.packageName);
@@ -460,13 +534,7 @@
                 }
             }
 
-            // TODO: this is a hack. For FallbackAccountType we want to use a default icon and
-            // label instead of what is pulled out of the authenticator
-            if (!(accountType instanceof FallbackAccountType)) {
-                accountType.accountType = auth.type;
-                accountType.titleRes = auth.labelId;
-                accountType.iconRes = auth.iconId;
-            }
+            accountType.initializeFieldsFromAuthenticator(auth);
 
             addAccountType(accountType, accountTypesByTypeAndDataSet, accountTypesByType);
 
@@ -505,6 +573,7 @@
         }
         timings.addSplit("Loaded account types");
 
+        boolean foundWritableGoogleAccount = false;
         // Map in accounts to associate the account names with each account type entry.
         Account[] accounts = mAccountManager.getAccounts();
         for (Account account : accounts) {
@@ -522,6 +591,10 @@
                         allAccounts.add(accountWithDataSet);
                         if (accountType.areContactsWritable()) {
                             contactWritableAccounts.add(accountWithDataSet);
+                            if (GoogleAccountType.ACCOUNT_TYPE.equals(account.type)
+                                    && accountWithDataSet.dataSet == null) {
+                                foundWritableGoogleAccount = true;
+                            }
                         }
                         if (accountType.isGroupMembershipEditable()) {
                             groupWritableAccounts.add(accountWithDataSet);
@@ -531,6 +604,40 @@
             }
         }
 
+        final DeviceLocalAccountLocator deviceAccounts =
+                new DeviceLocalAccountLocator(mContext.getContentResolver(),
+                        mDeviceLocalAccountTypeFactory,
+                        allAccounts);
+        final List<AccountWithDataSet> localAccounts = deviceAccounts.getDeviceLocalAccounts();
+        allAccounts.addAll(localAccounts);
+
+        for (AccountWithDataSet localAccount : localAccounts) {
+            // Prefer a known type if it exists. This covers the case that a local account has an
+            // authenticator with a valid contacts.xml
+            AccountType localAccountType = accountTypesByTypeAndDataSet.get(
+                    localAccount.getAccountTypeWithDataSet());
+            if (localAccountType == null) {
+                localAccountType = mDeviceLocalAccountTypeFactory.getAccountType(localAccount.type);
+            }
+            accountTypesByTypeAndDataSet.put(localAccount.getAccountTypeWithDataSet(),
+                    localAccountType);
+
+            // Skip the null account if there is a Google account available. This is done because
+            // the Google account's sync adapter will automatically move accounts in the "null"
+            // account.  Hence, it would be confusing to still show it as an available writable
+            // account since contacts that were saved to it would magically change accounts when the
+            // sync adapter runs.
+            if (foundWritableGoogleAccount && localAccount.type == null) {
+                continue;
+            }
+            if (localAccountType.areContactsWritable()) {
+                contactWritableAccounts.add(localAccount);
+            }
+            if (localAccountType.isGroupMembershipEditable()) {
+                groupWritableAccounts.add(localAccount);
+            }
+        }
+
         final AccountComparator accountComparator = new AccountComparator(null);
         Collections.sort(allAccounts, accountComparator);
         Collections.sort(contactWritableAccounts, accountComparator);
diff --git a/src/com/android/contacts/common/model/DeviceLocalAccountLocator.java b/src/com/android/contacts/common/model/DeviceLocalAccountLocator.java
new file mode 100644
index 0000000..8997ed4
--- /dev/null
+++ b/src/com/android/contacts/common/model/DeviceLocalAccountLocator.java
@@ -0,0 +1,115 @@
+/*
+ * Copyright (C) 2016 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.common.model;
+
+import android.accounts.AccountManager;
+import android.content.ContentResolver;
+import android.database.Cursor;
+import android.provider.ContactsContract;
+import android.support.annotation.VisibleForTesting;
+
+import com.android.contacts.common.model.account.AccountType;
+import com.android.contacts.common.model.account.AccountWithDataSet;
+import com.android.contacts.common.util.DeviceLocalAccountTypeFactory;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * DeviceLocalAccountLocator attempts to create accounts for "Device" contacts by querying
+ * CP2 for records with {@link android.provider.ContactsContract.RawContacts#ACCOUNT_TYPE} columns
+ * that do not exist for any account returned by {@link AccountManager#getAccounts()}
+ *
+ * This class should be used from a background thread since it does DB queries
+ */
+public class DeviceLocalAccountLocator {
+
+    @VisibleForTesting
+    static String[] PROJECTION = new String[] {
+            ContactsContract.RawContacts.ACCOUNT_NAME, ContactsContract.RawContacts.ACCOUNT_TYPE,
+            ContactsContract.RawContacts.DATA_SET
+    };
+
+    private static final int COL_NAME = 0;
+    private static final int COL_TYPE = 1;
+    private static final int COL_DATA_SET = 2;
+
+
+    private final ContentResolver mResolver;
+    private final DeviceLocalAccountTypeFactory mAccountTypeFactory;
+    private final Set<String> mKnownAccountTypes;
+
+
+    public DeviceLocalAccountLocator(ContentResolver contentResolver,
+            DeviceLocalAccountTypeFactory factory,
+            List<AccountWithDataSet> knownAccounts) {
+        mResolver = contentResolver;
+        mAccountTypeFactory = factory;
+        mKnownAccountTypes = new HashSet<>();
+        for (AccountWithDataSet account : knownAccounts) {
+            mKnownAccountTypes.add(account.type);
+        }
+    }
+
+    public List<AccountWithDataSet> getDeviceLocalAccounts() {
+        final String[] selectionArgs = getSelectionArgs();
+        final Cursor cursor = mResolver.query(ContactsContract.RawContacts.CONTENT_URI, PROJECTION,
+                getSelection(), selectionArgs, null);
+
+        final Set<AccountWithDataSet> localAccounts = new HashSet<>();
+        try {
+            while (cursor.moveToNext()) {
+                final String name = cursor.getString(COL_NAME);
+                final String type = cursor.getString(COL_TYPE);
+                final String dataSet = cursor.getString(COL_DATA_SET);
+
+                if (DeviceLocalAccountTypeFactory.Util.isLocalAccountType(
+                        mAccountTypeFactory, type)) {
+                    localAccounts.add(new AccountWithDataSet(name, type, dataSet));
+                }
+            }
+        } finally {
+            cursor.close();
+        }
+
+        return new ArrayList<>(localAccounts);
+    }
+
+    @VisibleForTesting
+    public String getSelection() {
+        final StringBuilder sb = new StringBuilder();
+        sb.append(ContactsContract.RawContacts.DELETED).append(" =0 AND (")
+                .append(ContactsContract.RawContacts.ACCOUNT_TYPE).append(" IS NULL");
+        if (mKnownAccountTypes.isEmpty()) {
+            return sb.append(')').toString();
+        }
+        sb.append(" OR ").append(ContactsContract.RawContacts.ACCOUNT_TYPE).append(" NOT IN (");
+        for (String ignored : mKnownAccountTypes) {
+            sb.append("?,");
+        }
+        // Remove trailing ','
+        sb.deleteCharAt(sb.length() - 1).append(')').append(')');
+
+        return sb.toString();
+    }
+
+    @VisibleForTesting
+    public String[] getSelectionArgs() {
+        return mKnownAccountTypes.toArray(new String[mKnownAccountTypes.size()]);
+    }
+}
diff --git a/src/com/android/contacts/common/model/account/AccountDisplayInfo.java b/src/com/android/contacts/common/model/account/AccountDisplayInfo.java
new file mode 100644
index 0000000..f68fdd5
--- /dev/null
+++ b/src/com/android/contacts/common/model/account/AccountDisplayInfo.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2016 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.common.model.account;
+
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.support.annotation.StringRes;
+import android.text.TextUtils;
+
+/**
+ * Wrapper around AccountWithDataSet that contains user-friendly labels and an icon.
+ *
+ * The raw values for name and type in AccountWithDataSet are not always (or even usually)
+ * appropriate for direct display to the user.
+ */
+public class AccountDisplayInfo {
+    private final AccountWithDataSet mSource;
+
+    private final CharSequence mName;
+    private final CharSequence mType;
+    private final Drawable mIcon;
+
+    private final boolean mIsDeviceAccount;
+
+    public AccountDisplayInfo(AccountWithDataSet account, CharSequence name, CharSequence type,
+            Drawable icon, boolean isDeviceAccount) {
+        mSource = account;
+        mName = name;
+        mType = type;
+        mIcon = icon;
+        mIsDeviceAccount = isDeviceAccount;
+    }
+
+    public AccountWithDataSet getSource() {
+        return mSource;
+    }
+
+    public CharSequence getNameLabel() {
+        return mName;
+    }
+
+    public CharSequence getTypeLabel() {
+        return mType;
+    }
+
+    public Drawable getIcon() {
+        return mIcon;
+    }
+
+    public boolean hasGoogleAccountType() {
+        return GoogleAccountType.ACCOUNT_TYPE.equals(mSource.type);
+    }
+
+    public boolean isGoogleAccount() {
+        return GoogleAccountType.ACCOUNT_TYPE.equals(mSource.type) && mSource.dataSet == null;
+    }
+
+    public boolean isDeviceAccount() {
+        return mIsDeviceAccount;
+    }
+
+    public boolean hasDistinctName() {
+        return !TextUtils.equals(mName, mType);
+    }
+
+    public AccountDisplayInfo withName(CharSequence name) {
+        return withNameAndType(name, mType);
+    }
+
+    public AccountDisplayInfo withType(CharSequence type) {
+        return withNameAndType(mName, type);
+    }
+
+    public AccountDisplayInfo withNameAndType(CharSequence name, CharSequence type) {
+        return new AccountDisplayInfo(mSource, name, type, mIcon, mIsDeviceAccount);
+    }
+
+    public AccountDisplayInfo formatted(Context context, @StringRes int nameFormat,
+            @StringRes int typeFormat) {
+        return new AccountDisplayInfo(mSource, context.getString(nameFormat, mName),
+                context.getString(typeFormat, mType), mIcon, mIsDeviceAccount);
+    }
+
+    public AccountDisplayInfo withFormattedName(Context context, @StringRes int nameFormat) {
+        return withName(context.getString(nameFormat, mName));
+    }
+}
diff --git a/src/com/android/contacts/common/model/account/AccountDisplayInfoFactory.java b/src/com/android/contacts/common/model/account/AccountDisplayInfoFactory.java
new file mode 100644
index 0000000..aad1689
--- /dev/null
+++ b/src/com/android/contacts/common/model/account/AccountDisplayInfoFactory.java
@@ -0,0 +1,122 @@
+/*
+ * Copyright (C) 2016 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.common.model.account;
+
+import android.content.Context;
+
+import com.android.contacts.common.list.ContactListFilter;
+import com.android.contacts.common.model.AccountTypeManager;
+import com.android.contacts.common.model.RawContactDelta;
+import com.android.contacts.common.util.DeviceLocalAccountTypeFactory;
+import com.android.contactsbind.ObjectFactory;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Provides methods to get AccountDisplayInfo instances for available accounts.
+ *
+ * For most accounts the account name will be used for the label but device accounts and
+ * SIM accounts have friendly names associated with them unless there is more than one of these
+ * types of accounts present in the list.
+ */
+public class AccountDisplayInfoFactory {
+
+    private final Context mContext;
+    private final AccountTypeManager mAccountTypeManager;
+
+    private final DeviceLocalAccountTypeFactory mDeviceAccountTypeFactory;
+
+    private final int mDeviceAccountCount;
+    private final int mSimAccountCount;
+
+    public AccountDisplayInfoFactory(Context context, List<AccountWithDataSet> accounts) {
+        this(context, AccountTypeManager.getInstance(context),
+                ObjectFactory.getDeviceLocalAccountTypeFactory(context), accounts);
+    }
+
+    public AccountDisplayInfoFactory(Context context, AccountTypeManager accountTypeManager,
+            DeviceLocalAccountTypeFactory deviceAccountTypeFactory,
+            List<AccountWithDataSet> accounts) {
+        mContext = context;
+        mAccountTypeManager = accountTypeManager;
+        mDeviceAccountTypeFactory = deviceAccountTypeFactory;
+
+        mSimAccountCount = countOfType(DeviceLocalAccountTypeFactory.TYPE_SIM, accounts);
+        mDeviceAccountCount = countOfType(DeviceLocalAccountTypeFactory.TYPE_DEVICE, accounts);
+    }
+
+    public AccountDisplayInfo getAccountDisplayInfo(AccountWithDataSet account) {
+        final AccountType type = mAccountTypeManager.getAccountTypeForAccount(account);
+        final CharSequence name = shouldUseTypeLabelForName(account)
+                ? type.getDisplayLabel(mContext)
+                : account.name;
+        return new AccountDisplayInfo(account, name, type.getDisplayLabel(mContext),
+                type.getDisplayIcon(mContext),
+                DeviceLocalAccountTypeFactory.Util.isLocalAccountType(mDeviceAccountTypeFactory,
+                        type.accountType));
+    }
+
+    public AccountDisplayInfo getAccountDisplayInfoFor(ContactListFilter filter) {
+        return getAccountDisplayInfo(filter.toAccountWithDataSet());
+    }
+
+    public AccountDisplayInfo getAccountDisplayInfoFor(RawContactDelta delta) {
+        final AccountWithDataSet account = new AccountWithDataSet(delta.getAccountName(),
+                delta.getAccountType(), delta.getDataSet());
+        return getAccountDisplayInfo(account);
+    }
+
+    public static AccountDisplayInfoFactory fromListFilters(Context context,
+            List<ContactListFilter> filters) {
+        final List<AccountWithDataSet> accounts = new ArrayList<>(filters.size());
+        for (ContactListFilter filter : filters) {
+            accounts.add(filter.toAccountWithDataSet());
+        }
+        return new AccountDisplayInfoFactory(context, accounts);
+    }
+
+    public static AccountDisplayInfoFactory forAllAccounts(Context context) {
+        final AccountTypeManager accountTypeManager = AccountTypeManager.getInstance(context);
+        final List<AccountWithDataSet> accounts = accountTypeManager.getAccounts(false);
+        return new AccountDisplayInfoFactory(context, accounts);
+    }
+
+    public static AccountDisplayInfoFactory forWritableAccounts(Context context) {
+        final AccountTypeManager accountTypeManager = AccountTypeManager.getInstance(context);
+        final List<AccountWithDataSet> accounts = accountTypeManager.getAccounts(true);
+        return new AccountDisplayInfoFactory(context, accounts);
+    }
+
+    private boolean shouldUseTypeLabelForName(AccountWithDataSet account) {
+        final int type = mDeviceAccountTypeFactory.classifyAccount(account.type);
+        return (type == DeviceLocalAccountTypeFactory.TYPE_SIM && mSimAccountCount == 1)
+                || (type == DeviceLocalAccountTypeFactory.TYPE_DEVICE && mDeviceAccountCount == 1)
+                || account.name == null;
+
+    }
+
+    private int countOfType(@DeviceLocalAccountTypeFactory.LocalAccountType int type,
+            List<AccountWithDataSet> accounts) {
+        int count = 0;
+        for (AccountWithDataSet account : accounts) {
+            if (mDeviceAccountTypeFactory.classifyAccount(account.type) == type) {
+                count++;
+            }
+        }
+        return count;
+    }
+}
diff --git a/src/com/android/contacts/common/model/account/AccountType.java b/src/com/android/contacts/common/model/account/AccountType.java
index 8b50d79..0943953 100644
--- a/src/com/android/contacts/common/model/account/AccountType.java
+++ b/src/com/android/contacts/common/model/account/AccountType.java
@@ -16,6 +16,7 @@
 
 package com.android.contacts.common.model.account;
 
+import android.accounts.AuthenticatorDescription;
 import android.content.ContentValues;
 import android.content.Context;
 import android.content.pm.PackageManager;
@@ -325,6 +326,12 @@
         return this.mMimeKinds.get(mimeType);
     }
 
+    public void initializeFieldsFromAuthenticator(AuthenticatorDescription authenticator) {
+        accountType = authenticator.type;
+        titleRes = authenticator.labelId;
+        iconRes = authenticator.iconId;
+    }
+
     /**
      * Add given {@link DataKind} to list of those provided by this source.
      */
diff --git a/src/com/android/contacts/common/model/account/AccountWithDataSet.java b/src/com/android/contacts/common/model/account/AccountWithDataSet.java
index 5947647..887cdd4 100644
--- a/src/com/android/contacts/common/model/account/AccountWithDataSet.java
+++ b/src/com/android/contacts/common/model/account/AccountWithDataSet.java
@@ -77,6 +77,8 @@
         mAccountTypeWithDataSet = AccountTypeWithDataSet.get(type, dataSet);
     }
 
+    // TODO: consider modifying or deleting this method. "local" accounts on some non-nexus devices
+    // have non-null values for name, type, and dataset
     public boolean isLocalAccount() {
         return name == null && type == null && dataSet == null;
     }
diff --git a/src/com/android/contacts/common/model/account/DeviceLocalAccountType.java b/src/com/android/contacts/common/model/account/DeviceLocalAccountType.java
new file mode 100644
index 0000000..31452e6
--- /dev/null
+++ b/src/com/android/contacts/common/model/account/DeviceLocalAccountType.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2016 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.common.model.account;
+
+import android.content.Context;
+
+public class DeviceLocalAccountType extends FallbackAccountType {
+
+    private final boolean mGroupsEditable;
+
+    public DeviceLocalAccountType(Context context, boolean groupsEditable) {
+        super(context);
+        mGroupsEditable = groupsEditable;
+    }
+
+    public DeviceLocalAccountType(Context context) {
+        this(context, false);
+    }
+
+    @Override
+    public boolean isGroupMembershipEditable() {
+        return mGroupsEditable;
+    }
+}
diff --git a/src/com/android/contacts/common/model/account/FallbackAccountType.java b/src/com/android/contacts/common/model/account/FallbackAccountType.java
index 8a7b964..7c6d17c 100644
--- a/src/com/android/contacts/common/model/account/FallbackAccountType.java
+++ b/src/com/android/contacts/common/model/account/FallbackAccountType.java
@@ -16,6 +16,7 @@
 
 package com.android.contacts.common.model.account;
 
+import android.accounts.AuthenticatorDescription;
 import android.content.Context;
 import android.util.Log;
 
@@ -71,6 +72,12 @@
     }
 
     @Override
+    public void initializeFieldsFromAuthenticator(AuthenticatorDescription authenticator) {
+        // Do nothing. For "Device" accounts we want to just display them using our own strings
+        // and icons.
+    }
+
+    @Override
     public boolean areContactsWritable() {
         return true;
     }
diff --git a/src/com/android/contacts/common/model/account/SimAccountType.java b/src/com/android/contacts/common/model/account/SimAccountType.java
new file mode 100644
index 0000000..a2219cc
--- /dev/null
+++ b/src/com/android/contacts/common/model/account/SimAccountType.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2016 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.common.model.account;
+
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+
+import com.android.contacts.R;
+
+/**
+ * Account type for SIM card contacts
+ *
+ * TODO: Right now this is the same as FallbackAccountType with a different icon and label.
+ * Instead it should setup it's own DataKinds that are known to work on SIM card.
+ */
+public class SimAccountType extends FallbackAccountType {
+
+    public SimAccountType(Context context) {
+        super(context);
+        this.titleRes = R.string.account_sim;
+        this.iconRes = R.drawable.ic_sim_card_tinted_24dp;
+
+    }
+
+    @Override
+    public boolean isGroupMembershipEditable() {
+        return false;
+    }
+}
diff --git a/src/com/android/contacts/common/preference/ContactsPreferences.java b/src/com/android/contacts/common/preference/ContactsPreferences.java
index a8a9089..f994d28 100644
--- a/src/com/android/contacts/common/preference/ContactsPreferences.java
+++ b/src/com/android/contacts/common/preference/ContactsPreferences.java
@@ -88,7 +88,7 @@
     private final Context mContext;
     private int mSortOrder = PREFERENCE_UNASSIGNED;
     private int mDisplayOrder = PREFERENCE_UNASSIGNED;
-    private String mDefaultAccount = null;
+    private AccountWithDataSet mDefaultAccount = null;
     private ChangeListener mListener = null;
     private Handler mHandler;
     private final SharedPreferences mPreferences;
@@ -169,26 +169,24 @@
         return mContext.getResources().getBoolean(R.bool.config_default_account_user_changeable);
     }
 
-    public String getDefaultAccount() {
+    public AccountWithDataSet getDefaultAccount() {
         if (!isDefaultAccountUserChangeable()) {
             return mDefaultAccount;
         }
-        if (TextUtils.isEmpty(mDefaultAccount)) {
+        if (mDefaultAccount == null) {
             final String accountString = mPreferences
-                    .getString(mDefaultAccountKey, mDefaultAccount);
+                    .getString(mDefaultAccountKey, null);
             if (!TextUtils.isEmpty(accountString)) {
-                final AccountWithDataSet accountWithDataSet = AccountWithDataSet.unstringify(
-                        accountString);
-                mDefaultAccount = accountWithDataSet.name;
+                mDefaultAccount = AccountWithDataSet.unstringify(accountString);
             }
         }
         return mDefaultAccount;
     }
 
     public void setDefaultAccount(AccountWithDataSet accountWithDataSet) {
-        mDefaultAccount = accountWithDataSet == null ? null : accountWithDataSet.name;
+        mDefaultAccount = accountWithDataSet;
         final Editor editor = mPreferences.edit();
-        if (TextUtils.isEmpty(mDefaultAccount)) {
+        if (mDefaultAccount == null) {
             editor.remove(mDefaultAccountKey);
         } else {
             editor.putString(mDefaultAccountKey, accountWithDataSet.stringify());
diff --git a/src/com/android/contacts/common/preference/DefaultAccountPreference.java b/src/com/android/contacts/common/preference/DefaultAccountPreference.java
index 2fc5c7b..3960e62 100644
--- a/src/com/android/contacts/common/preference/DefaultAccountPreference.java
+++ b/src/com/android/contacts/common/preference/DefaultAccountPreference.java
@@ -18,23 +18,20 @@
 
 import android.app.AlertDialog;
 import android.content.Context;
-import android.preference.ListPreference;
+import android.content.DialogInterface;
+import android.preference.DialogPreference;
 import android.util.AttributeSet;
 import android.view.View;
 
-import com.android.contacts.common.model.AccountTypeManager;
-import com.android.contacts.common.model.account.AccountType;
-import com.android.contacts.common.model.account.AccountTypeWithDataSet;
+import com.android.contacts.common.model.account.AccountDisplayInfoFactory;
 import com.android.contacts.common.model.account.AccountWithDataSet;
+import com.android.contacts.common.util.AccountsListAdapter;
 
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-public class DefaultAccountPreference extends ListPreference {
+public class DefaultAccountPreference extends DialogPreference {
     private ContactsPreferences mPreferences;
-    private Map<String, AccountWithDataSet> mAccountMap;
+    private AccountsListAdapter mListAdapter;
+    private AccountDisplayInfoFactory mAccountDisplayInfoFactory;
+    private int mChosenIndex = -1;
 
     public DefaultAccountPreference(Context context) {
         super(context);
@@ -54,24 +51,9 @@
 
     private void prepare() {
         mPreferences = new ContactsPreferences(getContext());
-        mAccountMap = new HashMap<>();
-        final AccountTypeManager accountTypeManager = AccountTypeManager.getInstance(getContext());
-        List<AccountWithDataSet> accounts = accountTypeManager.getAccounts(true);
-        for (AccountWithDataSet account : accounts) {
-            mAccountMap.put(account.name, account);
-        }
-        final Set<String> accountNames = mAccountMap.keySet();
-        final String[] accountNamesArray = accountNames.toArray(new String[accountNames.size()]);
-        setEntries(accountNamesArray);
-        setEntryValues(accountNamesArray);
-        final String defaultAccount = String.valueOf(mPreferences.getDefaultAccount());
-        if (accounts.size() == 1) {
-            setValue(accounts.get(0).name);
-        } else if (accountNames.contains(defaultAccount)) {
-            setValue(defaultAccount);
-        } else {
-            setValue(null);
-        }
+        mListAdapter = new AccountsListAdapter(getContext(),
+                AccountsListAdapter.AccountListFilter.ACCOUNTS_CONTACT_WRITABLE);
+        mAccountDisplayInfoFactory = AccountDisplayInfoFactory.forWritableAccounts(getContext());
     }
 
     @Override
@@ -81,26 +63,40 @@
 
     @Override
     public CharSequence getSummary() {
-        return mPreferences.getDefaultAccount();
+        final AccountWithDataSet defaultAccount = mPreferences.getDefaultAccount();
+        return defaultAccount == null ? null : mAccountDisplayInfoFactory
+                .getAccountDisplayInfo(defaultAccount).getNameLabel();
     }
 
     @Override
-    protected boolean persistString(String value) {
-        if (value == null && mPreferences.getDefaultAccount() == null) {
-            return true;
-        }
-        if (value == null || mPreferences.getDefaultAccount() == null
-                || !value.equals(mPreferences.getDefaultAccount())) {
-            mPreferences.setDefaultAccount(mAccountMap.get(value));
-            notifyChanged();
-        }
-        return true;
-    }
-
-    @Override
-    // UX recommendation is not to show cancel button on such lists.
     protected void onPrepareDialogBuilder(AlertDialog.Builder builder) {
         super.onPrepareDialogBuilder(builder);
+        // UX recommendation is not to show buttons on such lists.
         builder.setNegativeButton(null, null);
+        builder.setPositiveButton(null, null);
+        builder.setAdapter(mListAdapter, new DialogInterface.OnClickListener() {
+            @Override
+            public void onClick(DialogInterface dialog, int which) {
+                mChosenIndex = which;
+            }
+        });
+    }
+
+    @Override
+    protected void onDialogClosed(boolean positiveResult) {
+        final AccountWithDataSet currentDefault = mPreferences.getDefaultAccount();
+
+        if (mChosenIndex == -1) {
+            if (currentDefault != null) {
+                mPreferences.setDefaultAccount(null);
+                notifyChanged();
+            }
+        } else {
+            final AccountWithDataSet chosenAccount = mListAdapter.getItem(mChosenIndex);
+            if (!chosenAccount.equals(currentDefault)) {
+                mPreferences.setDefaultAccount(chosenAccount);
+                notifyChanged();
+            }
+        }
     }
 }
diff --git a/src/com/android/contacts/common/util/AccountsListAdapter.java b/src/com/android/contacts/common/util/AccountsListAdapter.java
index ef43a30..a437929 100644
--- a/src/com/android/contacts/common/util/AccountsListAdapter.java
+++ b/src/com/android/contacts/common/util/AccountsListAdapter.java
@@ -17,7 +17,6 @@
 package com.android.contacts.common.util;
 
 import android.content.Context;
-import android.text.TextUtils.TruncateAt;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -25,9 +24,10 @@
 import android.widget.ImageView;
 import android.widget.TextView;
 
+import com.android.contacts.common.model.account.AccountDisplayInfo;
+import com.android.contacts.common.model.account.AccountDisplayInfoFactory;
 import com.android.contacts.common.R;
 import com.android.contacts.common.model.AccountTypeManager;
-import com.android.contacts.common.model.account.AccountType;
 import com.android.contacts.common.model.account.AccountWithDataSet;
 
 import java.util.ArrayList;
@@ -38,8 +38,7 @@
  */
 public final class AccountsListAdapter extends BaseAdapter {
     private final LayoutInflater mInflater;
-    private final List<AccountWithDataSet> mAccounts;
-    private final AccountTypeManager mAccountTypes;
+    private final List<AccountDisplayInfo> mAccountDisplayInfoList;
     private final Context mContext;
     private int mCustomLayout = -1;
 
@@ -63,22 +62,29 @@
     public AccountsListAdapter(Context context, AccountListFilter accountListFilter,
             AccountWithDataSet currentAccount) {
         mContext = context;
-        mAccountTypes = AccountTypeManager.getInstance(context);
-        mAccounts = getAccounts(accountListFilter);
+        final List<AccountWithDataSet> accounts = getAccounts(accountListFilter);
         if (currentAccount != null
-                && !mAccounts.isEmpty()
-                && !mAccounts.get(0).equals(currentAccount)
-                && mAccounts.remove(currentAccount)) {
-            mAccounts.add(0, currentAccount);
+                && !accounts.isEmpty()
+                && !accounts.get(0).equals(currentAccount)
+                && accounts.remove(currentAccount)) {
+            accounts.add(0, currentAccount);
+        }
+
+        final AccountDisplayInfoFactory factory = new AccountDisplayInfoFactory(context,
+                accounts);
+        mAccountDisplayInfoList = new ArrayList<>(accounts.size());
+        for (AccountWithDataSet account : accounts) {
+            mAccountDisplayInfoList.add(factory.getAccountDisplayInfo(account));
         }
         mInflater = LayoutInflater.from(context);
     }
 
     private List<AccountWithDataSet> getAccounts(AccountListFilter accountListFilter) {
+        final AccountTypeManager typeManager = AccountTypeManager.getInstance(mContext);
         if (accountListFilter == AccountListFilter.ACCOUNTS_GROUP_WRITABLE) {
-            return new ArrayList<AccountWithDataSet>(mAccountTypes.getGroupWritableAccounts());
+            return new ArrayList<AccountWithDataSet>(typeManager.getGroupWritableAccounts());
         }
-        return new ArrayList<AccountWithDataSet>(mAccountTypes.getAccounts(
+        return new ArrayList<AccountWithDataSet>(typeManager.getAccounts(
                 accountListFilter == AccountListFilter.ACCOUNTS_CONTACT_WRITABLE));
     }
 
@@ -96,25 +102,22 @@
         final TextView text2 = (TextView) resultView.findViewById(android.R.id.text2);
         final ImageView icon = (ImageView) resultView.findViewById(android.R.id.icon);
 
-        final AccountWithDataSet account = mAccounts.get(position);
-        final AccountType accountType = mAccountTypes.getAccountType(account.type, account.dataSet);
+        text1.setText(mAccountDisplayInfoList.get(position).getTypeLabel());
+        text2.setText(mAccountDisplayInfoList.get(position).getNameLabel());
 
-        text1.setText(accountType.getDisplayLabel(mContext));
-        text2.setText(account.name);
-
-        icon.setImageDrawable(accountType.getDisplayIcon(mContext));
+        icon.setImageDrawable(mAccountDisplayInfoList.get(position).getIcon());
 
         return resultView;
     }
 
     @Override
     public int getCount() {
-        return mAccounts.size();
+        return mAccountDisplayInfoList.size();
     }
 
     @Override
     public AccountWithDataSet getItem(int position) {
-        return mAccounts.get(position);
+        return mAccountDisplayInfoList.get(position).getSource();
     }
 
     @Override
diff --git a/src/com/android/contacts/common/util/DeviceAccountFilter.java b/src/com/android/contacts/common/util/DeviceAccountFilter.java
deleted file mode 100644
index 9dc98a5..0000000
--- a/src/com/android/contacts/common/util/DeviceAccountFilter.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (C) 2016 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.common.util;
-
-/**
- * Reports whether a value from RawContacts.ACCOUNT_TYPE should be considered a "Device"
- * account
- */
-public interface DeviceAccountFilter {
-    boolean isDeviceAccountType(String accountType);
-
-    public static DeviceAccountFilter ONLY_NULL = new DeviceAccountFilter() {
-        @Override
-        public boolean isDeviceAccountType(String accountType) {
-            return accountType == null;
-        }
-    };
-}
diff --git a/src/com/android/contacts/common/util/DeviceAccountPresentationValues.java b/src/com/android/contacts/common/util/DeviceAccountPresentationValues.java
deleted file mode 100644
index dab81ed..0000000
--- a/src/com/android/contacts/common/util/DeviceAccountPresentationValues.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright (C) 2016 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.common.util;
-
-import android.content.Context;
-import android.graphics.drawable.Drawable;
-
-import com.android.contacts.common.list.ContactListFilter;
-
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Supplies the label and icon that should be used for device accounts in the Nav Drawer.
- *
- * This operates on the list of filters to allow the implementation to choose better resources
- * in the case that there are multiple device accounts in the filter list.
- */
-public interface DeviceAccountPresentationValues {
-    void setFilters(List<ContactListFilter> filters);
-
-    CharSequence getLabel(int index);
-
-    Drawable getIcon(int index);
-
-    /**
-     * The default implementation only returns a label and icon for a device filter that as null
-     * values for the accountType and accountName
-     */
-    class Default implements DeviceAccountPresentationValues {
-        private final Context mContext;
-
-        private List<ContactListFilter> mFilters = null;
-
-        public Default(Context context) {
-            mContext = context;
-        }
-
-        @Override
-        public CharSequence getLabel(int index) {
-            assertFiltersInitialized();
-
-            final ContactListFilter filter = mFilters.get(index);
-            if (filter.filterType != ContactListFilter.FILTER_TYPE_DEVICE_CONTACTS) {
-                return filter.accountName;
-            }
-            return filter.accountName != null ? filter.accountName :
-                    mContext.getString(com.android.contacts.common.R.string.account_phone);
-        }
-
-        @Override
-        public Drawable getIcon(int index) {
-            assertFiltersInitialized();
-
-            final ContactListFilter filter = mFilters.get(index);
-            if (filter.filterType != ContactListFilter.FILTER_TYPE_DEVICE_CONTACTS) {
-                return filter.icon;
-            }
-            return mContext.getDrawable(com.android.contacts.common.R.drawable.ic_device);
-        }
-
-        @Override
-        public void setFilters(List<ContactListFilter> filters) {
-            if (filters == null) {
-                mFilters = Collections.emptyList();
-            } else {
-                mFilters = filters;
-            }
-        }
-
-        private void assertFiltersInitialized() {
-            if (mFilters == null) {
-                throw new IllegalStateException("setFilters must be called first.");
-            }
-        }
-    }
-
-}
diff --git a/src/com/android/contacts/common/util/DeviceLocalAccountTypeFactory.java b/src/com/android/contacts/common/util/DeviceLocalAccountTypeFactory.java
new file mode 100644
index 0000000..040a6b4
--- /dev/null
+++ b/src/com/android/contacts/common/util/DeviceLocalAccountTypeFactory.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2016 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.common.util;
+
+import android.content.Context;
+import android.support.annotation.IntDef;
+
+import com.android.contacts.common.model.account.AccountType;
+import com.android.contacts.common.model.account.DeviceLocalAccountType;
+import com.android.contacts.common.model.account.FallbackAccountType;
+
+import java.lang.annotation.Retention;
+
+import static java.lang.annotation.RetentionPolicy.SOURCE;
+
+/**
+ * Reports whether a value from RawContacts.ACCOUNT_TYPE should be considered a "Device"
+ * account
+ */
+public interface DeviceLocalAccountTypeFactory {
+
+    @Retention(SOURCE)
+    @IntDef({TYPE_OTHER, TYPE_DEVICE, TYPE_SIM})
+    @interface LocalAccountType {}
+    static final int TYPE_OTHER = 0;
+    static final int TYPE_DEVICE = 1;
+    static final int TYPE_SIM = 2;
+
+    @DeviceLocalAccountTypeFactory.LocalAccountType int classifyAccount(String accountType);
+
+    AccountType getAccountType(String accountType);
+
+    class Util {
+        private Util() { }
+
+        public static boolean isLocalAccountType(@LocalAccountType int type) {
+            return type == TYPE_SIM || type == TYPE_DEVICE;
+        }
+
+        public static boolean isLocalAccountType(DeviceLocalAccountTypeFactory factory,
+                String type) {
+
+            return isLocalAccountType(factory.classifyAccount(type));
+        }
+    }
+
+    class Default implements DeviceLocalAccountTypeFactory {
+        private Context mContext;
+
+        public Default(Context context) {
+            mContext = context;
+        }
+
+        @Override
+        public int classifyAccount(String accountType) {
+            return accountType == null ? TYPE_DEVICE : TYPE_OTHER;
+        }
+
+        @Override
+        public AccountType getAccountType(String accountType) {
+            if (accountType != null) {
+                throw new IllegalArgumentException(accountType + " is not a device account type.");
+            }
+            return new DeviceLocalAccountType(mContext);
+        }
+    }
+}
diff --git a/src/com/android/contacts/common/util/DeviceLocalContactsFilterProvider.java b/src/com/android/contacts/common/util/DeviceLocalContactsFilterProvider.java
deleted file mode 100644
index 1d06a43..0000000
--- a/src/com/android/contacts/common/util/DeviceLocalContactsFilterProvider.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * Copyright (C) 2016 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.common.util;
-
-import android.accounts.Account;
-import android.accounts.AccountManager;
-import android.app.LoaderManager;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.content.CursorLoader;
-import android.content.Loader;
-import android.database.Cursor;
-import android.net.Uri;
-import android.os.Bundle;
-import android.provider.ContactsContract;
-import android.support.annotation.Keep;
-import android.support.annotation.VisibleForTesting;
-
-import com.android.contacts.common.list.ContactListFilter;
-import com.android.contacts.test.NeededForReflection;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * Get filters for device local accounts. These are "accounts" that have contacts associated
- * with them but are not returned by AccountManager. Any other account will be displayed
- * automatically so we don't worry about it.
- */
-public class DeviceLocalContactsFilterProvider
-        implements LoaderManager.LoaderCallbacks<Cursor> {
-
-    public static String[] PROJECTION = new String[] {
-            ContactsContract.RawContacts.ACCOUNT_NAME, ContactsContract.RawContacts.ACCOUNT_TYPE
-    };
-
-    private static final int COL_NAME = 0;
-    private static final int COL_TYPE = 1;
-
-    private final Context mContext;
-    private final DeviceAccountFilter mAccountTypeFilter;
-
-    private String[] mKnownAccountTypes;
-
-    private List<ContactListFilter> mDeviceFilters = Collections.emptyList();
-
-    public DeviceLocalContactsFilterProvider(Context context,
-            DeviceAccountFilter accountTypeFilter) {
-        mContext = context;
-        mAccountTypeFilter = accountTypeFilter;
-    }
-
-    private ContactListFilter createFilterForAccount(Account account) {
-        return new ContactListFilter(ContactListFilter.FILTER_TYPE_DEVICE_CONTACTS,
-                account.type, account.name, null, null);
-    }
-
-    public List<ContactListFilter> getListFilters() {
-        return mDeviceFilters;
-    }
-
-    @Override
-    public CursorLoader onCreateLoader(int i, Bundle bundle) {
-        if (mKnownAccountTypes == null) {
-            initKnownAccountTypes();
-        }
-        return new CursorLoader(mContext, getUri(), PROJECTION, getSelection(),
-                getSelectionArgs(), null);
-    }
-
-
-    private List<ContactListFilter> createFiltersFromResults(Cursor cursor) {
-        final Set<Account> accounts = new HashSet<>();
-        boolean hasNullType = false;
-
-        while (cursor.moveToNext()) {
-            final String name = cursor.getString(COL_NAME);
-            final String type = cursor.getString(COL_TYPE);
-            // The case where where only one of the columns is null isn't handled specifically.
-            if (mAccountTypeFilter.isDeviceAccountType(type)) {
-                if (name != null && type != null) {
-                    accounts.add(new Account(name, type));
-                } else {
-                    hasNullType = true;
-                }
-            }
-        }
-
-        final List<ContactListFilter> result = new ArrayList<>(accounts.size());
-        if (hasNullType) {
-            result.add(new ContactListFilter(ContactListFilter.FILTER_TYPE_DEVICE_CONTACTS,
-                    null, null, null, null));
-        }
-        for (Account account : accounts) {
-            result.add(createFilterForAccount(account));
-        }
-        return result;
-    }
-
-    @Override
-    public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
-        if (cursor == null) return;
-        mDeviceFilters = createFiltersFromResults(cursor);
-    }
-
-    @Override
-    public void onLoaderReset(Loader<Cursor> loader) {
-    }
-
-    @Keep
-    @VisibleForTesting
-    public void setKnownAccountTypes(String... accountTypes) {
-        mKnownAccountTypes = accountTypes;
-    }
-
-    private void initKnownAccountTypes() {
-        final AccountManager accountManager = (AccountManager) mContext
-                .getSystemService(Context.ACCOUNT_SERVICE);
-        final Set<String> knownTypes = new HashSet<>();
-        final Account[] accounts = accountManager.getAccounts();
-        for (Account account : accounts) {
-            if (ContentResolver.getIsSyncable(account, ContactsContract.AUTHORITY) > 0) {
-                knownTypes.add(account.type);
-            }
-        }
-        mKnownAccountTypes = knownTypes.toArray(new String[knownTypes.size()]);
-    }
-
-    private Uri getUri() {
-        final Uri.Builder builder = ContactsContract.RawContacts.CONTENT_URI.buildUpon();
-        if (mKnownAccountTypes == null || mKnownAccountTypes.length == 0) {
-            builder.appendQueryParameter(ContactsContract.LIMIT_PARAM_KEY, "1");
-        }
-        return builder.build();
-    }
-
-    private String getSelection() {
-        final StringBuilder sb = new StringBuilder();
-        sb.append(ContactsContract.RawContacts.DELETED).append(" =0 AND (")
-                .append(ContactsContract.RawContacts.ACCOUNT_TYPE).append(" IS NULL");
-        if (mKnownAccountTypes == null || mKnownAccountTypes.length == 0) {
-            return sb.append(')').toString();
-        }
-        sb.append(" OR ").append(ContactsContract.RawContacts.ACCOUNT_TYPE).append(" NOT IN (");
-        for (String ignored : mKnownAccountTypes) {
-            sb.append("?,");
-        }
-        // Remove trailing ','
-        sb.deleteCharAt(sb.length() - 1).append(')').append(')');
-
-        return sb.toString();
-    }
-
-    private String[] getSelectionArgs() {
-        return mKnownAccountTypes;
-    }
-}
diff --git a/src/com/android/contacts/editor/BaseRawContactEditorView.java b/src/com/android/contacts/editor/BaseRawContactEditorView.java
index e99af61..fc1e8a1 100644
--- a/src/com/android/contacts/editor/BaseRawContactEditorView.java
+++ b/src/com/android/contacts/editor/BaseRawContactEditorView.java
@@ -80,7 +80,7 @@
         mPhoto.setEnabled(isEnabled());
 
         mAccountHeaderContainer = findViewById(R.id.account_header_container);
-        mExpandAccountButton = (ImageView) findViewById(R.id.expand_account_button);
+        mExpandAccountButton = (ImageView) findViewById(R.id.account_expander_icon);
         mCollapsibleSection = (LinearLayout) findViewById(R.id.collapsable_section);
         mAccountName = (TextView) findViewById(R.id.account_name);
         mAccountType = (TextView) findViewById(R.id.account_type);
diff --git a/src/com/android/contacts/editor/CompactRawContactsEditorView.java b/src/com/android/contacts/editor/CompactRawContactsEditorView.java
index ece3829..884cc51 100644
--- a/src/com/android/contacts/editor/CompactRawContactsEditorView.java
+++ b/src/com/android/contacts/editor/CompactRawContactsEditorView.java
@@ -16,6 +16,8 @@
 
 package com.android.contacts.editor;
 
+import com.android.contacts.common.model.account.AccountDisplayInfo;
+import com.android.contacts.common.model.account.AccountDisplayInfoFactory;
 import com.android.contacts.R;
 import com.android.contacts.common.model.AccountTypeManager;
 import com.android.contacts.common.model.RawContactDelta;
@@ -319,6 +321,7 @@
     private CompactRawContactsEditorView.Listener mListener;
 
     private AccountTypeManager mAccountTypeManager;
+    private AccountDisplayInfoFactory mAccountDisplayInfoFactory;
     private LayoutInflater mLayoutInflater;
 
     private ViewIdGenerator mViewIdGenerator;
@@ -334,12 +337,7 @@
     private TextView mAccountHeaderType;
     private TextView mAccountHeaderName;
     private ImageView mAccountHeaderIcon;
-
-    // Account selector
-    private View mAccountSelectorContainer;
-    private View mAccountSelector;
-    private TextView mAccountSelectorType;
-    private TextView mAccountSelectorName;
+    private ImageView mAccountHeaderExpanderIcon;
 
     // Raw contacts selector
     private View mRawContactContainer;
@@ -377,20 +375,16 @@
         super.onFinishInflate();
 
         mAccountTypeManager = AccountTypeManager.getInstance(getContext());
+        mAccountDisplayInfoFactory = AccountDisplayInfoFactory.forWritableAccounts(getContext());
         mLayoutInflater = (LayoutInflater)
                 getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
 
         // Account header
-        mAccountHeaderContainer = findViewById(R.id.account_container);
+        mAccountHeaderContainer = findViewById(R.id.account_header_container);
         mAccountHeaderType = (TextView) findViewById(R.id.account_type);
         mAccountHeaderName = (TextView) findViewById(R.id.account_name);
         mAccountHeaderIcon = (ImageView) findViewById(R.id.account_type_icon);
-
-        // Account selector
-        mAccountSelectorContainer = findViewById(R.id.account_selector_container);
-        mAccountSelector = findViewById(R.id.account);
-        mAccountSelectorType = (TextView) findViewById(R.id.account_type_selector);
-        mAccountSelectorName = (TextView) findViewById(R.id.account_name_selector);
+        mAccountHeaderExpanderIcon = (ImageView) findViewById(R.id.account_expander_icon);
 
         // Raw contacts selector
         mRawContactContainer = findViewById(R.id.all_rawcontacts_accounts_container);
@@ -731,33 +725,31 @@
 
     private void addAccountInfo(RawContactDeltaList rawContactDeltas) {
         mAccountHeaderContainer.setVisibility(View.GONE);
-        mAccountSelectorContainer.setVisibility(View.GONE);
         mRawContactContainer.setVisibility(View.GONE);
 
         if (mPrimaryNameKindSectionData == null) return;
         final RawContactDelta rawContactDelta =
                 mPrimaryNameKindSectionData.first.getRawContactDelta();
 
+        final AccountDisplayInfo account =
+                mAccountDisplayInfoFactory.getAccountDisplayInfoFor(rawContactDelta);
+
         // Get the account information for the primary raw contact delta
-        final Pair<String,String> accountInfo = mIsUserProfile
-                ? EditorUiUtils.getLocalAccountInfo(getContext(),
-                        rawContactDelta.getAccountName(),
-                        rawContactDelta.getAccountType(mAccountTypeManager))
-                : EditorUiUtils.getAccountInfo(getContext(),
-                        rawContactDelta.getAccountName(),
-                        rawContactDelta.getAccountType(mAccountTypeManager));
+        final String accountLabel = mIsUserProfile
+                ? EditorUiUtils.getAccountHeaderLabelForMyProfile(getContext(), account)
+                : account.getNameLabel().toString();
 
         // Either the account header or selector should be shown, not both.
         final List<AccountWithDataSet> accounts =
                 AccountTypeManager.getInstance(getContext()).getAccounts(true);
         if (mHasNewContact && !mIsUserProfile) {
             if (accounts.size() > 1) {
-                addAccountSelector(accountInfo, rawContactDelta);
+                addAccountSelector(rawContactDelta, accountLabel);
             } else {
-                addAccountHeader(accountInfo);
+                addAccountHeader(accountLabel);
             }
         } else if (mIsUserProfile || !shouldHideAccountContainer(rawContactDeltas)) {
-            addAccountHeader(accountInfo);
+            addAccountHeader(accountLabel);
         }
 
         // The raw contact selector should only display linked raw contacts that can be edited in
@@ -811,14 +803,12 @@
         return (writable > 1 || (writable > 0 && readonly > 0));
     }
 
-    private void addAccountHeader(Pair<String,String> accountInfo) {
+    private void addAccountHeader(String accountLabel) {
         mAccountHeaderContainer.setVisibility(View.VISIBLE);
 
         // Set the account name
-        final String accountName = TextUtils.isEmpty(accountInfo.first)
-                ? accountInfo.second : accountInfo.first;
         mAccountHeaderName.setVisibility(View.VISIBLE);
-        mAccountHeaderName.setText(accountName);
+        mAccountHeaderName.setText(accountLabel);
 
         // Set the account type
         final String selectorTitle = getResources().getString(
@@ -838,29 +828,16 @@
 
         // Set the content description
         mAccountHeaderContainer.setContentDescription(
-                EditorUiUtils.getAccountInfoContentDescription(accountName, selectorTitle));
+                EditorUiUtils.getAccountInfoContentDescription(accountLabel,
+                        selectorTitle));
     }
 
-    private void addAccountSelector(Pair<String,String> accountInfo,
-            final RawContactDelta rawContactDelta) {
-        mAccountSelectorContainer.setVisibility(View.VISIBLE);
-
-        if (TextUtils.isEmpty(accountInfo.first)) {
-            // Hide this view so the other text view will be centered vertically
-            mAccountSelectorName.setVisibility(View.GONE);
-        } else {
-            mAccountSelectorName.setVisibility(View.VISIBLE);
-            mAccountSelectorName.setText(accountInfo.first);
-        }
-
-        final String selectorTitle = getResources().getString(
-                R.string.compact_editor_account_selector_title);
-        mAccountSelectorType.setText(selectorTitle);
-
-        mAccountSelectorContainer.setContentDescription(getResources().getString(
-                R.string.compact_editor_account_selector_description, accountInfo.first));
-
-        mAccountSelectorContainer.setOnClickListener(new View.OnClickListener() {
+    private void addAccountSelector(final RawContactDelta rawContactDelta, CharSequence nameLabel) {
+        // Show save to default account.
+        addAccountHeader(nameLabel.toString());
+        // Add handlers for choosing another account to save to.
+        mAccountHeaderExpanderIcon.setVisibility(View.VISIBLE);
+        mAccountHeaderContainer.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
                 final ListPopupWindow popup = new ListPopupWindow(getContext(), null);
@@ -868,8 +845,8 @@
                         new AccountsListAdapter(getContext(),
                                 AccountsListAdapter.AccountListFilter.ACCOUNTS_CONTACT_WRITABLE,
                                 mPrimaryAccount);
-                popup.setWidth(mAccountSelectorContainer.getWidth());
-                popup.setAnchorView(mAccountSelectorContainer);
+                popup.setWidth(mAccountHeaderContainer.getWidth());
+                popup.setAnchorView(mAccountHeaderContainer);
                 popup.setAdapter(adapter);
                 popup.setModal(true);
                 popup.setInputMethodMode(ListPopupWindow.INPUT_METHOD_NOT_NEEDED);
diff --git a/src/com/android/contacts/editor/ContactEditorBaseFragment.java b/src/com/android/contacts/editor/ContactEditorBaseFragment.java
index d8045cf..05f6c47 100644
--- a/src/com/android/contacts/editor/ContactEditorBaseFragment.java
+++ b/src/com/android/contacts/editor/ContactEditorBaseFragment.java
@@ -58,6 +58,7 @@
 import com.android.contacts.ContactSaveService;
 import com.android.contacts.GroupMetaDataLoader;
 import com.android.contacts.R;
+import com.android.contacts.activities.CompactContactEditorActivity;
 import com.android.contacts.activities.ContactEditorAccountsChangedActivity;
 import com.android.contacts.activities.ContactEditorBaseActivity;
 import com.android.contacts.activities.ContactEditorBaseActivity.ContactEditor;
@@ -580,6 +581,9 @@
                 mHasNewContact = true;
                 if (mAccountWithDataSet != null) {
                     createContact(mAccountWithDataSet);
+                } else if (mIntentExtras != null && mIntentExtras.getBoolean(
+                        ContactEditorBaseActivity.EXTRA_SAVE_TO_DEVICE_FLAG, false)) {
+                    createContact(null);
                 } else {
                     // No Account specified. Let the user choose
                     // Load Accounts async so that we can present them
diff --git a/src/com/android/contacts/editor/ContactEditorUtils.java b/src/com/android/contacts/editor/ContactEditorUtils.java
index 1b0da05..b976456 100644
--- a/src/com/android/contacts/editor/ContactEditorUtils.java
+++ b/src/com/android/contacts/editor/ContactEditorUtils.java
@@ -113,18 +113,13 @@
      *
      * This should be called when saving a newly created contact.
      *
-     * @param defaultAccount the account used to save a newly created contact.  Or pass {@code null}
-     *     If the user selected "local only".
+     * @param defaultAccount the account used to save a newly created contact.
      */
     public void saveDefaultAndAllAccounts(AccountWithDataSet defaultAccount) {
         final SharedPreferences.Editor editor = mPrefs.edit()
                 .putBoolean(mAnythingSavedKey, true);
 
-        if (defaultAccount == null || defaultAccount.isLocalAccount()) {
-            // If the default is "local only", there should be no writable accounts.
-            // This should always be the case with our spec, but because we load the account list
-            // asynchronously using a worker thread, it is possible that there are accounts at this
-            // point. So if the default is null always clear the account list.
+        if (defaultAccount == null) {
             editor.remove(KEY_KNOWN_ACCOUNTS);
             editor.remove(mDefaultAccountKey);
         } else {
@@ -212,7 +207,9 @@
         final List<AccountWithDataSet> currentWritableAccounts = getWritableAccounts();
 
         if (currentWritableAccounts.size() == 1) {
-            return false;
+            // TODO: This will only work for devices that use a null device account but it should
+            // probably should notify for other OEM device account types as well.
+            return isFirstLaunch() && currentWritableAccounts.get(0).isLocalAccount();
         }
 
         if (isFirstLaunch()) {
@@ -226,12 +223,10 @@
             return true;
         }
 
-        // If there is an inconsistent state in the preferences file - default account is null
-        // ("local" account) while there are multiple accounts, then show the notification dialog.
-        // This shouldn't ever happen, but this should allow the user can get back into a normal
-        // state after they respond to the notification.
-        if ((defaultAccount == null || defaultAccount.isLocalAccount())
-                && currentWritableAccounts.size() > 0) {
+        // If there is an inconsistent state in the preferences file then show the notification
+        // dialog. This shouldn't ever happen, but this should allow the user can get back into a
+        // normal state after they respond to the notification.
+        if (defaultAccount == null) {
             Log.e(TAG, "Preferences file in an inconsistent state, request that the default account"
                     + " and current writable accounts be saved again");
             return true;
diff --git a/src/com/android/contacts/editor/EditorUiUtils.java b/src/com/android/contacts/editor/EditorUiUtils.java
index 8772cbb..89d830b 100644
--- a/src/com/android/contacts/editor/EditorUiUtils.java
+++ b/src/com/android/contacts/editor/EditorUiUtils.java
@@ -16,15 +16,14 @@
 
 package com.android.contacts.editor;
 
-import static android.provider.ContactsContract.CommonDataKinds.GroupMembership;
-import static android.provider.ContactsContract.CommonDataKinds.StructuredName;
-import static com.android.contacts.common.util.MaterialColorMapUtils.getDefaultPrimaryAndSecondaryColors;
-
 import android.content.Context;
 import android.content.res.Resources;
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
 import android.graphics.drawable.Drawable;
+import android.media.RingtoneManager;
+import android.net.Uri;
+import android.os.Build;
 import android.provider.ContactsContract.CommonDataKinds.Email;
 import android.provider.ContactsContract.CommonDataKinds.Event;
 import android.provider.ContactsContract.CommonDataKinds.Im;
@@ -36,11 +35,7 @@
 import android.provider.ContactsContract.CommonDataKinds.SipAddress;
 import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
 import android.provider.ContactsContract.CommonDataKinds.Website;
-import android.media.RingtoneManager;
-import android.net.Uri;
-import android.os.Build;
 import android.text.TextUtils;
-import android.util.Pair;
 import android.widget.ImageView;
 
 import com.android.contacts.R;
@@ -49,18 +44,20 @@
 import com.android.contacts.common.ContactPhotoManager.DefaultImageRequest;
 import com.android.contacts.common.ContactsUtils;
 import com.android.contacts.common.model.ValuesDelta;
-import com.android.contacts.common.model.account.AccountType;
-import com.android.contacts.common.model.account.GoogleAccountType;
 import com.android.contacts.common.model.dataitem.DataKind;
 import com.android.contacts.common.util.MaterialColorMapUtils.MaterialPalette;
+import com.android.contacts.common.model.account.AccountDisplayInfo;
 import com.android.contacts.util.ContactPhotoUtils;
 import com.android.contacts.widget.QuickContactImageView;
-
 import com.google.common.collect.Maps;
 
 import java.io.FileNotFoundException;
 import java.util.HashMap;
 
+import static android.provider.ContactsContract.CommonDataKinds.GroupMembership;
+import static android.provider.ContactsContract.CommonDataKinds.StructuredName;
+import static com.android.contacts.common.util.MaterialColorMapUtils.getDefaultPrimaryAndSecondaryColors;
+
 /**
  * Utility methods for creating contact editor.
  */
@@ -111,52 +108,34 @@
         return id;
     }
 
-    /**
-     * Returns the account name and account type labels to display for local accounts.
-     */
-    public static Pair<String,String> getLocalAccountInfo(Context context,
-            String accountName, AccountType accountType) {
-        if (TextUtils.isEmpty(accountName)) {
-            return new Pair<>(
-                    /* accountName =*/ null,
-                    context.getString(R.string.local_profile_title));
+
+    public static String getAccountHeaderLabelForMyProfile(Context context,
+            AccountDisplayInfo displayableAccount) {
+        if (displayableAccount.isDeviceAccount()) {
+            return context.getString(R.string.local_profile_title);
+        } else {
+            return context.getString(R.string.external_profile_title,
+                    displayableAccount.getTypeLabel());
         }
-        return new Pair<>(
-                accountName,
-                context.getString(R.string.external_profile_title,
-                        accountType.getDisplayLabel(context)));
     }
 
-    /**
-     * Returns the account name and account type labels to display for the given account type.
-     */
-    public static Pair<String,String> getAccountInfo(Context context, String accountName,
-            AccountType accountType) {
-        CharSequence accountTypeDisplayLabel = accountType.getDisplayLabel(context);
-        if (TextUtils.isEmpty(accountTypeDisplayLabel)
-                || TextUtils.equals(
-                        context.getString(R.string.account_phone), accountTypeDisplayLabel)) {
-            accountTypeDisplayLabel = context.getString(R.string.account_phone);
-        } else if (GoogleAccountType.ACCOUNT_TYPE.equals(accountType.accountType)
-                && accountType.dataSet == null){
-            accountTypeDisplayLabel = context.getString(R.string.google_account_type_format,
-                    accountTypeDisplayLabel);
+    public static String getAccountTypeHeaderLabel(Context context, AccountDisplayInfo
+            displayableAccount)  {
+        if (displayableAccount.isDeviceAccount()) {
+            // Do nothing. Type label should be "Device"
+            return displayableAccount.getTypeLabel().toString();
+        } else if (displayableAccount.isGoogleAccount()) {
+            return context.getString(R.string.google_account_type_format,
+                    displayableAccount.getTypeLabel());
         } else {
-            accountTypeDisplayLabel = context.getString(R.string.account_type_format,
-                    accountTypeDisplayLabel);
+            return context.getString(R.string.account_type_format,
+                    displayableAccount.getTypeLabel());
         }
-
-        if (TextUtils.isEmpty(accountName)) {
-            return new Pair<>(/* accountName */ null, accountTypeDisplayLabel.toString());
-        }
-
-        return new Pair<>(context.getString(R.string.from_account_format, accountName),
-                accountTypeDisplayLabel.toString());
     }
 
     /**
      * Returns a content description String for the container of the account information
-     * returned by {@link #getAccountInfo}.
+     * returned by {@link #getAccountTypeHeaderLabel(Context, AccountDisplayInfo)}.
      */
     public static String getAccountInfoContentDescription(CharSequence accountName,
             CharSequence accountType) {
diff --git a/src/com/android/contacts/editor/RawContactEditorView.java b/src/com/android/contacts/editor/RawContactEditorView.java
index 5a4c9db..6d8c5ad 100644
--- a/src/com/android/contacts/editor/RawContactEditorView.java
+++ b/src/com/android/contacts/editor/RawContactEditorView.java
@@ -27,7 +27,6 @@
 import android.provider.ContactsContract.Contacts;
 import android.provider.ContactsContract.Data;
 import android.util.AttributeSet;
-import android.util.Pair;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -35,6 +34,8 @@
 import android.widget.LinearLayout;
 import android.widget.TextView;
 
+import com.android.contacts.common.model.account.AccountDisplayInfo;
+import com.android.contacts.common.model.account.AccountDisplayInfoFactory;
 import com.android.contacts.GroupMetaDataLoader;
 import com.android.contacts.R;
 import com.android.contacts.common.model.account.AccountType;
@@ -72,11 +73,6 @@
 
     private ViewGroup mFields;
 
-    private View mAccountSelector;
-    private TextView mAccountSelectorTypeTextView;
-    private TextView mAccountSelectorNameTextView;
-
-    private View mAccountHeader;
     private TextView mAccountHeaderTypeTextView;
     private TextView mAccountHeaderNameTextView;
     private ImageView mAccountIconImageView;
@@ -87,6 +83,8 @@
     private DataKind mGroupMembershipKind;
     private RawContactDelta mState;
 
+    private AccountDisplayInfoFactory mAccountDisplayInfoFactory;
+
     public RawContactEditorView(Context context) {
         super(context);
     }
@@ -140,24 +138,11 @@
 
         mFields = (ViewGroup)findViewById(R.id.sect_fields);
 
-        mAccountHeader = findViewById(R.id.account_header_container);
         mAccountHeaderTypeTextView = (TextView) findViewById(R.id.account_type);
         mAccountHeaderNameTextView = (TextView) findViewById(R.id.account_name);
-        mAccountIconImageView = (ImageView) findViewById(android.R.id.icon);
+        mAccountIconImageView = (ImageView) findViewById(R.id.account_type_icon);
 
-        // The same header is used by both full editor and read-only editor view. The header is
-        // left-aligned with read-only editor view but is not aligned well with full editor. So we
-        // need to shift the text in the header a little bit for full editor.
-        LinearLayout accountInfoView = (LinearLayout) findViewById(R.id.account_info);
-        final int topBottomPaddingDp = (int) getResources().getDimension(R.dimen
-                .editor_account_header_expandable_top_bottom_padding);
-        final int leftPaddingDp = (int) getResources().getDimension(R.dimen
-                .editor_account_header_expandable_left_padding);
-        accountInfoView.setPadding(leftPaddingDp, topBottomPaddingDp, 0, topBottomPaddingDp);
-
-        mAccountSelector = findViewById(R.id.account_selector_container);
-        mAccountSelectorTypeTextView = (TextView) findViewById(R.id.account_type_selector);
-        mAccountSelectorNameTextView = (TextView) findViewById(R.id.account_name_selector);
+        mAccountDisplayInfoFactory = AccountDisplayInfoFactory.forAllAccounts(getContext());
     }
 
     @Override
@@ -202,30 +187,30 @@
 
         mRawContactId = state.getRawContactId();
 
-        // Fill in the account info
-        final Pair<String,String> accountInfo = isProfile
-                ? EditorUiUtils.getLocalAccountInfo(getContext(), state.getAccountName(), type)
-                : EditorUiUtils.getAccountInfo(getContext(), state.getAccountName(), type);
-        if (accountInfo.first == null) {
-            // Hide this view so the other text view will be centered vertically
+        final AccountDisplayInfo account = mAccountDisplayInfoFactory
+                .getAccountDisplayInfoFor(state);
+
+        final String accountTypeLabel;
+        final String accountNameLabel;
+        if (isProfile) {
+            accountTypeLabel = EditorUiUtils.getAccountHeaderLabelForMyProfile(
+                    getContext(), account);
+            accountNameLabel = account.getNameLabel().toString();
+        } else {
+            accountTypeLabel = account.getTypeLabel().toString();
+            accountNameLabel = account.getNameLabel().toString();
+        }
+
+        if (!account.hasDistinctName()) {
+            // Hide this view so the other view will be centered vertically
             mAccountHeaderNameTextView.setVisibility(View.GONE);
         } else {
             mAccountHeaderNameTextView.setVisibility(View.VISIBLE);
-            mAccountHeaderNameTextView.setText(accountInfo.first);
+            mAccountHeaderNameTextView.setText(accountNameLabel);
         }
-        mAccountHeaderTypeTextView.setText(accountInfo.second);
+        mAccountHeaderTypeTextView.setText(accountTypeLabel);
         updateAccountHeaderContentDescription();
 
-        // The account selector and header are both used to display the same information.
-        mAccountSelectorTypeTextView.setText(mAccountHeaderTypeTextView.getText());
-        mAccountSelectorTypeTextView.setVisibility(mAccountHeaderTypeTextView.getVisibility());
-        mAccountSelectorNameTextView.setText(mAccountHeaderNameTextView.getText());
-        mAccountSelectorNameTextView.setVisibility(mAccountHeaderNameTextView.getVisibility());
-        // Showing the account header at the same time as the account selector drop down is
-        // confusing. They should be mutually exclusive.
-        mAccountHeader.setVisibility(mAccountSelector.getVisibility() == View.GONE
-                ? View.VISIBLE : View.GONE);
-
         mAccountIconImageView.setImageDrawable(state.getRawContactAccountType(getContext())
                 .getDisplayIcon(getContext()));
 
diff --git a/src/com/android/contacts/editor/RawContactReadOnlyEditorView.java b/src/com/android/contacts/editor/RawContactReadOnlyEditorView.java
index 6e4c055..d55403b 100644
--- a/src/com/android/contacts/editor/RawContactReadOnlyEditorView.java
+++ b/src/com/android/contacts/editor/RawContactReadOnlyEditorView.java
@@ -27,7 +27,6 @@
 import android.provider.ContactsContract.RawContacts;
 import android.text.TextUtils;
 import android.util.AttributeSet;
-import android.util.Pair;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.View.OnClickListener;
@@ -36,6 +35,8 @@
 import android.widget.ImageView;
 import android.widget.TextView;
 
+import com.android.contacts.common.model.account.AccountDisplayInfo;
+import com.android.contacts.common.model.account.AccountDisplayInfoFactory;
 import com.android.contacts.R;
 import com.android.contacts.common.GeoUtil;
 import com.android.contacts.common.compat.PhoneNumberUtilsCompat;
@@ -55,6 +56,8 @@
         implements OnClickListener {
     private LayoutInflater mInflater;
 
+    private AccountDisplayInfoFactory mAccountDisplayInfoFactory;
+
     private TextView mName;
     private Button mEditExternallyButton;
     private ViewGroup mGeneral;
@@ -92,7 +95,9 @@
 
         mAccountHeaderTypeTextView = (TextView) findViewById(R.id.account_type);
         mAccountHeaderNameTextView = (TextView) findViewById(R.id.account_name);
-        mAccountIconImageView = (ImageView) findViewById(android.R.id.icon);
+        mAccountIconImageView = (ImageView) findViewById(R.id.account_type_icon);
+
+        mAccountDisplayInfoFactory = AccountDisplayInfoFactory.forAllAccounts(getContext());
     }
 
     /**
@@ -117,17 +122,29 @@
         mAccountType = state.getAccountType();
         mDataSet = state.getDataSet();
 
-        final Pair<String,String> accountInfo = isProfile
-                ? EditorUiUtils.getLocalAccountInfo(getContext(), state.getAccountName(), type)
-                : EditorUiUtils.getAccountInfo(getContext(), state.getAccountName(), type);
-        if (accountInfo.first == null) {
-            // Hide this view so the other text view will be centered vertically
+
+        final AccountDisplayInfo account = mAccountDisplayInfoFactory
+                .getAccountDisplayInfoFor(state);
+
+        final String accountTypeLabel;
+        final String accountNameLabel;
+        if (isProfile) {
+            accountTypeLabel = EditorUiUtils.getAccountHeaderLabelForMyProfile(
+                    getContext(), account);
+            accountNameLabel = account.getNameLabel().toString();
+        } else {
+            accountTypeLabel = account.getTypeLabel().toString();
+            accountNameLabel = account.getNameLabel().toString();
+        }
+
+        if (!account.hasDistinctName()) {
+            // Hide this view so the other view will be centered vertically
             mAccountHeaderNameTextView.setVisibility(View.GONE);
         } else {
             mAccountHeaderNameTextView.setVisibility(View.VISIBLE);
-            mAccountHeaderNameTextView.setText(accountInfo.first);
+            mAccountHeaderNameTextView.setText(accountNameLabel);
         }
-        mAccountHeaderTypeTextView.setText(accountInfo.second);
+        mAccountHeaderTypeTextView.setText(accountTypeLabel);
         updateAccountHeaderContentDescription();
 
         mAccountIconImageView.setImageDrawable(state.getRawContactAccountType(getContext())
diff --git a/src/com/android/contacts/group/GroupNameEditDialogFragment.java b/src/com/android/contacts/group/GroupNameEditDialogFragment.java
index 36a4710..544dd87 100644
--- a/src/com/android/contacts/group/GroupNameEditDialogFragment.java
+++ b/src/com/android/contacts/group/GroupNameEditDialogFragment.java
@@ -245,8 +245,7 @@
         final String callbackAction = getArguments().getString(ARG_CALLBACK_ACTION);
         final Intent serviceIntent;
         if (mIsInsert) {
-            serviceIntent = ContactSaveService.createNewGroupIntent(getActivity(),
-                    new AccountWithDataSet(mAccount.name, mAccount.type, mAccount.dataSet),
+            serviceIntent = ContactSaveService.createNewGroupIntent(getActivity(), mAccount,
                     name, null, getActivity().getClass(), callbackAction);
         } else {
             serviceIntent = ContactSaveService.createGroupRenameIntent(getActivity(), mGroupId,
diff --git a/src/com/android/contacts/interactions/AccountFiltersFragment.java b/src/com/android/contacts/interactions/AccountFiltersFragment.java
index b2b21f7..8d92327 100644
--- a/src/com/android/contacts/interactions/AccountFiltersFragment.java
+++ b/src/com/android/contacts/interactions/AccountFiltersFragment.java
@@ -19,16 +19,11 @@
 import android.app.Fragment;
 import android.app.LoaderManager;
 import android.content.Loader;
-import android.database.Cursor;
 import android.os.Bundle;
 
 import com.android.contacts.common.list.ContactListFilter;
 import com.android.contacts.common.util.AccountFilterUtil;
-import com.android.contacts.common.util.DeviceLocalContactsFilterProvider;
-import com.android.contactsbind.ObjectFactory;
 
-import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 
 /**
@@ -37,7 +32,6 @@
 public class AccountFiltersFragment extends Fragment {
 
     private static final int LOADER_FILTERS = 1;
-    private static final int LOADER_DEVICE_LOCAL_CONTACTS = 3;
 
     /**
      * Callbacks for hosts of the {@link AccountFiltersFragment}.
@@ -50,8 +44,6 @@
         void onFiltersLoaded(List<ContactListFilter> accountFilterItems);
     }
 
-    private LoaderManager.LoaderCallbacks<Cursor> mDeviceLocalLoaderListener;
-
     private final LoaderManager.LoaderCallbacks<List<ContactListFilter>> mFiltersLoaderListener =
             new LoaderManager.LoaderCallbacks<List<ContactListFilter>> () {
                 @Override
@@ -62,43 +54,25 @@
                 @Override
                 public void onLoadFinished(
                         Loader<List<ContactListFilter>> loader, List<ContactListFilter> data) {
-                    if (data == null) {
-                        mLoadedFilters = Collections.emptyList();
-                    } else {
-                        mLoadedFilters = data;
+                    if (mListener != null && data != null) {
+                        mListener.onFiltersLoaded(data);
                     }
-                    notifyWithCurrentFilters();
                 }
 
                 public void onLoaderReset(Loader<List<ContactListFilter>> loader) {
                 }
             };
 
-
-    private List<ContactListFilter> mLoadedFilters = null;
-    private List<ContactListFilter> mDeviceLocalFilters = null;
     private AccountFiltersListener mListener;
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-
-        mDeviceLocalLoaderListener = new DeviceLocalContactsFilterProvider(getActivity(),
-                ObjectFactory.getDeviceAccountFilter(getActivity())) {
-            @Override
-            public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
-                super.onLoadFinished(loader, data);
-                mDeviceLocalFilters = getListFilters();
-                notifyWithCurrentFilters();
-            }
-        };
     }
 
     @Override
     public void onStart() {
         getLoaderManager().initLoader(LOADER_FILTERS, null, mFiltersLoaderListener);
-        getLoaderManager().initLoader(LOADER_DEVICE_LOCAL_CONTACTS, null,
-                mDeviceLocalLoaderListener);
 
         super.onStart();
     }
@@ -106,12 +80,4 @@
     public void setListener(AccountFiltersListener listener) {
         mListener = listener;
     }
-
-    private void notifyWithCurrentFilters() {
-        if (mListener == null || mLoadedFilters == null || mDeviceLocalFilters == null) return;
-
-        final List<ContactListFilter> result = new ArrayList<>(mLoadedFilters);
-        result.addAll(mDeviceLocalFilters);
-        mListener.onFiltersLoaded(result);
-    }
 }
diff --git a/src/com/android/contacts/list/ContactBrowseListFragment.java b/src/com/android/contacts/list/ContactBrowseListFragment.java
index 2060068..752201b 100644
--- a/src/com/android/contacts/list/ContactBrowseListFragment.java
+++ b/src/com/android/contacts/list/ContactBrowseListFragment.java
@@ -415,8 +415,7 @@
             }
         }
 
-        adapter.setIncludeFavorites(!searchMode
-                && mFilter.filterType == ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS);
+        adapter.setIncludeFavorites(!searchMode && mFilter.isContactsFilterType());
     }
 
     @Override
diff --git a/src/com/android/contacts/quickcontact/ExpandingEntryCardView.java b/src/com/android/contacts/quickcontact/ExpandingEntryCardView.java
index da017cc..018f468 100644
--- a/src/com/android/contacts/quickcontact/ExpandingEntryCardView.java
+++ b/src/com/android/contacts/quickcontact/ExpandingEntryCardView.java
@@ -244,8 +244,6 @@
     private View mExpandCollapseButton;
     private TextView mExpandCollapseTextView;
     private TextView mTitleTextView;
-    private CharSequence mExpandButtonText;
-    private CharSequence mCollapseButtonText;
     private OnClickListener mOnClickListener;
     private OnCreateContextMenuListener mOnCreateContextMenuListener;
     private boolean mIsExpanded = false;
@@ -263,11 +261,6 @@
     private final ImageView mExpandCollapseArrow;
     private int mThemeColor;
     private ColorFilter mThemeColorFilter;
-    /**
-     * Whether to prioritize the first entry type. If prioritized, we should show at least two
-     * of this entry type.
-     */
-    private boolean mShowFirstEntryTypeTwice;
     private boolean mIsAlwaysExpanded;
     /** The ViewGroup to run the expand/collapse animation on */
     private ViewGroup mAnimationViewGroup;
@@ -319,22 +312,14 @@
         mBadgeIds = new ArrayList<Integer>();
     }
 
-    public void initialize(List<List<Entry>> entries, int numInitialVisibleEntries,
-            boolean isExpanded, boolean isAlwaysExpanded, ExpandingEntryCardViewListener listener,
-            ViewGroup animationViewGroup) {
-        initialize(entries, numInitialVisibleEntries, isExpanded, isAlwaysExpanded,
-                listener, animationViewGroup, /* showFirstEntryTypeTwice = */ false);
-    }
-
     /**
      * Sets the Entry list to display.
      *
      * @param entries The Entry list to display.
      */
     public void initialize(List<List<Entry>> entries, int numInitialVisibleEntries,
-            boolean isExpanded, boolean isAlwaysExpanded,
-            ExpandingEntryCardViewListener listener, ViewGroup animationViewGroup,
-            boolean showFirstEntryTypeTwice) {
+            boolean isExpanded, boolean isAlwaysExpanded, ExpandingEntryCardViewListener listener,
+            ViewGroup animationViewGroup) {
         LayoutInflater layoutInflater = LayoutInflater.from(getContext());
         mIsExpanded = isExpanded;
         mIsAlwaysExpanded = isAlwaysExpanded;
@@ -344,7 +329,6 @@
         mEntries = entries;
         mNumEntries = 0;
         mAllEntriesInflated = false;
-        mShowFirstEntryTypeTwice = showFirstEntryTypeTwice;
         for (List<Entry> entryList : mEntries) {
             mNumEntries += entryList.size();
             mEntryViews.add(new ArrayList<View>());
@@ -368,30 +352,6 @@
         applyColor();
     }
 
-    /**
-     * Sets the text for the expand button.
-     *
-     * @param expandButtonText The expand button text.
-     */
-    public void setExpandButtonText(CharSequence expandButtonText) {
-        mExpandButtonText = expandButtonText;
-        if (mExpandCollapseTextView != null && !mIsExpanded) {
-            mExpandCollapseTextView.setText(expandButtonText);
-        }
-    }
-
-    /**
-     * Sets the text for the expand button.
-     *
-     * @param expandButtonText The expand button text.
-     */
-    public void setCollapseButtonText(CharSequence expandButtonText) {
-        mCollapseButtonText = expandButtonText;
-        if (mExpandCollapseTextView != null && mIsExpanded) {
-            mExpandCollapseTextView.setText(mCollapseButtonText);
-        }
-    }
-
     @Override
     public void setOnClickListener(OnClickListener listener) {
         mOnClickListener = listener;
@@ -468,19 +428,9 @@
                 viewsToDisplay.add(entryViewList.get(0));
                 numInViewGroup++;
 
-                int indexInEntryViewList = 1;
-                if (mShowFirstEntryTypeTwice && i == 0 && entryViewList.size() > 1) {
-                    viewsToDisplay.add(entryViewList.get(1));
-                    numInViewGroup++;
-                    extraEntries--;
-                    indexInEntryViewList++;
-                }
-
                 // Insert entries in this list to hit mCollapsedEntriesCount.
-                for (int j = indexInEntryViewList;
-                        j < entryViewList.size() && numInViewGroup < mCollapsedEntriesCount &&
-                        extraEntries > 0;
-                        j++) {
+                for (int j = 1; j < entryViewList.size() && numInViewGroup < mCollapsedEntriesCount
+                        && extraEntries > 0; j++) {
                     viewsToDisplay.add(entryViewList.get(j));
                     numInViewGroup++;
                     extraEntries--;
@@ -532,21 +482,13 @@
     }
 
     private CharSequence getExpandButtonText() {
-        if (!TextUtils.isEmpty(mExpandButtonText)) {
-            return mExpandButtonText;
-        } else {
-            // Default to "See more".
-            return getResources().getText(R.string.expanding_entry_card_view_see_more);
-        }
+        // Default to "See more".
+        return getResources().getText(R.string.expanding_entry_card_view_see_more);
     }
 
     private CharSequence getCollapseButtonText() {
-        if (!TextUtils.isEmpty(mCollapseButtonText)) {
-            return mCollapseButtonText;
-        } else {
-            // Default to "See less".
-            return getResources().getText(R.string.expanding_entry_card_view_see_less);
-        }
+        // Default to "See less".
+        return getResources().getText(R.string.expanding_entry_card_view_see_less);
     }
 
     /**
@@ -569,18 +511,8 @@
                         /* showIcon = */ View.VISIBLE));
                 numInflated++;
 
-                int indexInEntryViewList = 1;
-                if (mShowFirstEntryTypeTwice && i == 0 && entryList.size() > 1) {
-                    entryViewList.add(createEntryView(layoutInflater, entryList.get(1),
-                        /* showIcon = */ View.INVISIBLE));
-                    numInflated++;
-                    extraEntries--;
-                    indexInEntryViewList++;
-                }
-
                 // Inflate entries in this list to hit mCollapsedEntriesCount.
-                for (int j = indexInEntryViewList; j < entryList.size()
-                        && numInflated < mCollapsedEntriesCount
+                for (int j = 1; j < entryList.size() && numInflated < mCollapsedEntriesCount
                         && extraEntries > 0; j++) {
                     entryViewList.add(createEntryView(layoutInflater, entryList.get(j),
                             /* showIcon = */ View.INVISIBLE));
@@ -851,10 +783,7 @@
             mBadgeContainer.removeAllViews();
         } else {
             int numberOfMimeTypesShown = mCollapsedEntriesCount;
-            if (mShowFirstEntryTypeTwice && mEntries.size() > 0
-                    && mEntries.get(0).size() > 1) {
-                numberOfMimeTypesShown--;
-            }
+
             // Inflate badges if not yet created
             if (mBadges.size() < mEntries.size() - numberOfMimeTypesShown) {
                 for (int i = numberOfMimeTypesShown; i < mEntries.size(); i++) {
diff --git a/src/com/android/contacts/quickcontact/QuickContactActivity.java b/src/com/android/contacts/quickcontact/QuickContactActivity.java
index 8d888d3..40bcd55 100644
--- a/src/com/android/contacts/quickcontact/QuickContactActivity.java
+++ b/src/com/android/contacts/quickcontact/QuickContactActivity.java
@@ -1106,8 +1106,6 @@
         mPermissionExplanationCard.setOnClickListener(mEntryClickHandler);
         mNoContactDetailsCard.setOnClickListener(mEntryClickHandler);
         mContactCard.setOnClickListener(mEntryClickHandler);
-        mContactCard.setExpandButtonText(
-        getResources().getString(R.string.expanding_entry_card_view_see_all));
         mContactCard.setOnCreateContextMenuListener(mEntryContextMenuListener);
 
         mRecentCard.setOnClickListener(mEntryClickHandler);
@@ -1593,17 +1591,12 @@
         final String customAboutCardName = cp2DataCardModel.customAboutCardName;
 
         if (contactCardEntries.size() > 0) {
-            final boolean firstEntriesArePrioritizedMimeType =
-                    !TextUtils.isEmpty(mExtraPrioritizedMimeType) &&
-                    mCachedCp2DataCardModel.dataItemsMap.containsKey(mExtraPrioritizedMimeType) &&
-                    mCachedCp2DataCardModel.dataItemsMap.get(mExtraPrioritizedMimeType).size() != 0;
             mContactCard.initialize(contactCardEntries,
                     /* numInitialVisibleEntries = */ MIN_NUM_CONTACT_ENTRIES_SHOWN,
                     /* isExpanded = */ mContactCard.isExpanded(),
-                    /* isAlwaysExpanded = */ false,
+                    /* isAlwaysExpanded = */ true,
                     mExpandingEntryCardViewListener,
-                    mScroller,
-                    firstEntriesArePrioritizedMimeType);
+                    mScroller);
             if (mContactCard.getVisibility() == View.GONE && mShouldLog) {
                 Logger.logQuickContactEvent(mReferrer, mContactType, CardType.CONTACT,
                         ActionType.UNKNOWN_ACTION, /* thirdPartyAction */ null);
diff --git a/tests/src/com/android/contacts/common/model/AccountWithDataSetTest.java b/tests/src/com/android/contacts/common/model/AccountWithDataSetTest.java
index e28f09e..7bfb922 100644
--- a/tests/src/com/android/contacts/common/model/AccountWithDataSetTest.java
+++ b/tests/src/com/android/contacts/common/model/AccountWithDataSetTest.java
@@ -58,6 +58,14 @@
         MoreAsserts.assertNotEqual(a3, a2r);
     }
 
+    public void testStringifyAndUnstringifyLocalAccount() {
+        final String stringified = AccountWithDataSet.getLocalAccount().stringify();
+
+        final AccountWithDataSet restored = AccountWithDataSet.unstringify(stringified);
+
+        assertEquals(AccountWithDataSet.getLocalAccount(), restored);
+    }
+
     public void testStringifyListAndUnstringify() {
         AccountWithDataSet a1 = new AccountWithDataSet("name1", "typeA", null);
         AccountWithDataSet a2 = new AccountWithDataSet("name2", "typeB", null);
diff --git a/tests/src/com/android/contacts/common/model/DeviceLocalAccountLocatorTests.java b/tests/src/com/android/contacts/common/model/DeviceLocalAccountLocatorTests.java
new file mode 100644
index 0000000..e03c3e5
--- /dev/null
+++ b/tests/src/com/android/contacts/common/model/DeviceLocalAccountLocatorTests.java
@@ -0,0 +1,162 @@
+/*
+ * Copyright (C) 2016 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.common.model;
+
+import android.content.ContentResolver;
+import android.database.Cursor;
+import android.database.MatrixCursor;
+import android.net.Uri;
+import android.os.CancellationSignal;
+import android.provider.ContactsContract;
+import android.provider.ContactsContract.RawContacts;
+import android.support.annotation.Nullable;
+import android.test.AndroidTestCase;
+import android.test.mock.MockContentResolver;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import com.android.contacts.common.model.DeviceLocalAccountLocator;
+import com.android.contacts.common.model.account.AccountWithDataSet;
+import com.android.contacts.common.test.mocks.MockContentProvider;
+import com.android.contacts.common.util.DeviceLocalAccountTypeFactory;
+import com.android.contacts.tests.FakeDeviceAccountTypeFactory;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+@SmallTest
+public class DeviceLocalAccountLocatorTests extends AndroidTestCase {
+
+    // Basic smoke test that just checks that it doesn't throw when loading from CP2. We don't
+    // care what CP2 actually contains for this.
+    public void testShouldNotCrash() {
+        final DeviceLocalAccountLocator sut = new DeviceLocalAccountLocator(
+                getContext().getContentResolver(),
+                new DeviceLocalAccountTypeFactory.Default(getContext()),
+                Collections.<AccountWithDataSet>emptyList());
+        sut.getDeviceLocalAccounts();
+        // We didn't throw so it passed
+    }
+
+    public void test_getDeviceLocalAccounts_returnsEmptyListWhenNoRawContactsHaveDeviceType() {
+        final DeviceLocalAccountLocator sut = createWithQueryResult(queryResult(
+                        "user", "com.example",
+                        "user", "com.example",
+                        "user", "com.example"));
+        assertTrue(sut.getDeviceLocalAccounts().isEmpty());
+    }
+
+    public void test_getDeviceLocalAccounts_returnsListWithItemForNullAccount() {
+        final DeviceLocalAccountLocator sut = createWithQueryResult(queryResult(
+                "user", "com.example",
+                null, null,
+                "user", "com.example",
+                null, null));
+
+        assertEquals(1, sut.getDeviceLocalAccounts().size());
+    }
+
+    public void test_getDeviceLocalAccounts_containsItemForEachDeviceAccount() {
+        final DeviceLocalAccountTypeFactory stubFactory = new FakeDeviceAccountTypeFactory()
+                .withDeviceTypes(null, "vnd.sec.contact.phone")
+                .withSimTypes("vnd.sec.contact.sim");
+        final DeviceLocalAccountLocator sut = new DeviceLocalAccountLocator(
+                createStubResolverWithContentQueryResult(queryResult(
+                        "user", "com.example",
+                        "user", "com.example",
+                        "phone_account", "vnd.sec.contact.phone",
+                        null, null,
+                        "phone_account", "vnd.sec.contact.phone",
+                        "user", "com.example",
+                        null, null,
+                        "sim_account", "vnd.sec.contact.sim",
+                        "sim_account_2", "vnd.sec.contact.sim"
+                )), stubFactory,
+                Collections.<AccountWithDataSet>emptyList());
+
+        assertEquals(4, sut.getDeviceLocalAccounts().size());
+    }
+
+    public void test_getDeviceLocalAccounts_doesNotContainItemsForKnownAccounts() {
+        final DeviceLocalAccountLocator sut = new DeviceLocalAccountLocator(
+                getContext().getContentResolver(), new FakeDeviceAccountTypeFactory(),
+                Arrays.asList(new AccountWithDataSet("user", "com.example", null),
+                        new AccountWithDataSet("user1", "com.example", null),
+                        new AccountWithDataSet("user", "com.example.1", null)));
+
+        assertTrue("Selection should filter known accounts", sut.getSelection().contains("NOT IN (?,?)"));
+
+        final List<String> args = Arrays.asList(sut.getSelectionArgs());
+        assertEquals(2, args.size());
+        assertTrue("Selection args is missing an expected value", args.contains("com.example"));
+        assertTrue("Selection args is missing an expected value", args.contains("com.example.1"));
+    }
+
+    private DeviceLocalAccountLocator createWithQueryResult(
+            Cursor cursor) {
+        final DeviceLocalAccountLocator locator = new DeviceLocalAccountLocator(
+                createStubResolverWithContentQueryResult(cursor),
+                new DeviceLocalAccountTypeFactory.Default(getContext()),
+                Collections.<AccountWithDataSet>emptyList());
+        return locator;
+    }
+
+
+    private ContentResolver createStubResolverWithContentQueryResult(Cursor cursor) {
+        final MockContentResolver resolver = new MockContentResolver();
+        resolver.addProvider(ContactsContract.AUTHORITY, new FakeContactsProvider(cursor));
+        return resolver;
+    }
+
+    private Cursor queryResult(String... nameTypePairs) {
+        final MatrixCursor cursor = new MatrixCursor(new String[]
+                { RawContacts.ACCOUNT_NAME, RawContacts.ACCOUNT_TYPE, RawContacts.DATA_SET });
+        for (int i = 0; i < nameTypePairs.length; i+=2) {
+            cursor.newRow().add(nameTypePairs[i]).add(nameTypePairs[i+1])
+                    .add(null);
+        }
+        return cursor;
+    }
+
+    private static class FakeContactsProvider extends MockContentProvider {
+        public Cursor mNextQueryResult;
+
+        public FakeContactsProvider() {}
+
+        public FakeContactsProvider(Cursor result) {
+            mNextQueryResult = result;
+        }
+
+        public void setNextQueryResult(Cursor result) {
+            mNextQueryResult = result;
+        }
+
+        @Override
+        public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
+                String sortOrder) {
+            return query(uri, projection, selection, selectionArgs, sortOrder, null);
+        }
+
+        @Nullable
+        @Override
+        public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
+                String sortOrder, CancellationSignal cancellationSignal) {
+            return mNextQueryResult;
+        }
+    }
+}
diff --git a/tests/src/com/android/contacts/common/preference/ContactsPreferencesTest.java b/tests/src/com/android/contacts/common/preference/ContactsPreferencesTest.java
index 26e811d..bbbd65c 100644
--- a/tests/src/com/android/contacts/common/preference/ContactsPreferencesTest.java
+++ b/tests/src/com/android/contacts/common/preference/ContactsPreferencesTest.java
@@ -142,9 +142,11 @@
                 .thenReturn(new AccountWithDataSet("name1", "type1", "dataset1").stringify(),
                         new AccountWithDataSet("name2", "type2", "dataset2").stringify());
 
-        Assert.assertEquals("name1", mContactsPreferences.getDefaultAccount());
+        Assert.assertEquals(new AccountWithDataSet("name1", "type1", "dataset1"),
+                mContactsPreferences.getDefaultAccount());
         mContactsPreferences.refreshValue(ACCOUNT_KEY);
 
-        Assert.assertEquals("name2", mContactsPreferences.getDefaultAccount());
+        Assert.assertEquals(new AccountWithDataSet("name2", "type2", "dataset2"),
+                mContactsPreferences.getDefaultAccount());
     }
 }
diff --git a/tests/src/com/android/contacts/common/util/DeviceLocalContactsFilterProviderTests.java b/tests/src/com/android/contacts/common/util/DeviceLocalContactsFilterProviderTests.java
deleted file mode 100644
index d776ab8..0000000
--- a/tests/src/com/android/contacts/common/util/DeviceLocalContactsFilterProviderTests.java
+++ /dev/null
@@ -1,221 +0,0 @@
-/*
- * Copyright (C) 2016 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.common.util;
-
-import android.content.ContentProvider;
-import android.content.Context;
-import android.content.CursorLoader;
-import android.database.Cursor;
-import android.database.MatrixCursor;
-import android.net.Uri;
-import android.os.CancellationSignal;
-import android.provider.ContactsContract;
-import android.provider.ContactsContract.RawContacts;
-import android.support.annotation.Nullable;
-import android.test.LoaderTestCase;
-import android.test.mock.MockContentResolver;
-import android.test.mock.MockContext;
-import android.test.suitebuilder.annotation.SmallTest;
-
-import com.android.contacts.common.list.ContactListFilter;
-import com.android.contacts.common.test.mocks.MockContentProvider;
-
-import org.mockito.Mockito;
-
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Set;
-
-import static org.mockito.Mockito.when;
-
-@SmallTest
-public class DeviceLocalContactsFilterProviderTests extends LoaderTestCase {
-
-    // Basic smoke test that just checks that it doesn't throw when loading from CP2. We don't
-    // care what CP2 actually contains for this.
-    public void testShouldNotCrash() {
-        final DeviceLocalContactsFilterProvider sut = new DeviceLocalContactsFilterProvider(
-                getContext(), DeviceAccountFilter.ONLY_NULL);
-        final CursorLoader loader = sut.onCreateLoader(0, null);
-        getLoaderResultSynchronously(loader);
-        // We didn't throw so it passed
-    }
-
-    public void testCreatesNoFiltersIfNoRawContactsHaveDeviceAccountType() {
-        final DeviceLocalContactsFilterProvider sut = createWithFilterAndLoaderResult(
-                DeviceAccountFilter.ONLY_NULL, queryResult(
-                        "user", "com.example",
-                        "user", "com.example",
-                        "user", "com.example"));
-        sut.setKnownAccountTypes("com.example");
-
-        doLoad(sut);
-
-        assertEquals(0, sut.getListFilters().size());
-    }
-
-    public void testCreatesOneFilterForDeviceAccount() {
-        final DeviceLocalContactsFilterProvider sut = createWithFilterAndLoaderResult(
-                DeviceAccountFilter.ONLY_NULL, queryResult(
-                        "user", "com.example",
-                        "user", "com.example",
-                        null, null,
-                        "user", "com.example",
-                        null, null));
-        sut.setKnownAccountTypes("com.example");
-
-        doLoad(sut);
-
-        assertEquals(1, sut.getListFilters().size());
-        assertEquals(ContactListFilter.FILTER_TYPE_DEVICE_CONTACTS,
-                sut.getListFilters().get(0).filterType);
-    }
-
-    public void testCreatesOneFilterForEachDeviceAccount() {
-         final DeviceLocalContactsFilterProvider sut = createWithFilterAndLoaderResult(
-                 filterAllowing(null, "vnd.sec.contact.phone", "vnd.sec.contact.sim"), queryResult(
-                         "sim_account", "vnd.sec.contact.sim",
-                         "user", "com.example",
-                         "user", "com.example",
-                         "phone_account", "vnd.sec.contact.phone",
-                         null, null,
-                         "phone_account", "vnd.sec.contact.phone",
-                         "user", "com.example",
-                         null, null,
-                         "sim_account", "vnd.sec.contact.sim",
-                         "sim_account_2", "vnd.sec.contact.sim"
-                 ));
-        sut.setKnownAccountTypes("com.example");
-
-        doLoad(sut);
-
-        assertEquals(4, sut.getListFilters().size());
-    }
-
-    public void testFilterIsUpdatedWhenLoaderReloads() {
-        final FakeContactsProvider provider = new FakeContactsProvider();
-        final DeviceLocalContactsFilterProvider sut = new DeviceLocalContactsFilterProvider(
-                createStubContextWithContactsProvider(provider), DeviceAccountFilter.ONLY_NULL);
-        sut.setKnownAccountTypes("com.example");
-
-        provider.setNextQueryResult(queryResult(
-                null, null,
-                "user", "com.example",
-                "user", "com.example"
-        ));
-        doLoad(sut);
-
-        assertFalse(sut.getListFilters().isEmpty());
-
-        provider.setNextQueryResult(queryResult(
-                "user", "com.example",
-                "user", "com.example"
-        ));
-        doLoad(sut);
-
-        assertTrue(sut.getListFilters().isEmpty());
-    }
-
-    public void testDoesNotCreateFiltersForKnownAccounts() {
-        final DeviceLocalContactsFilterProvider sut = new DeviceLocalContactsFilterProvider(
-                getContext(), DeviceAccountFilter.ONLY_NULL);
-        sut.setKnownAccountTypes("com.example", "maybe_syncable_device_account_type");
-
-        final CursorLoader loader = sut.onCreateLoader(0, null);
-
-        // The filtering is done at the DB level rather than in the code so just verify that
-        // selection is about right.
-        assertTrue("Loader selection is wrong", loader.getSelection().contains("NOT IN (?,?)"));
-        assertEquals("com.example", loader.getSelectionArgs()[0]);
-        assertEquals("maybe_syncable_device_account_type", loader.getSelectionArgs()[1]);
-    }
-
-    private void doLoad(DeviceLocalContactsFilterProvider loaderCallbacks) {
-        final CursorLoader loader = loaderCallbacks.onCreateLoader(0, null);
-        final Cursor cursor = getLoaderResultSynchronously(loader);
-        loaderCallbacks.onLoadFinished(loader, cursor);
-    }
-
-    private DeviceLocalContactsFilterProvider createWithFilterAndLoaderResult(
-            DeviceAccountFilter filter, Cursor cursor) {
-        final DeviceLocalContactsFilterProvider result = new DeviceLocalContactsFilterProvider(
-                createStubContextWithContentQueryResult(cursor), filter);
-        return result;
-    }
-
-    private Context createStubContextWithContentQueryResult(final Cursor cursor) {
-        return createStubContextWithContactsProvider(new FakeContactsProvider(cursor));
-    }
-
-    private Context createStubContextWithContactsProvider(ContentProvider contactsProvider) {
-        final MockContentResolver resolver = new MockContentResolver();
-        resolver.addProvider(ContactsContract.AUTHORITY, contactsProvider);
-
-        final Context context = Mockito.mock(MockContext.class);
-        when(context.getContentResolver()).thenReturn(resolver);
-
-        // The loader pulls out the application context instead of usign the context directly
-        when(context.getApplicationContext()).thenReturn(context);
-
-        return context;
-    }
-
-    private Cursor queryResult(String... typeNamePairs) {
-        final MatrixCursor cursor = new MatrixCursor(new String[]
-                { RawContacts.ACCOUNT_NAME, RawContacts.ACCOUNT_TYPE });
-        for (int i = 0; i < typeNamePairs.length; i += 2) {
-            cursor.newRow().add(typeNamePairs[i]).add(typeNamePairs[i+1]);
-        }
-        return cursor;
-    }
-
-    private DeviceAccountFilter filterAllowing(String... accountTypes) {
-        final Set<String> allowed = new HashSet<>(Arrays.asList(accountTypes));
-        return new DeviceAccountFilter() {
-            @Override
-            public boolean isDeviceAccountType(String accountType) {
-                return allowed.contains(accountType);
-            }
-        };
-    }
-
-    private static class FakeContactsProvider extends MockContentProvider {
-        public Cursor mNextQueryResult;
-
-        public FakeContactsProvider() {}
-
-        public FakeContactsProvider(Cursor result) {
-            mNextQueryResult = result;
-        }
-
-        public void setNextQueryResult(Cursor result) {
-            mNextQueryResult = result;
-        }
-
-        @Override
-        public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
-                String sortOrder) {
-            return query(uri, projection, selection, selectionArgs, sortOrder, null);
-        }
-
-        @Nullable
-        @Override
-        public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
-                String sortOrder, CancellationSignal cancellationSignal) {
-            return mNextQueryResult;
-        }
-    }
-}
diff --git a/tests/src/com/android/contacts/editor/ContactEditorUtilsTest.java b/tests/src/com/android/contacts/editor/ContactEditorUtilsTest.java
index 2e0306a..b5df8c9 100644
--- a/tests/src/com/android/contacts/editor/ContactEditorUtilsTest.java
+++ b/tests/src/com/android/contacts/editor/ContactEditorUtilsTest.java
@@ -272,7 +272,7 @@
         assertTrue(mTarget.shouldShowAccountChangedNotification());
 
         // We show the notification here, and user clicked "keep local" and saved an contact.
-        mTarget.saveDefaultAndAllAccounts(null);
+        mTarget.saveDefaultAndAllAccounts(AccountWithDataSet.getLocalAccount());
 
         // Now there are no accounts, and default account is null.
 
diff --git a/tests/src/com/android/contacts/editor/EditorUiUtilsTest.java b/tests/src/com/android/contacts/editor/EditorUiUtilsTest.java
index 19f28d3..e68511f 100644
--- a/tests/src/com/android/contacts/editor/EditorUiUtilsTest.java
+++ b/tests/src/com/android/contacts/editor/EditorUiUtilsTest.java
@@ -16,10 +16,6 @@
 
 package com.android.contacts.editor;
 
-import com.android.contacts.R;
-import com.android.contacts.common.model.account.AccountType;
-import com.android.contacts.common.model.account.GoogleAccountType;
-
 import android.content.Context;
 import android.media.RingtoneManager;
 import android.net.Uri;
@@ -27,7 +23,11 @@
 import android.provider.Settings;
 import android.test.AndroidTestCase;
 import android.test.suitebuilder.annotation.SmallTest;
-import android.util.Pair;
+
+import com.android.contacts.common.model.account.AccountDisplayInfo;
+import com.android.contacts.R;
+import com.android.contacts.common.model.account.AccountType;
+import com.android.contacts.common.model.account.AccountWithDataSet;
 
 /**
  * Tests {@link EditorUiUtils}.
@@ -43,6 +43,11 @@
 
     private static final String RINGTONE = "content://media/external/audio/media/31";
 
+    private static final AccountWithDataSet ACCOUNT =
+            new AccountWithDataSet(ACCOUNT_NAME, "some.account.type", null);
+    private static final AccountWithDataSet GOOGLE_ACCOUNT =
+            new AccountWithDataSet(ACCOUNT_NAME, "com.google", null);
+
     private static final class MockAccountType extends AccountType {
 
         private final String mDisplayLabel;
@@ -67,86 +72,65 @@
         }
     }
 
-    public void testGetProfileAccountInfo_AccountName() {
-        final Pair pair = EditorUiUtils.getLocalAccountInfo(getContext(),
-                ACCOUNT_NAME, new MockAccountType(DISPLAY_LABEL));
+    public void testGetProfileAccountInfo_NonLocalAccount() {
+        final AccountDisplayInfo account = new AccountDisplayInfo(ACCOUNT, ACCOUNT_NAME,
+                DISPLAY_LABEL, /*icon*/ null, /*isDeviceAccount*/ false);
 
-        assertNotNull(pair);
-        assertEquals(ACCOUNT_NAME, pair.first);
-        assertEquals(getContext().getString(R.string.external_profile_title, DISPLAY_LABEL),
-                pair.second); // My LunkedIn profile
+        final String label = EditorUiUtils.getAccountHeaderLabelForMyProfile(getContext(),
+                account);
+
+        // My LunkedIn profile
+        final String expected = getContext()
+                .getString(R.string.external_profile_title, DISPLAY_LABEL);
+        assertEquals(expected, label);
     }
 
-    public void testGetProfileAccountInfo_NoAccountName() {
-        final Pair pair = EditorUiUtils.getLocalAccountInfo(getContext(),
-                /* accountName =*/ null, new MockAccountType(DISPLAY_LABEL));
 
-        assertNotNull(pair);
-        assertNull(pair.first);
-        assertEquals(getContext().getString(R.string.local_profile_title),
-                pair.second); // "My local profile
+    public void testGetProfileAccountInfo_DeviceLocalAccount() {
+        final AccountDisplayInfo account = new AccountDisplayInfo(ACCOUNT, "Device",
+                "Device", null, true);
+
+        final String label = EditorUiUtils.getAccountHeaderLabelForMyProfile(getContext(),
+                account);
+
+        // "My local profile"
+        final String expected = getContext().getString(R.string.local_profile_title);
+        assertEquals(expected, label);
     }
 
-    public void testGetAccountInfo_AccountName_DisplayLabel() {
-        final Pair pair = EditorUiUtils.getAccountInfo(getContext(),
-                ACCOUNT_NAME, new MockAccountType(DISPLAY_LABEL));
+    public void testGetAccountInfo_AccountType_NonGoogle() {
+        final AccountDisplayInfo account = new AccountDisplayInfo(ACCOUNT, ACCOUNT_NAME,
+                DISPLAY_LABEL, /*icon*/ null, /*isDeviceAccount*/ false);
 
-        assertNotNull(pair);
-        assertEquals(getContext().getString(R.string.from_account_format, ACCOUNT_NAME),
-                pair.first); // somebody@lunkedin.com
-        assertEquals(getContext().getString(R.string.account_type_format, DISPLAY_LABEL),
-                pair.second); // LunkedIn Contact
+        final String label = EditorUiUtils.getAccountTypeHeaderLabel(getContext(), account);
+
+        // LunkedIn Contact
+        final String expected = getContext().getString(R.string.account_type_format, DISPLAY_LABEL);
+        assertEquals(expected, label);
     }
 
-    public void testGetAccountInfo_AccountName_DisplayLabel_GoogleAccountType() {
-        final AccountType accountType = new MockAccountType(GOOGLE_DISPLAY_LABEL);
-        accountType.accountType = GoogleAccountType.ACCOUNT_TYPE;
-        final Pair pair = EditorUiUtils.getAccountInfo(getContext(),
-                GOOGLE_ACCOUNT_NAME, accountType);
+    public void testGetAccountInfo_AccountType_Google() {
+        final AccountDisplayInfo account = new AccountDisplayInfo(GOOGLE_ACCOUNT, ACCOUNT_NAME,
+                GOOGLE_DISPLAY_LABEL, /*icon*/ null, /*isDeviceAccount*/ false);
 
-        assertNotNull(pair);
-        assertEquals(getContext().getString(R.string.from_account_format, GOOGLE_ACCOUNT_NAME),
-                pair.first); // somebody@gmail.com
-        assertEquals(
-                getContext().getString(R.string.google_account_type_format, GOOGLE_DISPLAY_LABEL),
-                pair.second); // Google Account
+        final String label = EditorUiUtils.getAccountTypeHeaderLabel(getContext(), account);
+
+        // Google Account
+        final String expected = getContext().getString(R.string.google_account_type_format,
+                GOOGLE_DISPLAY_LABEL);
+        assertEquals(expected, label);
     }
 
-    public void testGetAccountInfo_AccountName_NoDisplayLabel() {
-        final Pair pair = EditorUiUtils.getAccountInfo(getContext(),
-                ACCOUNT_NAME, new MockAccountType(/* displayLabel =*/ null));
+  public void testGetAccountInfo_AccountType_DeviceAccount() {
+      final AccountWithDataSet deviceAccount = AccountWithDataSet.getLocalAccount();
+      final AccountDisplayInfo account = new AccountDisplayInfo(deviceAccount, "Device",
+              "Device", /*icon*/ null, /*isDeviceAccount*/ true);
 
-        assertNotNull(pair);
-        assertEquals(getContext().getString(R.string.from_account_format, ACCOUNT_NAME),
-                pair.first); // somebody@lunkedin.com
-        assertEquals(getContext().getString(R.string.account_phone), pair.second); // Device
-    }
+      final String label = EditorUiUtils.getAccountTypeHeaderLabel(getContext(), account);
 
-    public void testGetAccountInfo_NoAccountName_DisplayLabel() {
-        final Pair pair = EditorUiUtils.getAccountInfo(getContext(),
-                /* accountName =*/ null, new MockAccountType(DISPLAY_LABEL));
-
-        assertNotNull(pair);
-        assertNull(pair.first);
-        assertEquals(getContext().getString(R.string.account_type_format, DISPLAY_LABEL),
-                pair.second); // LunkedIn contact
-
-        final Pair pairDevice = EditorUiUtils.getAccountInfo(
-                getContext(),
-                /* accountName =*/ null,
-                new MockAccountType(getContext().getString(R.string.account_phone)));
-        assertNotNull(pairDevice);
-        assertNull(pairDevice.first);
-        assertEquals(getContext().getString(R.string.account_phone), pairDevice.second); // Device
-    }
-
-    public void testGetAccountInfo_NoAccountName_NoDisplayLabel() {
-        final Pair pair = EditorUiUtils.getAccountInfo(getContext(),
-                /* accountName =*/ null, new MockAccountType(/* displayLabel =*/ null));
-
-        assertNotNull(pair);
-        assertNull(pair.first);
-        assertEquals(getContext().getString(R.string.account_phone), pair.second); // Device
+      // "Device"
+      final String expected = getContext().getString(R.string.account_phone);
+      assertEquals(expected, label);
     }
 
     public void testGetRingtongStrFromUri_lessThanOrEqualsToM() {
@@ -185,4 +169,8 @@
                 currentVersion));
     }
 
+    private AccountDisplayInfo createDisplayableAccount() {
+        return new AccountDisplayInfo(ACCOUNT, ACCOUNT_NAME, DISPLAY_LABEL, null, false);
+    }
+
 }
diff --git a/tests/src/com/android/contacts/tests/FakeAccountType.java b/tests/src/com/android/contacts/tests/FakeAccountType.java
new file mode 100644
index 0000000..59327d8
--- /dev/null
+++ b/tests/src/com/android/contacts/tests/FakeAccountType.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright (C) 2016 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.tests;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.ColorFilter;
+import android.graphics.PixelFormat;
+import android.graphics.drawable.Drawable;
+
+import com.android.contacts.common.model.account.AccountType;
+import com.android.contacts.common.model.account.AccountWithDataSet;
+
+public class FakeAccountType extends AccountType {
+    public boolean areContactsWritable = false;
+    public boolean isGroupMembershipEditable = false;
+    public String displayLabel = "The Default Label";
+    public Drawable displayIcon = new Drawable() {
+        @Override
+        public void draw(Canvas canvas) {
+        }
+
+        @Override
+        public void setAlpha(int alpha) {
+        }
+
+        @Override
+        public void setColorFilter(ColorFilter colorFilter) {
+        }
+
+        @Override
+        public int getOpacity() {
+            return PixelFormat.OPAQUE;
+        }
+    };
+
+    public FakeAccountType() {
+    }
+
+    public FakeAccountType(String type) {
+        accountType = type;
+    }
+
+    @Override
+    public Drawable getDisplayIcon(Context context) {
+        return displayIcon;
+    }
+
+    @Override
+    public String getDisplayLabel(Context context) {
+        return displayLabel;
+    }
+
+    @Override
+    public boolean areContactsWritable() {
+        return areContactsWritable;
+    }
+
+    @Override
+    public boolean isGroupMembershipEditable() {
+        return isGroupMembershipEditable;
+    }
+
+    public static FakeAccountType create(String accountType, String label) {
+        final FakeAccountType result = new FakeAccountType();
+        result.accountType = accountType;
+        result.displayLabel = label;
+        return result;
+    }
+
+    public static FakeAccountType create(String accountType, String label, Drawable icon) {
+        final FakeAccountType result = new FakeAccountType();
+        result.accountType = accountType;
+        result.displayIcon = icon;
+        result.displayLabel = label;
+        return result;
+    }
+
+    public static AccountType create(AccountWithDataSet account, String label, Drawable icon) {
+        final FakeAccountType result = create(account.type, label, icon);
+        result.accountType = account.type;
+        result.dataSet = account.dataSet;
+        return result;
+    }
+}
diff --git a/tests/src/com/android/contacts/tests/FakeDeviceAccountTypeFactory.java b/tests/src/com/android/contacts/tests/FakeDeviceAccountTypeFactory.java
new file mode 100644
index 0000000..6a500ec
--- /dev/null
+++ b/tests/src/com/android/contacts/tests/FakeDeviceAccountTypeFactory.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2016 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.tests;
+
+import com.android.contacts.common.model.account.AccountType;
+import com.android.contacts.common.model.account.FallbackAccountType;
+import com.android.contacts.common.util.DeviceLocalAccountTypeFactory;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+public class FakeDeviceAccountTypeFactory implements DeviceLocalAccountTypeFactory {
+
+    private final Map<String, AccountType> mDeviceAccountTypes = new HashMap<>();
+    private final Map<String, AccountType> mSimAccountTypes = new HashMap<>();
+
+    @Override
+    public int classifyAccount(String accountType) {
+        if (mDeviceAccountTypes.containsKey(accountType)) {
+            return TYPE_DEVICE;
+        } else if (mSimAccountTypes.containsKey(accountType)) {
+            return TYPE_SIM;
+        } else {
+            return TYPE_OTHER;
+        }
+    }
+
+    @Override
+    public AccountType getAccountType(String accountType) {
+        final AccountType type = mDeviceAccountTypes.get(accountType);
+        return type == null ? mSimAccountTypes.get(accountType) : type;
+    }
+
+    public FakeDeviceAccountTypeFactory withSimTypes(String... types) {
+        for (String type : types) {
+            mSimAccountTypes.put(type, new FakeAccountType(type));
+        }
+        return this;
+    }
+
+    public FakeDeviceAccountTypeFactory withSimTypes(AccountType... types) {
+        for (AccountType type : types) {
+            mSimAccountTypes.put(type.accountType, type);
+        }
+        return this;
+    }
+
+    public FakeDeviceAccountTypeFactory withDeviceTypes(String... types) {
+        for (String type : types) {
+            mDeviceAccountTypes.put(type, new FakeAccountType(type));
+        }
+        return this;
+    }
+
+    public FakeDeviceAccountTypeFactory withDeviceTypes(AccountType... types) {
+        for (AccountType type : types) {
+            mDeviceAccountTypes.put(type.accountType, type);
+        }
+        return this;
+    }
+}
diff --git a/tests/src/com/android/contacts/util/AccountDisplayInfoFactoryTests.java b/tests/src/com/android/contacts/util/AccountDisplayInfoFactoryTests.java
new file mode 100644
index 0000000..875f40e
--- /dev/null
+++ b/tests/src/com/android/contacts/util/AccountDisplayInfoFactoryTests.java
@@ -0,0 +1,205 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.contacts.util;
+
+import android.graphics.Canvas;
+import android.graphics.ColorFilter;
+import android.graphics.PixelFormat;
+import android.graphics.drawable.Drawable;
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import com.android.contacts.common.model.AccountTypeManager;
+import com.android.contacts.common.model.account.AccountDisplayInfo;
+import com.android.contacts.common.model.account.AccountDisplayInfoFactory;
+import com.android.contacts.common.model.account.AccountType;
+import com.android.contacts.common.model.account.AccountWithDataSet;
+import com.android.contacts.common.test.mocks.MockAccountTypeManager;
+import com.android.contacts.common.util.DeviceLocalAccountTypeFactory;
+import com.android.contacts.tests.FakeAccountType;
+import com.android.contacts.tests.FakeDeviceAccountTypeFactory;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+
+@SmallTest
+public class AccountDisplayInfoFactoryTests extends AndroidTestCase {
+
+    private Map<AccountWithDataSet, AccountType> mKnownTypes;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mKnownTypes = new HashMap<>();
+    }
+
+    public void test_displayableAccount_hasIconFromAccountType() {
+        final Drawable comExampleIcon = someDrawable();
+
+        addTypeMapping(account("user", "com.example"), "title", comExampleIcon);
+        addTypeMapping(account(null, null), "device", someDrawable());
+        addTypeMapping(account("foo", "bar.type"), "bar", someDrawable());
+        addTypeMapping(account("user2", "com.example"), "title", comExampleIcon);
+
+        final AccountDisplayInfoFactory sut = createFactoryForKnownTypes();
+
+        final AccountDisplayInfo displayable = sut.getAccountDisplayInfo(
+                account("user", "com.example"));
+        assertEquals(comExampleIcon, displayable.getIcon());
+    }
+
+    public void test_displayableAccount_hasNameFromAccount() {
+        final Drawable comExampleIcon = someDrawable();
+
+        addTypeMapping(account("user@example.com", "com.example"), "title", comExampleIcon);
+        addTypeMapping(account(null, null), "device", someDrawable());
+        addTypeMapping(account("foo", "bar.type"), "bar", someDrawable());
+        addTypeMapping(account("user2@example.com", "com.example"), "title", comExampleIcon);
+
+        final AccountDisplayInfoFactory sut = createFactoryForKnownTypes();
+
+        final AccountDisplayInfo displayable = sut.getAccountDisplayInfo(
+                account("user@example.com", "com.example"));
+        assertEquals("user@example.com", displayable.getNameLabel());
+    }
+
+    public void test_displayableAccountForNullAccount_hasNameFromAccountType() {
+        addSomeKnownAccounts();
+        addTypeMapping(account(null, null), "Device Display Label", someDrawable());
+
+        final AccountDisplayInfoFactory sut = createFactoryForKnownTypes();
+
+        final AccountDisplayInfo displayable = sut.getAccountDisplayInfo(
+                account(null, null));
+        assertEquals("Device Display Label", displayable.getNameLabel());
+    }
+
+    public void test_displayableAccountForDeviceAccount_hasNameFromAccountType() {
+        addSomeKnownAccounts();
+        addTypeMapping(account("some.device.account.name", "device.account.type"), "Device Label",
+                someDrawable());
+
+        final AccountDisplayInfoFactory sut = createFactoryForKnownTypes(
+                new FakeDeviceAccountTypeFactory().withDeviceTypes("device.account.type"));
+
+        final AccountDisplayInfo displayable = sut.getAccountDisplayInfo(
+                account("some.device.account.name", "device.account.type"));
+        assertEquals("Device Label", displayable.getNameLabel());
+    }
+
+    public void test_displayableAccountForDeviceAccountWhenMultiple_hasNameFromAccount() {
+        addSomeKnownAccounts();
+        addTypeMapping(account("first.device.account.name", "a.device.account.type"),
+                "Device Display Label", someDrawable());
+        addTypeMapping(account("second.device.account.name", "b.device.account.type"),
+                "Device Display Label", someDrawable());
+        addTypeMapping(account("another.device.account.name", "a.device.account.type"),
+                "Device Display Label", someDrawable());
+
+        final AccountDisplayInfoFactory sut = createFactoryForKnownTypes(
+                new FakeDeviceAccountTypeFactory().withDeviceTypes("a.device.account.type",
+                        "b.device.account.type"));
+
+        final AccountDisplayInfo displayable = sut.getAccountDisplayInfo(
+                account("first.device.account.name", "a.device.account.type"));
+        assertEquals("first.device.account.name", displayable.getNameLabel());
+
+        final AccountDisplayInfo displayable2 = sut.getAccountDisplayInfo(
+                account("second.device.account.name", "b.device.account.type"));
+        assertEquals("second.device.account.name", displayable2.getNameLabel());
+    }
+
+    public void test_displayableAccountForSimAccount_hasNameFromAccountType() {
+        addSomeKnownAccounts();
+        addTypeMapping(account("sim.account.name", "sim.account.type"), "SIM", someDrawable());
+
+        final AccountDisplayInfoFactory sut = createFactoryForKnownTypes(
+                new FakeDeviceAccountTypeFactory().withSimTypes("sim.account.type"));
+
+        final AccountDisplayInfo displayable = sut.getAccountDisplayInfo(
+                account("sim.account.name", "sim.account.type"));
+        assertEquals("SIM", displayable.getNameLabel());
+    }
+
+    public void test_displayableAccountForSimAccountWhenMultiple_hasNameFromAccount() {
+        addSomeKnownAccounts();
+        addTypeMapping(account("sim.account.name", "sim.account.type"), "SIM", someDrawable());
+        addTypeMapping(account("sim2.account.name", "sim.account.type"), "SIM", someDrawable());
+
+        final AccountDisplayInfoFactory sut = createFactoryForKnownTypes(
+                new FakeDeviceAccountTypeFactory().withSimTypes("sim.account.type"));
+
+        final AccountDisplayInfo displayable = sut.getAccountDisplayInfo(
+                account("sim.account.name", "sim.account.type"));
+        assertEquals("sim.account.name", displayable.getNameLabel());
+    }
+
+    private void addSomeKnownAccounts() {
+        final Drawable comExampleIcon = someDrawable();
+        addTypeMapping(account("user@example.com", "com.example"), "Example Title", comExampleIcon);
+        addTypeMapping(account("foo", "bar.type"), "Bar", someDrawable());
+        addTypeMapping(account("user2@example.com", "com.example"), "Example Title", comExampleIcon);
+        addTypeMapping(account("user", "com.example.two"), "Some Account", someDrawable());
+    }
+
+    private AccountDisplayInfoFactory createFactoryForKnownTypes() {
+        return createFactoryForKnownTypes(new DeviceLocalAccountTypeFactory.Default(getContext()));
+    }
+
+    private AccountDisplayInfoFactory createFactoryForKnownTypes(DeviceLocalAccountTypeFactory
+            typeFactory) {
+        return new AccountDisplayInfoFactory(getContext(),
+                createFakeAccountTypeManager(mKnownTypes), typeFactory,
+                new ArrayList<>(mKnownTypes.keySet()));
+    }
+
+    private AccountWithDataSet account(String name, String type) {
+        return new AccountWithDataSet(name, type, /* dataSet */ null);
+    }
+
+    private void addTypeMapping(AccountWithDataSet account, String label, Drawable icon) {
+        mKnownTypes.put(account, FakeAccountType.create(account, label, icon));
+    }
+
+    private AccountTypeManager createFakeAccountTypeManager(
+            final Map<AccountWithDataSet, AccountType> mapping) {
+        return new MockAccountTypeManager(mapping.values().toArray(new AccountType[mapping.size()]),
+                mapping.keySet().toArray(new AccountWithDataSet[mapping.size()]));
+    }
+
+    private Drawable someDrawable() {
+        return new Drawable() {
+            @Override
+            public void draw(Canvas canvas) {
+            }
+
+            @Override
+            public void setAlpha(int i) {
+            }
+
+            @Override
+            public void setColorFilter(ColorFilter colorFilter) {
+            }
+
+            @Override
+            public int getOpacity() {
+                return PixelFormat.OPAQUE;
+            }
+        };
+    }
+
+}
