diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 4c5b19f..b669152 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -390,7 +390,7 @@
         <!-- Used to show QuickContact window over a translucent activity, which is a
              temporary hack until we add better framework support. -->
         <activity
-            android:name=".quickcontact.QuickContactWindow"
+            android:name=".quickcontact.QuickContactActivity"
             android:theme="@style/Theme.QuickContact"
             android:launchMode="singleTop"
             android:excludeFromRecents="true"
diff --git a/res/anim/quickcontact_above_enter.xml b/res/anim/quickcontact_above_enter.xml
deleted file mode 100644
index d86c98c..0000000
--- a/res/anim/quickcontact_above_enter.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2009, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License"); 
-** you may not use this file except in compliance with the License. 
-** You may obtain a copy of the License at 
-**
-**     http://www.apache.org/licenses/LICENSE-2.0 
-**
-** Unless required by applicable law or agreed to in writing, software 
-** distributed under the License is distributed on an "AS IS" BASIS, 
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
-** See the License for the specific language governing permissions and 
-** limitations under the License.
-*/
--->
-
-<set xmlns:android="http://schemas.android.com/apk/res/android">
-    <scale android:interpolator="@android:interpolator/decelerate_quint"
-            android:fromXScale="1" android:toXScale="1.0"
-            android:fromYScale="0.8" android:toYScale="1.0"
-            android:pivotX="50%" android:pivotY="100%"
-            android:duration="@android:integer/config_shortAnimTime" />
-    <alpha android:interpolator="@android:interpolator/decelerate_cubic"
-            android:fromAlpha="0.0" android:toAlpha="1.0"
-            android:duration="@android:integer/config_shortAnimTime" />
-</set>
diff --git a/res/anim/quickcontact_above_exit.xml b/res/anim/quickcontact_above_exit.xml
deleted file mode 100644
index e8a16b4..0000000
--- a/res/anim/quickcontact_above_exit.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2009, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License"); 
-** you may not use this file except in compliance with the License. 
-** You may obtain a copy of the License at 
-**
-**     http://www.apache.org/licenses/LICENSE-2.0 
-**
-** Unless required by applicable law or agreed to in writing, software 
-** distributed under the License is distributed on an "AS IS" BASIS, 
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
-** See the License for the specific language governing permissions and 
-** limitations under the License.
-*/
--->
-
-<set xmlns:android="http://schemas.android.com/apk/res/android">
-    <scale android:interpolator="@android:interpolator/accelerate_quint"
-            android:fromXScale="1.0" android:toXScale="1.0"
-            android:fromYScale="1.0" android:toYScale=".8"
-            android:pivotX="50%" android:pivotY="100%"
-            android:duration="@android:integer/config_shortAnimTime" />
-    <alpha android:interpolator="@android:interpolator/accelerate_cubic"
-            android:fromAlpha="1.0" android:toAlpha="0"
-            android:duration="@android:integer/config_shortAnimTime" />
-</set>
diff --git a/res/anim/quickcontact_below_enter.xml b/res/anim/quickcontact_below_enter.xml
deleted file mode 100644
index 39aa177..0000000
--- a/res/anim/quickcontact_below_enter.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2009, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License"); 
-** you may not use this file except in compliance with the License. 
-** You may obtain a copy of the License at 
-**
-**     http://www.apache.org/licenses/LICENSE-2.0 
-**
-** Unless required by applicable law or agreed to in writing, software 
-** distributed under the License is distributed on an "AS IS" BASIS, 
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
-** See the License for the specific language governing permissions and 
-** limitations under the License.
-*/
--->
-
-<set xmlns:android="http://schemas.android.com/apk/res/android">
-    <scale android:interpolator="@android:interpolator/decelerate_quint"
-            android:fromXScale="1" android:toXScale="1.0"
-            android:fromYScale="0.8" android:toYScale="1.0"
-            android:pivotX="50%" android:pivotY="0%"
-            android:duration="@android:integer/config_shortAnimTime" />
-    <alpha android:interpolator="@android:interpolator/decelerate_cubic"
-            android:fromAlpha="0.0" android:toAlpha="1.0"
-            android:duration="@android:integer/config_shortAnimTime" />
-</set>
diff --git a/res/anim/quickcontact_below_exit.xml b/res/anim/quickcontact_below_exit.xml
deleted file mode 100644
index 8f70751..0000000
--- a/res/anim/quickcontact_below_exit.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2009, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License"); 
-** you may not use this file except in compliance with the License. 
-** You may obtain a copy of the License at 
-**
-**     http://www.apache.org/licenses/LICENSE-2.0 
-**
-** Unless required by applicable law or agreed to in writing, software 
-** distributed under the License is distributed on an "AS IS" BASIS, 
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
-** See the License for the specific language governing permissions and 
-** limitations under the License.
-*/
--->
-
-<set xmlns:android="http://schemas.android.com/apk/res/android">
-    <scale android:interpolator="@android:interpolator/accelerate_quint"
-            android:fromXScale="1.0" android:toXScale="1.0"
-            android:fromYScale="1.0" android:toYScale="0.8"
-            android:pivotX="50%" android:pivotY="0%"
-            android:duration="@android:integer/config_shortAnimTime" />
-    <alpha android:interpolator="@android:interpolator/accelerate_cubic"
-            android:fromAlpha="1.0" android:toAlpha="0"
-            android:duration="@android:integer/config_shortAnimTime" />
-</set>
diff --git a/res/drawable-hdpi/ic_fav_quickcontact_holo_dark.png b/res/drawable-hdpi/ic_fav_quickcontact_holo_dark.png
new file mode 100644
index 0000000..06dc777
--- /dev/null
+++ b/res/drawable-hdpi/ic_fav_quickcontact_holo_dark.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_text_holo_dark.png b/res/drawable-hdpi/ic_text_holo_dark.png
new file mode 100644
index 0000000..1816201
--- /dev/null
+++ b/res/drawable-hdpi/ic_text_holo_dark.png
Binary files differ
diff --git a/res/drawable-hdpi/quickactions_arrowdown_left_holo_light.9.png b/res/drawable-hdpi/quickactions_arrowdown_left_holo_light.9.png
deleted file mode 100644
index b09016b..0000000
--- a/res/drawable-hdpi/quickactions_arrowdown_left_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/quickactions_arrowdown_middle_holo_light.9.png b/res/drawable-hdpi/quickactions_arrowdown_middle_holo_light.9.png
deleted file mode 100644
index 670d89f..0000000
--- a/res/drawable-hdpi/quickactions_arrowdown_middle_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/quickactions_arrowdown_right_holo_light.9.png b/res/drawable-hdpi/quickactions_arrowdown_right_holo_light.9.png
deleted file mode 100644
index 81f4859..0000000
--- a/res/drawable-hdpi/quickactions_arrowdown_right_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/quickactions_arrowup_left_holo_light.9.png b/res/drawable-hdpi/quickactions_arrowup_left_holo_light.9.png
deleted file mode 100644
index 99ad9e2..0000000
--- a/res/drawable-hdpi/quickactions_arrowup_left_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/quickactions_arrowup_middle_holo_light.9.png b/res/drawable-hdpi/quickactions_arrowup_middle_holo_light.9.png
deleted file mode 100644
index 500d820..0000000
--- a/res/drawable-hdpi/quickactions_arrowup_middle_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/quickactions_arrowup_right_holo_light.9.png b/res/drawable-hdpi/quickactions_arrowup_right_holo_light.9.png
deleted file mode 100644
index d99058b..0000000
--- a/res/drawable-hdpi/quickactions_arrowup_right_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/quickcon_background_texture.png b/res/drawable-hdpi/quickcon_background_texture.png
new file mode 100644
index 0000000..60bb6cc
--- /dev/null
+++ b/res/drawable-hdpi/quickcon_background_texture.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_fav_quickcontact_holo_dark.png b/res/drawable-mdpi/ic_fav_quickcontact_holo_dark.png
new file mode 100644
index 0000000..a089a67
--- /dev/null
+++ b/res/drawable-mdpi/ic_fav_quickcontact_holo_dark.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_text_holo_dark.png b/res/drawable-mdpi/ic_text_holo_dark.png
new file mode 100644
index 0000000..bbaa84f
--- /dev/null
+++ b/res/drawable-mdpi/ic_text_holo_dark.png
Binary files differ
diff --git a/res/drawable-mdpi/quickactions_arrowdown_left_holo_light.9.png b/res/drawable-mdpi/quickactions_arrowdown_left_holo_light.9.png
deleted file mode 100644
index bd43850..0000000
--- a/res/drawable-mdpi/quickactions_arrowdown_left_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/quickactions_arrowdown_middle_holo_light.9.png b/res/drawable-mdpi/quickactions_arrowdown_middle_holo_light.9.png
deleted file mode 100644
index c284dbb..0000000
--- a/res/drawable-mdpi/quickactions_arrowdown_middle_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/quickactions_arrowdown_right_holo_light.9.png b/res/drawable-mdpi/quickactions_arrowdown_right_holo_light.9.png
deleted file mode 100644
index c057f71..0000000
--- a/res/drawable-mdpi/quickactions_arrowdown_right_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/quickactions_arrowup_left_holo_light.9.png b/res/drawable-mdpi/quickactions_arrowup_left_holo_light.9.png
deleted file mode 100644
index 85d092f..0000000
--- a/res/drawable-mdpi/quickactions_arrowup_left_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/quickactions_arrowup_middle_holo_light.9.png b/res/drawable-mdpi/quickactions_arrowup_middle_holo_light.9.png
deleted file mode 100644
index 828b718..0000000
--- a/res/drawable-mdpi/quickactions_arrowup_middle_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/quickactions_arrowup_right_holo_light.9.png b/res/drawable-mdpi/quickactions_arrowup_right_holo_light.9.png
deleted file mode 100644
index e4994b4..0000000
--- a/res/drawable-mdpi/quickactions_arrowup_right_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/quickcon_background_texture.png b/res/drawable-mdpi/quickcon_background_texture.png
new file mode 100644
index 0000000..86e1635
--- /dev/null
+++ b/res/drawable-mdpi/quickcon_background_texture.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_fav_quickcontact_holo_dark.png b/res/drawable-xhdpi/ic_fav_quickcontact_holo_dark.png
new file mode 100644
index 0000000..0384abc
--- /dev/null
+++ b/res/drawable-xhdpi/ic_fav_quickcontact_holo_dark.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_text_holo_dark.png b/res/drawable-xhdpi/ic_text_holo_dark.png
new file mode 100644
index 0000000..8c697d9
--- /dev/null
+++ b/res/drawable-xhdpi/ic_text_holo_dark.png
Binary files differ
diff --git a/res/drawable-xhdpi/quickactions_arrowdown_left_holo_light.9.png b/res/drawable-xhdpi/quickactions_arrowdown_left_holo_light.9.png
deleted file mode 100644
index 12e2988..0000000
--- a/res/drawable-xhdpi/quickactions_arrowdown_left_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/quickactions_arrowdown_middle_holo_light.9.png b/res/drawable-xhdpi/quickactions_arrowdown_middle_holo_light.9.png
deleted file mode 100644
index bff78a4..0000000
--- a/res/drawable-xhdpi/quickactions_arrowdown_middle_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/quickactions_arrowdown_right_holo_light.9.png b/res/drawable-xhdpi/quickactions_arrowdown_right_holo_light.9.png
deleted file mode 100644
index 1ef7191..0000000
--- a/res/drawable-xhdpi/quickactions_arrowdown_right_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/quickactions_arrowup_left_holo_light.9.png b/res/drawable-xhdpi/quickactions_arrowup_left_holo_light.9.png
deleted file mode 100644
index cf280d9..0000000
--- a/res/drawable-xhdpi/quickactions_arrowup_left_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/quickactions_arrowup_middle_holo_light.9.png b/res/drawable-xhdpi/quickactions_arrowup_middle_holo_light.9.png
deleted file mode 100644
index b5d9a0d..0000000
--- a/res/drawable-xhdpi/quickactions_arrowup_middle_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/quickactions_arrowup_right_holo_light.9.png b/res/drawable-xhdpi/quickactions_arrowup_right_holo_light.9.png
deleted file mode 100644
index 6c6a99c..0000000
--- a/res/drawable-xhdpi/quickactions_arrowup_right_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/quickcon_background_texture.png b/res/drawable-xhdpi/quickcon_background_texture.png
new file mode 100644
index 0000000..9134f93
--- /dev/null
+++ b/res/drawable-xhdpi/quickcon_background_texture.png
Binary files differ
diff --git a/res/drawable/quickactions_arrow_left_holo_light.xml b/res/drawable/quickactions_arrow_left_holo_light.xml
deleted file mode 100644
index c1e18bd..0000000
--- a/res/drawable/quickactions_arrow_left_holo_light.xml
+++ /dev/null
@@ -1,21 +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.
--->
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-    <item android:state_first="true" android:drawable="@drawable/quickactions_arrowdown_left_holo_light" />
-    <item android:state_last="true" android:drawable="@drawable/quickactions_arrowup_left_holo_light" />
-    <!-- TODO: provide callout-less state -->
-    <item android:drawable="@drawable/quickactions_arrowup_left_holo_light" />
-</selector>
diff --git a/res/drawable/quickactions_arrow_middle_holo_light.xml b/res/drawable/quickactions_arrow_middle_holo_light.xml
deleted file mode 100644
index f88b513..0000000
--- a/res/drawable/quickactions_arrow_middle_holo_light.xml
+++ /dev/null
@@ -1,21 +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.
--->
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-    <item android:state_first="true" android:drawable="@drawable/quickactions_arrowdown_middle_holo_light" />
-    <item android:state_last="true" android:drawable="@drawable/quickactions_arrowup_middle_holo_light" />
-    <!-- TODO: provide callout-less state -->
-    <item android:drawable="@drawable/quickactions_arrowup_middle_holo_light" />
-</selector>
diff --git a/res/drawable/quickactions_arrow_right_holo_light.xml b/res/drawable/quickactions_arrow_right_holo_light.xml
deleted file mode 100644
index 3e309fe..0000000
--- a/res/drawable/quickactions_arrow_right_holo_light.xml
+++ /dev/null
@@ -1,21 +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.
--->
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-    <item android:state_first="true" android:drawable="@drawable/quickactions_arrowdown_right_holo_light" />
-    <item android:state_last="true" android:drawable="@drawable/quickactions_arrowup_right_holo_light" />
-    <!-- TODO: provide callout-less state -->
-    <item android:drawable="@drawable/quickactions_arrowup_right_holo_light" />
-</selector>
diff --git a/res/drawable/quickcontact_list_item_background.xml b/res/drawable/quickcontact_list_item_background.xml
new file mode 100644
index 0000000..e6d773e
--- /dev/null
+++ b/res/drawable/quickcontact_list_item_background.xml
@@ -0,0 +1,35 @@
+<?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.
+-->
+
+<!-- TODO These all have to be refined -->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item
+        android:state_window_focused="false"
+        android:drawable="@drawable/list_background_holo" />
+    <item
+        android:state_focused="true"
+        android:state_pressed="true"
+        android:drawable="@drawable/list_pressed_holo" />
+    <item
+        android:state_focused="false"
+        android:state_pressed="true"
+        android:drawable="@drawable/list_pressed_holo" />
+    <item
+        android:state_focused="true"
+        android:drawable="@drawable/list_focused_holo" />
+    <item
+        android:drawable="@color/people_app_theme_color" />
+</selector>
diff --git a/res/drawable/quickcontact_slider_btn.xml b/res/drawable/quickcontact_slider_btn.xml
deleted file mode 100644
index b3d0ec7..0000000
--- a/res/drawable/quickcontact_slider_btn.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2009 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:dither="true">
-    <!-- TODO Still a hack. This needs a default from the framework instead for the checked state -->
-    <item android:state_checked="true"
-        android:drawable="@drawable/quickactions_icon_activated" />
-    <item android:state_window_focused="false"
-        android:drawable="@android:color/transparent" />
-    <item android:state_pressed="true"
-        android:drawable="@drawable/quickactions_icon_activated" />
-    <item android:state_focused="true"
-        android:drawable="@drawable/quickactions_icon_activated" />
-    <item
-        android:drawable="@android:color/transparent" />
-</selector>
diff --git a/res/layout/quickcontact_header_small.xml b/res/drawable/quickcontact_track_background.xml
similarity index 67%
rename from res/layout/quickcontact_header_small.xml
rename to res/drawable/quickcontact_track_background.xml
index f3a46d5..fcf61fd 100644
--- a/res/layout/quickcontact_header_small.xml
+++ b/res/drawable/quickcontact_track_background.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2009 The Android Open Source Project
+<!-- 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.
@@ -14,9 +14,6 @@
      limitations under the License.
 -->
 
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/header_small"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:orientation="horizontal" />
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+    android:src="@drawable/quickcon_background_texture"
+    android:tileMode="repeat" />
diff --git a/res/layout-finger/quickcontact_item_nodata.xml b/res/layout-finger/quickcontact_item_nodata.xml
deleted file mode 100644
index 5f951e2..0000000
--- a/res/layout-finger/quickcontact_item_nodata.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<TextView
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:paddingLeft="12dip"
-    android:paddingRight="12dip"
-    android:scaleType="centerInside"
-    android:focusable="false"
-    android:clickable="false"
-    android:gravity="center_vertical"
-    android:textColor="@android:color/black"
-    android:text="@string/quickcontact_no_data" />
diff --git a/res/layout-sw580dp/quickcontact_activity.xml b/res/layout-sw580dp/quickcontact_activity.xml
new file mode 100644
index 0000000..6b381a9
--- /dev/null
+++ b/res/layout-sw580dp/quickcontact_activity.xml
@@ -0,0 +1,42 @@
+<?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.
+-->
+<view
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    class="com.android.contacts.quickcontact.FloatingChildLayout"
+    android:id="@+id/floating_layout"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:focusable="true"
+    android:focusableInTouchMode="true"
+    android:descendantFocusability="afterDescendants">
+    <LinearLayout
+        android:id="@android:id/content"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:orientation="vertical">
+        <include layout="@layout/quickcontact_photo_container" />
+        <View
+            android:id="@+id/line_before_track"
+            android:layout_width="match_parent"
+            android:layout_height="2dip"
+            android:background="@color/quickcontact_list_background" />
+        <include layout="@layout/quickcontact_track" />
+        <android.support.v4.view.ViewPager
+            android:id="@+id/item_list_pager"
+            android:layout_width="match_parent"
+            android:layout_height="180dip" />
+    </LinearLayout>
+</view>
diff --git a/res/layout-w470dp/contact_detail_fragment.xml b/res/layout-w470dp/contact_detail_fragment.xml
index 17cbc2d..5a48583 100644
--- a/res/layout-w470dp/contact_detail_fragment.xml
+++ b/res/layout-w470dp/contact_detail_fragment.xml
@@ -14,17 +14,28 @@
      limitations under the License.
 -->
 
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@+id/contact_detail"
-    android:orientation="vertical"
     android:layout_width="match_parent"
     android:layout_height="match_parent">
 
+     <!-- "QuickFix"- button (Copy to local contact, add to group) -->
+    <Button
+        android:id="@+id/contact_quick_fix"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:visibility="gone"
+        android:layout_alignParentRight="true"
+        android:layout_alignParentBottom="true"
+        android:layout_marginRight="40dip"
+        android:layout_marginTop="20dip"
+        android:layout_marginBottom="20dip" />
+
     <LinearLayout
         android:orientation="horizontal"
         android:layout_width="match_parent"
-        android:layout_height="0px"
-        android:layout_weight="1" >
+        android:layout_above="@id/contact_quick_fix"
+        android:layout_height="match_parent" >
 
         <ImageView android:id="@+id/photo"
             android:scaleType="centerCrop"
@@ -41,12 +52,11 @@
             android:layout_weight="1"
             android:divider="@null"/>
 
-   </LinearLayout>
+    </LinearLayout>
 
     <ScrollView android:id="@android:id/empty"
         android:layout_width="match_parent"
         android:layout_height="0px"
-        android:layout_weight="1"
         android:visibility="gone">
         <TextView android:id="@+id/emptyText"
             android:layout_width="match_parent"
@@ -60,17 +70,6 @@
             android:lineSpacingMultiplier="0.92"/>
     </ScrollView>
 
-    <!-- "QuickFix"- button (Copy to local contact, add to group) -->
-    <Button
-        android:id="@+id/contact_quick_fix"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:visibility="gone"
-        android:layout_gravity="right"
-        android:layout_marginRight="40dip"
-        android:layout_marginTop="20dip"
-        android:layout_marginBottom="20dip" />
-
     <View
         android:id="@+id/alpha_overlay"
         android:layout_width="match_parent"
@@ -89,5 +88,5 @@
         android:layout_alignParentTop="true"
         android:background="@android:color/transparent"
         android:visibility="gone"/>
-</LinearLayout>
+</RelativeLayout>
 
diff --git a/res/layout-w470dp/quickcontact_activity.xml b/res/layout-w470dp/quickcontact_activity.xml
new file mode 100644
index 0000000..df68761
--- /dev/null
+++ b/res/layout-w470dp/quickcontact_activity.xml
@@ -0,0 +1,44 @@
+<?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.
+-->
+<view
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    class="com.android.contacts.quickcontact.FloatingChildLayout"
+    android:id="@+id/floating_layout"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:focusable="true"
+    android:focusableInTouchMode="true"
+    android:descendantFocusability="afterDescendants">
+    <LinearLayout
+        android:id="@android:id/content"
+        android:layout_width="match_parent"
+        android:layout_height="@dimen/quick_contact_picture_height"
+        android:padding="32dip"
+        android:orientation="horizontal">
+        <include layout="@layout/quickcontact_photo_container" />
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/quick_contact_picture_height"
+            android:orientation="vertical">
+            <include layout="@layout/quickcontact_track" />
+            <android.support.v4.view.ViewPager
+                android:id="@+id/item_list_pager"
+                android:background="@color/quickcontact_list_background"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent" />
+        </LinearLayout>
+    </LinearLayout>
+</view>
diff --git a/res/layout/quickcontact.xml b/res/layout/quickcontact.xml
deleted file mode 100644
index e2b291c..0000000
--- a/res/layout/quickcontact.xml
+++ /dev/null
@@ -1,136 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2009 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@android:id/content"
-    android:layout_width="@dimen/quick_contact_width"
-    android:layout_height="wrap_content"
-    android:visibility="invisible"
-    android:orientation="vertical">
-
-    <FrameLayout
-        android:id="@+id/header"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="10dip">
-
-        <ViewStub
-            android:id="@+id/header_small"
-            android:inflatedId="@+id/header_small"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout="@layout/quickcontact_header_small" />
-
-        <ViewStub
-            android:id="@+id/header_medium"
-            android:inflatedId="@+id/header_medium"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout="@layout/quickcontact_header_med" />
-
-        <ViewStub
-            android:id="@+id/header_large"
-            android:inflatedId="@+id/header_large"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout="@layout/quickcontact_header_large" />
-
-    </FrameLayout>
-
-    <HorizontalScrollView
-        android:id="@+id/scroll"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="5dip"
-        android:layout_marginLeft="15dip"
-        android:layout_marginRight="15dip"
-        android:layout_marginBottom="10dip"
-        android:fadingEdgeLength="0dip"
-        android:scrollbars="none">
-
-        <LinearLayout
-            android:id="@+id/quickcontact"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:orientation="horizontal" />
-    </HorizontalScrollView>
-
-    <FrameLayout
-        android:id="@+id/footer"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:visibility="gone">
-        <LinearLayout
-            android:id="@+id/footer_disambig"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:orientation="vertical"
-            android:visibility="gone">
-
-            <ListView
-                android:id="@android:id/list"
-                android:layout_width="match_parent"
-                android:layout_height="0dip"
-                android:layout_weight="1"
-                android:layout_marginLeft="5dip"
-                android:layout_marginRight="5dip"
-                android:cacheColorHint="@null" />
-
-            <CheckBox
-                android:id="@android:id/checkbox"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:layout_marginLeft="19dip"
-                android:layout_marginRight="19dip"
-                android:minHeight="60dip"
-                android:textColor="#f000"
-                android:textStyle="bold"
-                android:text="@string/quickcontact_remember_choice"
-                android:textAppearance="?android:attr/textAppearanceSmallInverse" />
-
-        </LinearLayout>
-
-        <LinearLayout
-            android:id="@+id/footer_clear_defaults"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:orientation="vertical"
-            android:visibility="gone">
-            <TextView
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:layout_marginLeft="30dip"
-                android:layout_marginRight="5dip"
-                android:textAppearance="?android:attr/textAppearanceMedium"
-                android:text="@string/quickcontact_clear_defaults_caption" />
-            <ListView
-                android:id="@+id/defaults_list"
-                android:layout_width="match_parent"
-                android:layout_height="0dip"
-                android:layout_weight="1"
-                android:layout_marginLeft="5dip"
-                android:layout_marginRight="5dip"
-                android:cacheColorHint="@null" />
-            <Button
-                android:id="@+id/clear_defaults_button"
-                android:layout_marginLeft="20dip"
-                android:layout_marginBottom="20dip"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="@string/quickcontact_clear_defaults_button" />
-        </LinearLayout>
-    </FrameLayout>
-</LinearLayout>
diff --git a/res/layout/quickcontact_activity.xml b/res/layout/quickcontact_activity.xml
index aced4a8..7aa2aa4 100644
--- a/res/layout/quickcontact_activity.xml
+++ b/res/layout/quickcontact_activity.xml
@@ -22,7 +22,23 @@
     android:focusable="true"
     android:focusableInTouchMode="true"
     android:descendantFocusability="afterDescendants">
-
-    <include layout="@layout/quickcontact" />
-
+    <LinearLayout
+        android:id="@android:id/content"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:paddingLeft="15dip"
+        android:paddingRight="15dip"
+        android:orientation="vertical">
+        <include layout="@layout/quickcontact_photo_container" />
+        <View
+            android:id="@+id/line_before_track"
+            android:layout_width="match_parent"
+            android:layout_height="2dip"
+            android:background="@color/quickcontact_list_background" />
+        <include layout="@layout/quickcontact_track" />
+        <android.support.v4.view.ViewPager
+            android:id="@+id/item_list_pager"
+            android:layout_width="match_parent"
+            android:layout_height="180dip" />
+    </LinearLayout>
 </view>
diff --git a/res/layout/quickcontact_default_item.xml b/res/layout/quickcontact_default_item.xml
deleted file mode 100755
index 3a918f0..0000000
--- a/res/layout/quickcontact_default_item.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:orientation="vertical"
-    android:paddingLeft="25dip"
-    android:paddingRight="25dip"
-    android:minHeight="?android:attr/listPreferredItemHeight"
-    android:gravity="center_vertical">
-
-    <TextView
-        android:id="@android:id/text1"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:textStyle="bold"
-        android:textAppearance="?android:attr/textAppearanceMedium" />
-
-    <TextView
-        android:id="@android:id/text2"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="-4dip"
-        android:textAppearance="?android:attr/textAppearanceSmall" />
-
-</LinearLayout>
diff --git a/res/layout/quickcontact_header_large.xml b/res/layout/quickcontact_header_large.xml
deleted file mode 100644
index b8a19cf..0000000
--- a/res/layout/quickcontact_header_large.xml
+++ /dev/null
@@ -1,79 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2009 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/header_large"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:minHeight="87dip"
-    android:gravity="center_vertical"
-    android:orientation="horizontal">
-
-    <ImageView
-        android:id="@+id/photo"
-        android:layout_width="64dip"
-        android:layout_height="64dip"
-        android:layout_marginLeft="15dip" />
-
-    <LinearLayout
-        android:layout_width="0dip"
-        android:layout_height="wrap_content"
-        android:layout_weight="1"
-        android:layout_marginLeft="15dip"
-        android:paddingRight="8dip"
-        android:orientation="vertical">
-
-        <TextView
-            android:id="@+id/name"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:singleLine="true"
-            android:ellipsize="end"
-            android:textColor="@*android:color/primary_text_light"
-            android:textStyle="bold"
-            android:textSize="18dip" />
-
-        <TextView
-            android:id="@+id/status"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:singleLine="true"
-            android:ellipsize="end"
-            android:textColor="@*android:color/secondary_text_light"
-            android:textSize="15dip"
-            android:layout_marginTop="-3dip" />
-
-        <TextView
-            android:id="@+id/timestamp"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:singleLine="true"
-            android:ellipsize="end"
-            android:textColor="@*android:color/secondary_text_light"
-            android:textSize="12dip"
-            android:layout_marginTop="-2dip" />
-
-    </LinearLayout>
-
-    <ImageView
-        android:id="@+id/presence"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginRight="15dip"
-        android:scaleType="centerInside" />
-
-</LinearLayout>
diff --git a/res/layout/quickcontact_header_med.xml b/res/layout/quickcontact_header_med.xml
deleted file mode 100644
index 77cb1a5..0000000
--- a/res/layout/quickcontact_header_med.xml
+++ /dev/null
@@ -1,55 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2009 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/header_medium"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:minHeight="51dip"
-    android:gravity="center_vertical"
-    android:orientation="horizontal">
-
-    <LinearLayout
-        android:layout_width="0dip"
-        android:layout_height="wrap_content"
-        android:layout_weight="1"
-        android:layout_marginLeft="15dip"
-        android:layout_marginRight="15dip"
-        android:orientation="vertical">
-
-        <TextView
-            android:id="@+id/status"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:singleLine="true"
-            android:ellipsize="end"
-            android:textColor="@*android:color/primary_text_light"
-            android:textSize="15sp" />
-
-        <TextView
-            android:id="@+id/timestamp"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:singleLine="true"
-            android:ellipsize="end"
-            android:textColor="@*android:color/secondary_text_light"
-            android:textSize="12sp"
-            android:layout_marginTop="-2dip" />
-
-    </LinearLayout>
-
-</LinearLayout>
diff --git a/res/layout/quickcontact_list_fragment.xml b/res/layout/quickcontact_list_fragment.xml
new file mode 100755
index 0000000..8c62c4c
--- /dev/null
+++ b/res/layout/quickcontact_list_fragment.xml
@@ -0,0 +1,35 @@
+<?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.
+-->
+
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content">
+    <!-- Line that looks like a list divider -->
+    <View
+        android:layout_width="match_parent"
+        android:layout_height="1dip"
+        android:background="@color/quickcontact_list_divider" />
+    <ListView
+        android:id="@+id/list"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:divider="@color/quickcontact_list_divider"
+        android:dividerHeight="1dip"
+        android:background="@color/quickcontact_list_background"
+        android:cacheColorHint="@null" />
+</LinearLayout>
diff --git a/res/layout/quickcontact_list_item.xml b/res/layout/quickcontact_list_item.xml
new file mode 100755
index 0000000..f77ed3f
--- /dev/null
+++ b/res/layout/quickcontact_list_item.xml
@@ -0,0 +1,60 @@
+<?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.
+-->
+
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:orientation="horizontal"
+    android:background="@drawable/quickcontact_list_item_background"
+    android:minHeight="?android:attr/listPreferredItemHeight"
+    android:gravity="center_vertical">
+    <LinearLayout
+        android:layout_width="0dip"
+        android:layout_height="wrap_content"
+        android:layout_weight="1"
+        android:orientation="vertical"
+        android:paddingLeft="16dip"
+        android:paddingRight="16dip"
+        android:gravity="center_vertical">
+        <TextView
+            android:id="@android:id/text1"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:textColor="@android:color/white"
+            android:textAppearance="?android:attr/textAppearanceMedium" />
+        <TextView
+            android:id="@android:id/text2"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:textColor="@android:color/white"
+            android:textAppearance="?android:attr/textAppearanceSmall" />
+    </LinearLayout>
+    <View
+        android:id="@+id/vertical_divider"
+        android:layout_width="1dip"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center_vertical"
+        android:background="@drawable/ic_divider_dashed_holo_dark" />
+    <ImageView
+        android:id="@+id/secondary_action_button"
+        android:layout_width="wrap_content"
+        android:layout_height="match_parent"
+        android:paddingLeft="@dimen/detail_item_icon_margin"
+        android:paddingRight="@dimen/detail_item_icon_margin"
+        android:background="@drawable/quickcontact_list_item_background"
+        android:duplicateParentState="false" />
+</LinearLayout>
diff --git a/res/layout/quickcontact_photo_container.xml b/res/layout/quickcontact_photo_container.xml
new file mode 100644
index 0000000..3e0c935
--- /dev/null
+++ b/res/layout/quickcontact_photo_container.xml
@@ -0,0 +1,90 @@
+<?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.
+-->
+<merge
+    xmlns:android="http://schemas.android.com/apk/res/android">
+    <RelativeLayout
+        android:id="@+id/photo_container"
+        android:layout_width="@dimen/quick_contact_picture_width"
+        android:layout_height="@dimen/quick_contact_picture_height"
+        android:gravity="center_vertical">
+        <ImageView
+            android:id="@+id/photo"
+            android:layout_width="fill_parent"
+            android:layout_height="fill_parent"
+            android:scaleType="centerCrop" />
+        <View
+            android:id="@+id/photo_text_bar"
+            android:layout_width="0dip"
+            android:layout_height="42dip"
+            android:layout_alignBottom="@id/photo"
+            android:layout_alignLeft="@id/photo"
+            android:layout_alignRight="@id/photo"
+            android:alpha="0.5"
+            android:background="@android:color/black" />
+        <ImageButton
+            android:id="@+id/open_details_button"
+            android:src="@drawable/ic_fav_quickcontact_holo_dark"
+            android:background="?android:attr/selectableItemBackground"
+            android:layout_height="wrap_content"
+            android:layout_width="wrap_content"
+            android:layout_marginRight="16dip"
+            android:layout_marginBottom="5dip"
+            android:layout_alignBottom="@id/photo_text_bar"
+            android:layout_alignRight="@id/photo_text_bar" />
+        <TextView
+            android:id="@+id/name"
+            android:layout_width="wrap_content"
+            android:layout_height="42dip"
+            android:layout_alignBottom="@id/photo"
+            android:layout_alignLeft="@id/photo"
+            android:layout_toLeftOf="@id/open_details_button"
+            android:gravity="center_vertical"
+            android:paddingLeft="8dip"
+            android:singleLine="true"
+            android:ellipsize="end"
+            android:textColor="@android:color/white"
+            android:textAppearance="?android:attr/textAppearanceMedium" />
+        <TextView
+            android:id="@+id/status"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:singleLine="true"
+            android:ellipsize="end"
+            android:textColor="@*android:color/secondary_text_light"
+            android:textSize="15dip"
+            android:layout_marginTop="-3dip" />
+        <TextView
+            android:id="@+id/timestamp"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:singleLine="true"
+            android:ellipsize="end"
+            android:textColor="@*android:color/secondary_text_light"
+            android:textSize="12dip"
+            android:layout_marginTop="-2dip" />
+        <ImageView
+            android:id="@+id/presence"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginRight="15dip"
+            android:scaleType="centerInside" />
+        <ImageButton
+            android:id="@+id/open_details_push_layer"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:background="?android:attr/selectableItemBackground" />
+    </RelativeLayout>
+</merge>
diff --git a/res/layout/quickcontact_resolve_item.xml b/res/layout/quickcontact_resolve_item.xml
deleted file mode 100755
index 2805722..0000000
--- a/res/layout/quickcontact_resolve_item.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2009 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:orientation="vertical"
-    android:paddingLeft="25dip"
-    android:paddingRight="25dip"
-    android:minHeight="?android:attr/listPreferredItemHeight"
-    android:gravity="center_vertical">
-
-    <TextView
-        android:id="@android:id/text1"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:textStyle="bold"
-        android:textAppearance="?android:attr/textAppearanceMedium" />
-
-    <TextView
-        android:id="@android:id/text2"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="-4dip"
-        android:textAppearance="?android:attr/textAppearanceSmall" />
-
-</LinearLayout>
diff --git a/res/layout/quickcontact_track.xml b/res/layout/quickcontact_track.xml
new file mode 100644
index 0000000..8177174
--- /dev/null
+++ b/res/layout/quickcontact_track.xml
@@ -0,0 +1,42 @@
+<?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.
+-->
+<merge
+    xmlns:android="http://schemas.android.com/apk/res/android">
+    <HorizontalScrollView
+        android:id="@+id/track_scroller"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:fadingEdgeLength="0dip"
+        android:background="@drawable/quickcontact_track_background"
+        android:scrollbars="none">
+        <RelativeLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content">
+            <LinearLayout
+                android:id="@+id/track"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:orientation="horizontal" />
+            <View
+                android:id="@+id/selected_tab_rectangle"
+                android:layout_width="60dip"
+                android:layout_height="8dip"
+                android:layout_alignBottom="@id/track"
+                android:layout_alignParentLeft="true"
+                android:background="@color/quickcontact_list_background" />
+        </RelativeLayout>
+    </HorizontalScrollView>
+</merge>
diff --git a/res/layout/quickcontact_item.xml b/res/layout/quickcontact_track_button.xml
similarity index 87%
rename from res/layout/quickcontact_item.xml
rename to res/layout/quickcontact_track_button.xml
index ca57d66..f1353f2 100644
--- a/res/layout/quickcontact_item.xml
+++ b/res/layout/quickcontact_track_button.xml
@@ -4,9 +4,9 @@
      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.
@@ -16,8 +16,8 @@
 
 <com.android.contacts.quickcontact.CheckableImageView
     xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="59dip"
-    android:layout_height="51dip"
+    android:layout_width="60dip"
+    android:layout_height="60dip"
     android:paddingLeft="12dip"
     android:paddingRight="12dip"
     android:paddingTop="8dip"
@@ -25,4 +25,4 @@
     android:scaleType="centerInside"
     android:focusable="true"
     android:clickable="true"
-    android:background="@drawable/quickcontact_slider_btn" />
+    android:background="?android:attr/selectableItemBackground" />
diff --git a/res/values-sw580dp-w1000dp/dimens.xml b/res/values-sw580dp-w1000dp/dimens.xml
index ac30b76..7ff9026 100644
--- a/res/values-sw580dp-w1000dp/dimens.xml
+++ b/res/values-sw580dp-w1000dp/dimens.xml
@@ -14,7 +14,6 @@
      limitations under the License.
 -->
 <resources>
-    <dimen name="quick_contact_width">452dip</dimen>
     <dimen name="action_bar_filter_min_width">220dip</dimen>
     <dimen name="action_bar_filter_max_width">300dip</dimen>
     <dimen name="action_bar_search_max_width">336dip</dimen>
diff --git a/res/values-sw580dp/dimens.xml b/res/values-sw580dp/dimens.xml
index 9fbdc8e..60da57a 100644
--- a/res/values-sw580dp/dimens.xml
+++ b/res/values-sw580dp/dimens.xml
@@ -23,7 +23,6 @@
     <dimen name="editor_field_top_padding">12dip</dimen>
     <dimen name="editor_field_bottom_padding">12dip</dimen>
     <dimen name="detail_item_side_margin">19dip</dimen>
-    <dimen name="quick_contact_width">356dip</dimen>
     <dimen name="contact_name_text_size">26sp</dimen>
     <dimen name="action_bar_filter_min_width">120dip</dimen>
     <dimen name="action_bar_filter_max_width">120dip</dimen>
@@ -37,4 +36,7 @@
     <dimen name="search_view_width">400dip</dimen>
     <dimen name="contact_browser_list_left_margin">0dip</dimen>
     <dimen name="contacts_count_right_margin">24dip</dimen>
+    <dimen name="quick_contact_top_position">-1px</dimen>
+    <dimen name="quick_contact_picture_width">400dip</dimen>
+    <dimen name="quick_contact_picture_height">200dip</dimen>
 </resources>
diff --git a/res/values-w470dp/dimens.xml b/res/values-w470dp/dimens.xml
index ba7f3f8..c77d8c2 100644
--- a/res/values-w470dp/dimens.xml
+++ b/res/values-w470dp/dimens.xml
@@ -15,4 +15,7 @@
 -->
 <resources>
     <dimen name="detail_tab_carousel_height">0dip</dimen>
+    <dimen name="quick_contact_top_position">-1px</dimen>
+    <dimen name="quick_contact_picture_width">174dip</dimen>
+    <dimen name="quick_contact_picture_height">-1px</dimen>
 </resources>
diff --git a/res/values/colors.xml b/res/values/colors.xml
index 579bf84..325d2e7 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -17,8 +17,8 @@
     <color name="textColorIconOverlay">#fff</color>
     <color name="textColorIconOverlayShadow">#000</color>
 
-    <color name="quickcontact_disambig">#f2f2f2</color>
-    <color name="quickcontact_disambig_divider">#afafaf</color>
+    <color name="quickcontact_list_divider">#ff48bde8</color>
+    <color name="quickcontact_list_background">#ff33b5e6</color>
 
     <color name="edit_divider">#ff666666</color>
 
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 2b71c84..45aa75e 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -30,10 +30,17 @@
 
     <dimen name="photo_action_popup_width">400dip</dimen>
 
-    <!-- Width of the quick contact popup. This size is chosen so that the last icon is clipped
-    to indicate horizontal scrollability. Also, this size is the same as the widget to make them
-    aligned -->
-    <dimen name="quick_contact_width">352dip</dimen>
+    <!-- Top position of quick contact. If this is -1, the vertical position is determined
+    based on the source of the request -->
+    <dimen name="quick_contact_top_position">48dip</dimen>
+
+    <!-- Width of the picture in the QuickContact popup. This can be -1 for the full width
+    of the parent -->
+    <dimen name="quick_contact_picture_width">-1px</dimen>
+
+    <!-- Height of the picture in the QuickContact popup. This can be -1 for the full height
+    of the parent -->
+    <dimen name="quick_contact_picture_height">174dip</dimen>
 
     <!-- Padding of the rounded plus/minus/expand/collapse buttons in the editor  -->
     <dimen name="editor_round_button_padding_left">2dip</dimen>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 1ca7158..999531e 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1015,32 +1015,13 @@
     <!-- Message next to disamgiguation dialog check box -->
     <string name="make_primary">Remember this choice</string>
 
-    <!-- Shown as a toast when the user taps on a Fast-Track icon, and no application
+    <!-- Shown as a toast when the user taps on a QuickContact icon, and no application
          was found that could perform the selected action -->
     <string name="quickcontact_missing_app">No application found to handle this action</string>
 
-    <!-- Shown as the checkbox label that, when checked, will store remember the
-         selected choice and shortcut to it in the future.  For example, this would
-         make a selected phone number the default. -->
-    <string name="quickcontact_remember_choice">Remember this choice</string>
-
     <!-- Shown as the header name for a person when the name is missing or unknown. -->
     <string name="quickcontact_missing_name">Unknown</string>
 
-    <!-- Text that is shown in the Badge, when there is no data to display -->
-    <string name="quickcontact_no_data">No data</string>
-
-    <!-- Accessibility description for the button in QuickContacts that allows the user to clear
-    defaults of a contact (like primary email). [CHAR LIMIT=100] -->
-    <string name="quickcontact_clear_defaults_description">Clear defaults</string>
-
-    <!-- Caption that shows above the list of defaults (like primary email). [CHAR LIMIT=40] -->
-    <string name="quickcontact_clear_defaults_caption">Defaults set for this contact:</string>
-
-    <!-- Button caption that allows the user to clear the defaults  (like primary email) of one
-    contact. [CHAR LIMIT=15] -->
-    <string name="quickcontact_clear_defaults_button">Clear</string>
-
     <!-- The menu item to open the list of accounts -->
     <string name="menu_accounts">Accounts</string>
 
diff --git a/res/values/styles.xml b/res/values/styles.xml
index c23d99d..785c887 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -101,7 +101,7 @@
         <item name="android:windowContentOverlay">@null</item>
         <item name="android:windowAnimationStyle">@null</item>
         <item name="android:windowIsFloating">false</item>
-        <item name="android:backgroundDimEnabled">false</item>
+        <item name="android:backgroundDimEnabled">true</item>
         <item name="android:windowIsTranslucent">true</item>
         <item name="android:windowNoTitle">true</item>
     </style>
diff --git a/src/com/android/contacts/ContactLoader.java b/src/com/android/contacts/ContactLoader.java
index f2a9d13..9daa1e0 100644
--- a/src/com/android/contacts/ContactLoader.java
+++ b/src/com/android/contacts/ContactLoader.java
@@ -114,7 +114,7 @@
         private final ArrayList<Entity> mEntities;
         private ArrayList<StreamItemEntry> mStreamItems;
         private final HashMap<Long, DataStatus> mStatuses;
-        private final ArrayList<String> mInvitableAccountTypes;
+        private final ArrayList<AccountType> mInvitableAccountTypes;
 
         private String mDirectoryDisplayName;
         private String mDirectoryType;
@@ -292,7 +292,7 @@
             return mPresence;
         }
 
-        public ArrayList<String> getInvitableAccontTypes() {
+        public ArrayList<AccountType> getInvitableAccountTypes() {
             return mInvitableAccountTypes;
         }
 
@@ -420,6 +420,8 @@
 
                 RawContacts.ACCOUNT_NAME,
                 RawContacts.ACCOUNT_TYPE,
+                RawContacts.DATA_SET,
+                RawContacts.ACCOUNT_TYPE_AND_DATA_SET,
                 RawContacts.DIRTY,
                 RawContacts.VERSION,
                 RawContacts.SOURCE_ID,
@@ -489,55 +491,57 @@
 
         public final static int ACCOUNT_NAME = 15;
         public final static int ACCOUNT_TYPE = 16;
-        public final static int DIRTY = 17;
-        public final static int VERSION = 18;
-        public final static int SOURCE_ID = 19;
-        public final static int SYNC1 = 20;
-        public final static int SYNC2 = 21;
-        public final static int SYNC3 = 22;
-        public final static int SYNC4 = 23;
-        public final static int DELETED = 24;
-        public final static int NAME_VERIFIED = 25;
+        public final static int DATA_SET = 17;
+        public final static int ACCOUNT_TYPE_AND_DATA_SET = 18;
+        public final static int DIRTY = 19;
+        public final static int VERSION = 20;
+        public final static int SOURCE_ID = 21;
+        public final static int SYNC1 = 22;
+        public final static int SYNC2 = 23;
+        public final static int SYNC3 = 24;
+        public final static int SYNC4 = 25;
+        public final static int DELETED = 26;
+        public final static int NAME_VERIFIED = 27;
 
-        public final static int DATA_ID = 26;
-        public final static int DATA1 = 27;
-        public final static int DATA2 = 28;
-        public final static int DATA3 = 29;
-        public final static int DATA4 = 30;
-        public final static int DATA5 = 31;
-        public final static int DATA6 = 32;
-        public final static int DATA7 = 33;
-        public final static int DATA8 = 34;
-        public final static int DATA9 = 35;
-        public final static int DATA10 = 36;
-        public final static int DATA11 = 37;
-        public final static int DATA12 = 38;
-        public final static int DATA13 = 39;
-        public final static int DATA14 = 40;
-        public final static int DATA15 = 41;
-        public final static int DATA_SYNC1 = 42;
-        public final static int DATA_SYNC2 = 43;
-        public final static int DATA_SYNC3 = 44;
-        public final static int DATA_SYNC4 = 45;
-        public final static int DATA_VERSION = 46;
-        public final static int IS_PRIMARY = 47;
-        public final static int IS_SUPERPRIMARY = 48;
-        public final static int MIMETYPE = 49;
-        public final static int RES_PACKAGE = 50;
+        public final static int DATA_ID = 28;
+        public final static int DATA1 = 29;
+        public final static int DATA2 = 30;
+        public final static int DATA3 = 31;
+        public final static int DATA4 = 32;
+        public final static int DATA5 = 33;
+        public final static int DATA6 = 34;
+        public final static int DATA7 = 35;
+        public final static int DATA8 = 36;
+        public final static int DATA9 = 37;
+        public final static int DATA10 = 38;
+        public final static int DATA11 = 39;
+        public final static int DATA12 = 40;
+        public final static int DATA13 = 41;
+        public final static int DATA14 = 42;
+        public final static int DATA15 = 43;
+        public final static int DATA_SYNC1 = 44;
+        public final static int DATA_SYNC2 = 45;
+        public final static int DATA_SYNC3 = 46;
+        public final static int DATA_SYNC4 = 47;
+        public final static int DATA_VERSION = 48;
+        public final static int IS_PRIMARY = 49;
+        public final static int IS_SUPERPRIMARY = 50;
+        public final static int MIMETYPE = 51;
+        public final static int RES_PACKAGE = 52;
 
-        public final static int GROUP_SOURCE_ID = 51;
+        public final static int GROUP_SOURCE_ID = 53;
 
-        public final static int PRESENCE = 52;
-        public final static int CHAT_CAPABILITY = 53;
-        public final static int STATUS = 54;
-        public final static int STATUS_RES_PACKAGE = 55;
-        public final static int STATUS_ICON = 56;
-        public final static int STATUS_LABEL = 57;
-        public final static int STATUS_TIMESTAMP = 58;
+        public final static int PRESENCE = 54;
+        public final static int CHAT_CAPABILITY = 55;
+        public final static int STATUS = 56;
+        public final static int STATUS_RES_PACKAGE = 57;
+        public final static int STATUS_ICON = 58;
+        public final static int STATUS_LABEL = 59;
+        public final static int STATUS_TIMESTAMP = 60;
 
-        public final static int PHOTO_URI = 59;
-        public final static int SEND_TO_VOICEMAIL = 60;
-        public final static int CUSTOM_RINGTONE = 61;
+        public final static int PHOTO_URI = 61;
+        public final static int SEND_TO_VOICEMAIL = 62;
+        public final static int CUSTOM_RINGTONE = 63;
     }
 
     /**
@@ -565,6 +569,8 @@
         final static String[] COLUMNS = new String[] {
             Groups.ACCOUNT_NAME,
             Groups.ACCOUNT_TYPE,
+            Groups.DATA_SET,
+            Groups.ACCOUNT_TYPE_AND_DATA_SET,
             Groups._ID,
             Groups.TITLE,
             Groups.AUTO_ADD,
@@ -573,10 +579,12 @@
 
         public final static int ACCOUNT_NAME = 0;
         public final static int ACCOUNT_TYPE = 1;
-        public final static int ID = 2;
-        public final static int TITLE = 3;
-        public final static int AUTO_ADD = 4;
-        public final static int FAVORITES = 5;
+        public final static int DATA_SET = 2;
+        public final static int ACCOUNT_TYPE_AND_DATA_SET = 3;
+        public final static int ID = 4;
+        public final static int TITLE = 5;
+        public final static int AUTO_ADD = 6;
+        public final static int FAVORITES = 7;
     }
 
     private final class LoadContactTask extends AsyncTask<Void, Void, Result> {
@@ -773,7 +781,7 @@
             }
 
             // Set to mInvitableAccountTypes
-            contactData.mInvitableAccountTypes.addAll(result.keySet());
+            contactData.mInvitableAccountTypes.addAll(result.values());
         }
 
         /**
@@ -825,6 +833,8 @@
 
             cursorColumnToContentValues(cursor, cv, ContactQuery.ACCOUNT_NAME);
             cursorColumnToContentValues(cursor, cv, ContactQuery.ACCOUNT_TYPE);
+            cursorColumnToContentValues(cursor, cv, ContactQuery.DATA_SET);
+            cursorColumnToContentValues(cursor, cv, ContactQuery.ACCOUNT_TYPE_AND_DATA_SET);
             cursorColumnToContentValues(cursor, cv, ContactQuery.DIRTY);
             cursorColumnToContentValues(cursor, cv, ContactQuery.VERSION);
             cursorColumnToContentValues(cursor, cv, ContactQuery.SOURCE_ID);
@@ -946,14 +956,23 @@
                 ContentValues values = entity.getEntityValues();
                 String accountName = values.getAsString(RawContacts.ACCOUNT_NAME);
                 String accountType = values.getAsString(RawContacts.ACCOUNT_TYPE);
+                String dataSet = values.getAsString(RawContacts.DATA_SET);
                 if (accountName != null && accountType != null) {
                     if (selection.length() != 0) {
                         selection.append(" OR ");
                     }
                     selection.append(
-                            "(" + Groups.ACCOUNT_NAME + "=? AND " + Groups.ACCOUNT_TYPE + "=?)");
+                            "(" + Groups.ACCOUNT_NAME + "=? AND " + Groups.ACCOUNT_TYPE + "=?");
                     selectionArgs.add(accountName);
                     selectionArgs.add(accountType);
+
+                    if (dataSet != null) {
+                        selection.append(" AND " + Groups.DATA_SET + "=?");
+                        selectionArgs.add(dataSet);
+                    } else {
+                        selection.append(" AND " + Groups.DATA_SET + " IS NULL");
+                    }
+                    selection.append(")");
                 }
             }
             Cursor cursor = getContext().getContentResolver().query(Groups.CONTENT_URI,
@@ -963,6 +982,7 @@
                 while (cursor.moveToNext()) {
                     final String accountName = cursor.getString(GroupQuery.ACCOUNT_NAME);
                     final String accountType = cursor.getString(GroupQuery.ACCOUNT_TYPE);
+                    final String dataSet = cursor.getString(GroupQuery.DATA_SET);
                     final long groupId = cursor.getLong(GroupQuery.ID);
                     final String title = cursor.getString(GroupQuery.TITLE);
                     final boolean defaultGroup = cursor.isNull(GroupQuery.AUTO_ADD)
@@ -973,7 +993,8 @@
                             : cursor.getInt(GroupQuery.FAVORITES) != 0;
 
                     result.addGroupMetaData(new GroupMetaData(
-                            accountName, accountType, groupId, title, defaultGroup, favorites));
+                            accountName, accountType, dataSet, groupId, title, defaultGroup,
+                            favorites));
                 }
             } finally {
                 cursor.close();
diff --git a/src/com/android/contacts/ContactSaveService.java b/src/com/android/contacts/ContactSaveService.java
index e2ab6b0..221796a 100644
--- a/src/com/android/contacts/ContactSaveService.java
+++ b/src/com/android/contacts/ContactSaveService.java
@@ -17,12 +17,12 @@
 package com.android.contacts;
 
 import com.android.contacts.model.AccountTypeManager;
+import com.android.contacts.model.AccountWithDataSet;
 import com.android.contacts.model.EntityDeltaList;
 import com.android.contacts.model.EntityModifier;
 import com.google.android.collect.Lists;
 import com.google.android.collect.Sets;
 
-import android.accounts.Account;
 import android.app.Activity;
 import android.app.IntentService;
 import android.content.ContentProviderOperation;
@@ -68,6 +68,7 @@
 
     public static final String EXTRA_ACCOUNT_NAME = "accountName";
     public static final String EXTRA_ACCOUNT_TYPE = "accountType";
+    public static final String EXTRA_DATA_SET = "dataSet";
     public static final String EXTRA_CONTENT_VALUES = "contentValues";
     public static final String EXTRA_CALLBACK_INTENT = "callbackIntent";
 
@@ -203,14 +204,15 @@
      * using data presented as a set of ContentValues.
      */
     public static Intent createNewRawContactIntent(Context context,
-            ArrayList<ContentValues> values, Account account, Class<?> callbackActivity,
-            String callbackAction) {
+            ArrayList<ContentValues> values, AccountWithDataSet account,
+            Class<?> callbackActivity, String callbackAction) {
         Intent serviceIntent = new Intent(
                 context, ContactSaveService.class);
         serviceIntent.setAction(ContactSaveService.ACTION_NEW_RAW_CONTACT);
         if (account != null) {
             serviceIntent.putExtra(ContactSaveService.EXTRA_ACCOUNT_NAME, account.name);
             serviceIntent.putExtra(ContactSaveService.EXTRA_ACCOUNT_TYPE, account.type);
+            serviceIntent.putExtra(ContactSaveService.EXTRA_DATA_SET, account.dataSet);
         }
         serviceIntent.putParcelableArrayListExtra(
                 ContactSaveService.EXTRA_CONTENT_VALUES, values);
@@ -227,6 +229,7 @@
     private void createRawContact(Intent intent) {
         String accountName = intent.getStringExtra(EXTRA_ACCOUNT_NAME);
         String accountType = intent.getStringExtra(EXTRA_ACCOUNT_TYPE);
+        String dataSet = intent.getStringExtra(EXTRA_DATA_SET);
         List<ContentValues> valueList = intent.getParcelableArrayListExtra(EXTRA_CONTENT_VALUES);
         Intent callbackIntent = intent.getParcelableExtra(EXTRA_CALLBACK_INTENT);
 
@@ -234,6 +237,7 @@
         operations.add(ContentProviderOperation.newInsert(RawContacts.CONTENT_URI)
                 .withValue(RawContacts.ACCOUNT_NAME, accountName)
                 .withValue(RawContacts.ACCOUNT_TYPE, accountType)
+                .withValue(RawContacts.DATA_SET, dataSet)
                 .build());
 
         int size = valueList.size();
@@ -392,14 +396,14 @@
      * @param callbackActivity is the activity to send the callback intent to
      * @param callbackAction is the intent action for the callback intent
      */
-
-    public static Intent createNewGroupIntent(Context context, Account account,
+    public static Intent createNewGroupIntent(Context context, AccountWithDataSet account,
             String label, long[] rawContactsToAdd, Class<?> callbackActivity,
             String callbackAction) {
         Intent serviceIntent = new Intent(context, ContactSaveService.class);
         serviceIntent.setAction(ContactSaveService.ACTION_CREATE_GROUP);
         serviceIntent.putExtra(ContactSaveService.EXTRA_ACCOUNT_TYPE, account.type);
         serviceIntent.putExtra(ContactSaveService.EXTRA_ACCOUNT_NAME, account.name);
+        serviceIntent.putExtra(ContactSaveService.EXTRA_DATA_SET, account.dataSet);
         serviceIntent.putExtra(ContactSaveService.EXTRA_GROUP_LABEL, label);
         serviceIntent.putExtra(ContactSaveService.EXTRA_RAW_CONTACTS_TO_ADD, rawContactsToAdd);
 
@@ -413,14 +417,16 @@
     }
 
     private void createGroup(Intent intent) {
-        final String accountType = intent.getStringExtra(EXTRA_ACCOUNT_TYPE);
-        final String accountName = intent.getStringExtra(EXTRA_ACCOUNT_NAME);
-        final String label = intent.getStringExtra(EXTRA_GROUP_LABEL);
+        String accountType = intent.getStringExtra(EXTRA_ACCOUNT_TYPE);
+        String accountName = intent.getStringExtra(EXTRA_ACCOUNT_NAME);
+        String dataSet = intent.getStringExtra(EXTRA_DATA_SET);
+        String label = intent.getStringExtra(EXTRA_GROUP_LABEL);
         final long[] rawContactsToAdd = intent.getLongArrayExtra(EXTRA_RAW_CONTACTS_TO_ADD);
 
         ContentValues values = new ContentValues();
         values.put(Groups.ACCOUNT_TYPE, accountType);
         values.put(Groups.ACCOUNT_NAME, accountName);
+        values.put(Groups.DATA_SET, dataSet);
         values.put(Groups.TITLE, label);
 
         final ContentResolver resolver = getContentResolver();
diff --git a/src/com/android/contacts/GroupListLoader.java b/src/com/android/contacts/GroupListLoader.java
index f5716e3..39c428f 100644
--- a/src/com/android/contacts/GroupListLoader.java
+++ b/src/com/android/contacts/GroupListLoader.java
@@ -31,6 +31,7 @@
     private final static String[] COLUMNS = new String[] {
         Groups.ACCOUNT_NAME,
         Groups.ACCOUNT_TYPE,
+        Groups.DATA_SET,
         Groups._ID,
         Groups.TITLE,
         Groups.ACTION,
@@ -41,12 +42,13 @@
 
     public final static int ACCOUNT_NAME = 0;
     public final static int ACCOUNT_TYPE = 1;
-    public final static int GROUP_ID = 2;
-    public final static int TITLE = 3;
-    public final static int ACTION = 4;
-    public final static int ACTION_URI = 5;
-    public final static int MEMBER_COUNT = 6;
-    public final static int GROUP_COUNT_PER_ACCOUNT = 7;
+    public final static int DATA_SET = 2;
+    public final static int GROUP_ID = 3;
+    public final static int TITLE = 4;
+    public final static int ACTION = 5;
+    public final static int ACTION_URI = 6;
+    public final static int MEMBER_COUNT = 7;
+    public final static int GROUP_COUNT_PER_ACCOUNT = 8;
 
     private static final Uri GROUP_LIST_URI = Groups.CONTENT_SUMMARY_URI.buildUpon()
             .appendQueryParameter(Groups.PARAM_RETURN_GROUP_COUNT_PER_ACCOUNT, "true").build();
@@ -55,7 +57,7 @@
         super(context, GROUP_LIST_URI, COLUMNS, Groups.ACCOUNT_TYPE + " NOT NULL AND "
                 + Groups.ACCOUNT_NAME + " NOT NULL AND " + Groups.AUTO_ADD + "=0 AND " +
                 Groups.FAVORITES + "=0 AND " + Groups.DELETED + "=0", null,
-                Groups.ACCOUNT_TYPE + ", " + Groups.ACCOUNT_NAME + ", " +
+                Groups.ACCOUNT_TYPE + ", " + Groups.ACCOUNT_NAME + ", " + Groups.DATA_SET + ", " +
                 Groups.TITLE + " COLLATE LOCALIZED ASC");
     }
 }
diff --git a/src/com/android/contacts/GroupMetaData.java b/src/com/android/contacts/GroupMetaData.java
index 39e955d..462ac4a 100644
--- a/src/com/android/contacts/GroupMetaData.java
+++ b/src/com/android/contacts/GroupMetaData.java
@@ -22,15 +22,17 @@
 public final class GroupMetaData {
     private String mAccountName;
     private String mAccountType;
+    private String mDataSet;
     private long mGroupId;
     private String mTitle;
     private boolean mDefaultGroup;
     private boolean mFavorites;
 
-    public GroupMetaData(String accountName, String accountType, long groupId, String title,
-            boolean defaultGroup, boolean favorites) {
+    public GroupMetaData(String accountName, String accountType, String dataSet, long groupId,
+            String title, boolean defaultGroup, boolean favorites) {
         this.mAccountName = accountName;
         this.mAccountType = accountType;
+        this.mDataSet = dataSet;
         this.mGroupId = groupId;
         this.mTitle = title;
         this.mDefaultGroup = defaultGroup;
@@ -45,6 +47,10 @@
         return mAccountType;
     }
 
+    public String getDataSet() {
+        return mDataSet;
+    }
+
     public long getGroupId() {
         return mGroupId;
     }
diff --git a/src/com/android/contacts/GroupMetaDataLoader.java b/src/com/android/contacts/GroupMetaDataLoader.java
index f11217c..2f3468b 100644
--- a/src/com/android/contacts/GroupMetaDataLoader.java
+++ b/src/com/android/contacts/GroupMetaDataLoader.java
@@ -29,6 +29,7 @@
     private final static String[] COLUMNS = new String[] {
         Groups.ACCOUNT_NAME,
         Groups.ACCOUNT_TYPE,
+        Groups.DATA_SET,
         Groups._ID,
         Groups.TITLE,
         Groups.AUTO_ADD,
@@ -41,14 +42,15 @@
 
     public final static int ACCOUNT_NAME = 0;
     public final static int ACCOUNT_TYPE = 1;
-    public final static int GROUP_ID = 2;
-    public final static int TITLE = 3;
-    public final static int AUTO_ADD = 4;
-    public final static int FAVORITES = 5;
-    public final static int IS_READ_ONLY = 6;
-    public final static int DELETED = 7;
-    public final static int ACTION = 8;
-    public final static int ACTION_URI = 9;
+    public final static int DATA_SET = 2;
+    public final static int GROUP_ID = 3;
+    public final static int TITLE = 4;
+    public final static int AUTO_ADD = 5;
+    public final static int FAVORITES = 6;
+    public final static int IS_READ_ONLY = 7;
+    public final static int DELETED = 8;
+    public final static int ACTION = 9;
+    public final static int ACTION_URI = 10;
 
     public GroupMetaDataLoader(Context context, Uri groupUri) {
         super(context, ensureIsGroupUri(groupUri), COLUMNS, Groups.ACCOUNT_TYPE + " NOT NULL AND "
diff --git a/src/com/android/contacts/SplitAggregateView.java b/src/com/android/contacts/SplitAggregateView.java
index d99ba85..091cd56 100644
--- a/src/com/android/contacts/SplitAggregateView.java
+++ b/src/com/android/contacts/SplitAggregateView.java
@@ -57,18 +57,20 @@
 
     private interface SplitQuery {
         String[] COLUMNS = new String[] {
-                Data.MIMETYPE, RawContacts.ACCOUNT_TYPE, Data.RAW_CONTACT_ID, Data.IS_PRIMARY,
-                StructuredName.DISPLAY_NAME, Nickname.NAME, Email.DATA, Phone.NUMBER
+                Data.MIMETYPE, RawContacts.ACCOUNT_TYPE, RawContacts.DATA_SET, Data.RAW_CONTACT_ID,
+                Data.IS_PRIMARY, StructuredName.DISPLAY_NAME, Nickname.NAME, Email.DATA,
+                Phone.NUMBER
         };
 
         int MIMETYPE = 0;
         int ACCOUNT_TYPE = 1;
-        int RAW_CONTACT_ID = 2;
-        int IS_PRIMARY = 3;
-        int DISPLAY_NAME = 4;
-        int NICKNAME = 5;
-        int EMAIL = 6;
-        int PHONE = 7;
+        int DATA_SET = 2;
+        int RAW_CONTACT_ID = 3;
+        int IS_PRIMARY = 4;
+        int DISPLAY_NAME = 5;
+        int NICKNAME = 6;
+        int EMAIL = 7;
+        int PHONE = 8;
     }
 
     private final Uri mAggregateUri;
@@ -116,6 +118,7 @@
     private static class RawContactInfo implements Comparable<RawContactInfo> {
         final long rawContactId;
         String accountType;
+        String dataSet;
         String name;
         String phone;
         String email;
@@ -165,6 +168,7 @@
                     info = new RawContactInfo(rawContactId);
                     rawContactInfos.put(rawContactId, info);
                     info.accountType = cursor.getString(SplitQuery.ACCOUNT_TYPE);
+                    info.dataSet = cursor.getString(SplitQuery.DATA_SET);
                 }
 
                 String mimetype = cursor.getString(SplitQuery.MIMETYPE);
@@ -247,7 +251,7 @@
             cache.additionalData.setText(info.getAdditionalData());
 
             Drawable icon = null;
-            AccountType accountType = mAccountTypes.getAccountType(info.accountType);
+            AccountType accountType = mAccountTypes.getAccountType(info.accountType, info.dataSet);
             if (accountType != null) {
                 icon = accountType.getDisplayIcon(getContext());
             }
diff --git a/src/com/android/contacts/TypePrecedence.java b/src/com/android/contacts/TypePrecedence.java
index e89c5aa..92f3a6e 100644
--- a/src/com/android/contacts/TypePrecedence.java
+++ b/src/com/android/contacts/TypePrecedence.java
@@ -100,8 +100,6 @@
     private static int[] getTypePrecedenceList(String mimetype) {
         if (mimetype.equals(Phone.CONTENT_ITEM_TYPE)) {
             return TYPE_PRECEDENCE_PHONES;
-        } else if (mimetype.equals(Constants.MIME_TYPE_SMS_ADDRESS)) {
-            return TYPE_PRECEDENCE_PHONES;
         } else if (mimetype.equals(Email.CONTENT_ITEM_TYPE)) {
             return TYPE_PRECEDENCE_EMAIL;
         } else if (mimetype.equals(StructuredPostal.CONTENT_ITEM_TYPE)) {
diff --git a/src/com/android/contacts/activities/AttachPhotoActivity.java b/src/com/android/contacts/activities/AttachPhotoActivity.java
index 1eabaf7..a697c29 100644
--- a/src/com/android/contacts/activities/AttachPhotoActivity.java
+++ b/src/com/android/contacts/activities/AttachPhotoActivity.java
@@ -217,7 +217,8 @@
         if (assertAccount) {
             // Make sure no pictures exist for Google, Exchange and unsynced phone accounts.
             operations.add(ContentProviderOperation.newAssertQuery(rawContactDataUri)
-                    .withSelection(Photo.MIMETYPE + "=? AND ("
+                    .withSelection(Photo.MIMETYPE + "=? AND "
+                            + RawContacts.DATA_SET + " IS NULL AND ("
                             + RawContacts.ACCOUNT_TYPE + " IN (?,?) OR "
                             + RawContacts.ACCOUNT_TYPE + " IS NULL)",
                             new String[] {Photo.CONTENT_ITEM_TYPE, GoogleAccountType.ACCOUNT_TYPE,
diff --git a/src/com/android/contacts/activities/ContactDetailActivity.java b/src/com/android/contacts/activities/ContactDetailActivity.java
index 797971c..02b7bac 100644
--- a/src/com/android/contacts/activities/ContactDetailActivity.java
+++ b/src/com/android/contacts/activities/ContactDetailActivity.java
@@ -19,7 +19,6 @@
 import com.android.contacts.ContactLoader;
 import com.android.contacts.ContactSaveService;
 import com.android.contacts.ContactsActivity;
-import com.android.contacts.ContactsSearchManager;
 import com.android.contacts.R;
 import com.android.contacts.detail.ContactDetailDisplayUtils;
 import com.android.contacts.detail.ContactDetailFragment;
@@ -29,9 +28,9 @@
 import com.android.contacts.detail.ContactLoaderFragment;
 import com.android.contacts.detail.ContactLoaderFragment.ContactLoaderFragmentListener;
 import com.android.contacts.interactions.ContactDeletionInteraction;
+import com.android.contacts.model.AccountWithDataSet;
 import com.android.contacts.util.PhoneCapabilityTester;
 
-import android.accounts.Account;
 import android.app.ActionBar;
 import android.app.Fragment;
 import android.app.FragmentManager;
@@ -395,7 +394,7 @@
 
         @Override
         public void onCreateRawContactRequested(
-                ArrayList<ContentValues> values, Account account) {
+                ArrayList<ContentValues> values, AccountWithDataSet account) {
             Toast.makeText(ContactDetailActivity.this, R.string.toast_making_personal_copy,
                     Toast.LENGTH_LONG).show();
             Intent serviceIntent = ContactSaveService.createNewRawContactIntent(
diff --git a/src/com/android/contacts/activities/ContactEditorActivity.java b/src/com/android/contacts/activities/ContactEditorActivity.java
index a5b3aab..54ea05f 100644
--- a/src/com/android/contacts/activities/ContactEditorActivity.java
+++ b/src/com/android/contacts/activities/ContactEditorActivity.java
@@ -17,18 +17,15 @@
 package com.android.contacts.activities;
 
 import com.android.contacts.ContactsActivity;
-import com.android.contacts.ContactsSearchManager;
 import com.android.contacts.R;
 import com.android.contacts.editor.ContactEditorFragment;
 import com.android.contacts.editor.ContactEditorFragment.SaveMode;
-import com.android.contacts.interactions.ContactDeletionInteraction;
 import com.android.contacts.model.AccountType;
 import com.android.contacts.model.AccountTypeManager;
+import com.android.contacts.model.AccountWithDataSet;
 import com.android.contacts.util.DialogManager;
 
-import android.accounts.Account;
 import android.app.ActionBar;
-import android.app.Activity;
 import android.app.Dialog;
 import android.content.ContentValues;
 import android.content.Context;
@@ -40,10 +37,8 @@
 import android.provider.ContactsContract.RawContacts;
 import android.util.Log;
 import android.view.LayoutInflater;
-import android.view.MenuItem;
 import android.view.View;
 import android.view.View.OnClickListener;
-import android.widget.Button;
 
 import java.util.ArrayList;
 
@@ -198,10 +193,12 @@
         }
 
         @Override
-        public void onCustomCreateContactActivityRequested(Account account, Bundle intentExtras) {
+        public void onCustomCreateContactActivityRequested(AccountWithDataSet account,
+                Bundle intentExtras) {
             final AccountTypeManager accountTypes =
                     AccountTypeManager.getInstance(ContactEditorActivity.this);
-            final AccountType accountType = accountTypes.getAccountType(account.type);
+            final AccountType accountType = accountTypes.getAccountType(
+                    account.type, account.dataSet);
 
             Intent intent = new Intent();
             intent.setClassName(accountType.resPackageName,
@@ -213,6 +210,7 @@
             }
             intent.putExtra(RawContacts.ACCOUNT_NAME, account.name);
             intent.putExtra(RawContacts.ACCOUNT_TYPE, account.type);
+            intent.putExtra(RawContacts.DATA_SET, account.dataSet);
             intent.setFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
                     | Intent.FLAG_ACTIVITY_FORWARD_RESULT);
             startActivity(intent);
@@ -220,11 +218,12 @@
         }
 
         @Override
-        public void onCustomEditContactActivityRequested(Account account, Uri rawContactUri,
-                Bundle intentExtras, boolean redirect) {
+        public void onCustomEditContactActivityRequested(AccountWithDataSet account,
+                Uri rawContactUri, Bundle intentExtras, boolean redirect) {
             final AccountTypeManager accountTypes =
                     AccountTypeManager.getInstance(ContactEditorActivity.this);
-            final AccountType accountType = accountTypes.getAccountType(account.type);
+            final AccountType accountType = accountTypes.getAccountType(
+                    account.type, account.dataSet);
 
             Intent intent = new Intent();
             intent.setClassName(accountType.resPackageName,
diff --git a/src/com/android/contacts/activities/GroupDetailActivity.java b/src/com/android/contacts/activities/GroupDetailActivity.java
index b56f182..b66d8b8 100644
--- a/src/com/android/contacts/activities/GroupDetailActivity.java
+++ b/src/com/android/contacts/activities/GroupDetailActivity.java
@@ -39,6 +39,7 @@
     private boolean mShowGroupSourceInActionBar;
 
     private String mAccountTypeString;
+    private String mDataSet;
     private String mGroupSourceAction;
     private String mGroupSourceUri;
 
@@ -84,9 +85,10 @@
         }
 
         @Override
-        public void onGroupSourceUpdated(
-                String accountTypeString, String groupSourceAction, String groupSourceActionUri) {
+        public void onGroupSourceUpdated(String accountTypeString, String dataSet,
+                String groupSourceAction, String groupSourceActionUri) {
             mAccountTypeString = accountTypeString;
+            mDataSet = dataSet;
             mGroupSourceAction = groupSourceAction;
             mGroupSourceUri = groupSourceActionUri;
             invalidateOptionsMenu();
@@ -133,7 +135,7 @@
         }
         View groupSourceView = GroupDetailDisplayUtils.getNewGroupSourceView(this);
         GroupDetailDisplayUtils.bindGroupSourceView(this, groupSourceView,
-                mAccountTypeString);
+                mAccountTypeString, mDataSet);
         groupSourceView.setOnClickListener(new OnClickListener() {
             @Override
             public void onClick(View v) {
diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java
index 5ad8ab5..48fd49d 100644
--- a/src/com/android/contacts/activities/PeopleActivity.java
+++ b/src/com/android/contacts/activities/PeopleActivity.java
@@ -51,6 +51,7 @@
 import com.android.contacts.list.ProviderStatusLoader.ProviderStatusListener;
 import com.android.contacts.list.ContactTileListFragment;
 import com.android.contacts.model.AccountTypeManager;
+import com.android.contacts.model.AccountWithDataSet;
 import com.android.contacts.preference.ContactsPreferenceActivity;
 import com.android.contacts.preference.DisplayOptionsPreferenceFragment;
 import com.android.contacts.util.AccountSelectionUtil;
@@ -58,7 +59,6 @@
 import com.android.contacts.util.DialogManager;
 import com.android.contacts.util.PhoneCapabilityTester;
 
-import android.accounts.Account;
 import android.app.Activity;
 import android.app.Fragment;
 import android.app.FragmentManager;
@@ -92,6 +92,7 @@
 import android.widget.Toast;
 
 import java.util.ArrayList;
+import java.util.List;
 import java.util.concurrent.atomic.AtomicInteger;
 
 /**
@@ -202,8 +203,8 @@
     }
 
     private boolean areAccountsAvailable() {
-        final ArrayList<Account> accounts =
-            AccountTypeManager.getInstance(this).getAccounts(true /* writeable */);
+        final List<AccountWithDataSet> accounts =
+                AccountTypeManager.getInstance(this).getAccounts(true /* writeable */);
         return !accounts.isEmpty();
     }
 
@@ -1099,7 +1100,8 @@
         }
 
         @Override
-        public void onCreateRawContactRequested(ArrayList<ContentValues> values, Account account) {
+        public void onCreateRawContactRequested(ArrayList<ContentValues> values,
+                AccountWithDataSet account) {
             Toast.makeText(PeopleActivity.this, R.string.toast_making_personal_copy,
                     Toast.LENGTH_LONG).show();
             Intent serviceIntent = ContactSaveService.createNewRawContactIntent(
@@ -1177,8 +1179,8 @@
         }
 
         @Override
-        public void onGroupSourceUpdated(
-                String accountTypeString, String groupSourceAction, String groupSourceUri) {
+        public void onGroupSourceUpdated(String accountTypeString, String dataSet,
+                String groupSourceAction, String groupSourceUri) {
             // Nothing needs to be done here because the group source will be displayed in the
             // detail fragment
         }
@@ -1401,7 +1403,7 @@
     }
 
     private void createNewGroupWithAccountDisambiguation() {
-        final ArrayList<Account> accounts =
+        final List<AccountWithDataSet> accounts =
                 AccountTypeManager.getInstance(this).getAccounts(true);
         if (accounts.size() <= 1 || mAddGroupImageView == null) {
             // No account to choose or no control to anchor the popup-menu to
@@ -1423,9 +1425,11 @@
             @Override
             public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                 popup.dismiss();
+                AccountWithDataSet account = adapter.getItem(position);
                 final Intent intent = new Intent(PeopleActivity.this, GroupEditorActivity.class);
                 intent.setAction(Intent.ACTION_INSERT);
-                intent.putExtra(Intents.Insert.ACCOUNT, adapter.getItem(position));
+                intent.putExtra(Intents.Insert.ACCOUNT, account);
+                intent.putExtra(Intents.Insert.DATA_SET, account.dataSet);
                 startActivityForResult(intent, SUBACTIVITY_NEW_GROUP);
             }
         });
diff --git a/src/com/android/contacts/detail/ContactDetailFragment.java b/src/com/android/contacts/detail/ContactDetailFragment.java
index 41324f8..946fbe8 100644
--- a/src/com/android/contacts/detail/ContactDetailFragment.java
+++ b/src/com/android/contacts/detail/ContactDetailFragment.java
@@ -31,6 +31,7 @@
 import com.android.contacts.model.AccountType;
 import com.android.contacts.model.AccountType.EditType;
 import com.android.contacts.model.AccountTypeManager;
+import com.android.contacts.model.AccountWithDataSet;
 import com.android.contacts.model.DataKind;
 import com.android.contacts.model.EntityDelta;
 import com.android.contacts.model.EntityDelta.ValuesDelta;
@@ -43,7 +44,6 @@
 import com.android.contacts.widget.TransitionAnimationView;
 import com.android.internal.telephony.ITelephony;
 
-import android.accounts.Account;
 import android.app.Activity;
 import android.app.Fragment;
 import android.app.SearchManager;
@@ -491,12 +491,13 @@
         for (Entity entity: mContactData.getEntities()) {
             final ContentValues entValues = entity.getEntityValues();
             final String accountType = entValues.getAsString(RawContacts.ACCOUNT_TYPE);
+            final String dataSet = entValues.getAsString(RawContacts.DATA_SET);
             final long rawContactId = entValues.getAsLong(RawContacts._ID);
 
             if (!mRawContactIds.contains(rawContactId)) {
                 mRawContactIds.add(rawContactId);
             }
-            AccountType type = accountTypes.getAccountType(accountType);
+            AccountType type = accountTypes.getAccountType(accountType, dataSet);
             if (type == null || !type.readOnly) {
                 mWritableRawContactIds.add(rawContactId);
             }
@@ -518,7 +519,7 @@
                 }
 
                 final DataKind kind = accountTypes.getKindOrFallback(
-                        accountType, mimeType);
+                        accountType, dataSet, mimeType);
                 if (kind == null) continue;
 
                 final DetailViewEntry entry = DetailViewEntry.fromValues(mContext, mimeType, kind,
@@ -574,7 +575,7 @@
                     final DataStatus status = mContactData.getStatuses().get(entry.id);
                     if (status != null) {
                         final String imMime = Im.CONTENT_ITEM_TYPE;
-                        final DataKind imKind = accountTypes.getKindOrFallback(accountType,
+                        final DataKind imKind = accountTypes.getKindOrFallback(accountType, dataSet,
                                 imMime);
                         final DetailViewEntry imEntry = DetailViewEntry.fromValues(mContext, imMime,
                                 imKind, dataId, entryValues, mContactData.isDirectoryEntry(),
@@ -764,7 +765,7 @@
         String attribution = ContactDetailDisplayUtils.getAttribution(mContext, mContactData);
         boolean hasAttribution = !TextUtils.isEmpty(attribution);
         int networksCount = mOtherEntriesMap.keySet().size();
-        int invitableCount = mContactData.getInvitableAccontTypes().size();
+        int invitableCount = mContactData.getInvitableAccountTypes().size();
         if (!hasAttribution && networksCount == 0 && invitableCount == 0) {
             return;
         }
@@ -1638,11 +1639,11 @@
     }
 
     @Override
-    public void onAccountChosen(int requestCode, Account account) {
+    public void onAccountChosen(int requestCode, AccountWithDataSet account) {
         createCopy(account);
     }
 
-    private void createCopy(Account account) {
+    private void createCopy(AccountWithDataSet account) {
         if (mListener != null) {
             mListener.onCreateRawContactRequested(mContactData.getContentValues(), account);
         }
@@ -1825,11 +1826,12 @@
             if (defaultGroupId == -1) return false;
 
             final Entity rawContactEntity = mContactData.getEntities().get(0);
-            final String accountType =
-                    rawContactEntity.getEntityValues().getAsString(RawContacts.ACCOUNT_TYPE);
+            ContentValues rawValues = rawContactEntity.getEntityValues();
+            final String accountType = rawValues.getAsString(RawContacts.ACCOUNT_TYPE);
+            final String dataSet = rawValues.getAsString(RawContacts.DATA_SET);
             final AccountTypeManager accountTypes =
                     AccountTypeManager.getInstance(mContext);
-            final AccountType type = accountTypes.getAccountType(accountType);
+            final AccountType type = accountTypes.getAccountType(accountType, dataSet);
             // Offline or non-writeable account? Nothing to fix
             if (type == null || type.readOnly) return false;
 
@@ -1871,7 +1873,8 @@
             final AccountTypeManager accountTypes = AccountTypeManager.getInstance(mContext);
             final ValuesDelta values = rawContactEntityDelta.getValues();
             final String accountType = values.getAsString(RawContacts.ACCOUNT_TYPE);
-            final AccountType type = accountTypes.getAccountType(accountType);
+            final String dataSet = values.getAsString(RawContacts.DATA_SET);
+            final AccountType type = accountTypes.getAccountType(accountType, dataSet);
             final DataKind groupMembershipKind = type.getKindForMimetype(
                     GroupMembership.CONTENT_ITEM_TYPE);
             final ValuesDelta entry = EntityModifier.insertChild(rawContactEntityDelta,
@@ -1915,12 +1918,12 @@
             int exportSupport = mContactData.getDirectoryExportSupport();
             switch (exportSupport) {
                 case Directory.EXPORT_SUPPORT_SAME_ACCOUNT_ONLY: {
-                    createCopy(new Account(mContactData.getDirectoryAccountName(),
-                                    mContactData.getDirectoryAccountType()));
+                    createCopy(new AccountWithDataSet(mContactData.getDirectoryAccountName(),
+                                    mContactData.getDirectoryAccountType(), null));
                     break;
                 }
                 case Directory.EXPORT_SUPPORT_ANY_ACCOUNT: {
-                    final ArrayList<Account> accounts =
+                    final List<AccountWithDataSet> accounts =
                             AccountTypeManager.getInstance(mContext).getAccounts(true);
                     if (accounts.isEmpty()) {
                         createCopy(null);
@@ -1998,9 +2001,10 @@
          * User requested creation of a new contact with the specified values.
          *
          * @param values ContentValues containing data rows for the new contact.
-         * @param account Account where the new contact should be created
+         * @param account Account where the new contact should be created.
          */
-        public void onCreateRawContactRequested(ArrayList<ContentValues> values, Account account);
+        public void onCreateRawContactRequested(ArrayList<ContentValues> values,
+                AccountWithDataSet account);
     }
 
     /**
@@ -2016,12 +2020,12 @@
             mContext = context;
             mInflater = LayoutInflater.from(context);
             mContactData = contactData;
-            final List<String> types = contactData.getInvitableAccontTypes();
+            final List<AccountType> types = contactData.getInvitableAccountTypes();
             mAccountTypes = new ArrayList<AccountType>(types.size());
 
             AccountTypeManager manager = AccountTypeManager.getInstance(context);
             for (int i = 0; i < types.size(); i++) {
-                mAccountTypes.add(manager.getAccountType(types.get(i)));
+                mAccountTypes.add(types.get(i));
             }
 
             Collections.sort(mAccountTypes, new AccountType.DisplayLabelComparator(mContext));
diff --git a/src/com/android/contacts/editor/AggregationSuggestionEngine.java b/src/com/android/contacts/editor/AggregationSuggestionEngine.java
index bb17bbb..0861d92 100644
--- a/src/com/android/contacts/editor/AggregationSuggestionEngine.java
+++ b/src/com/android/contacts/editor/AggregationSuggestionEngine.java
@@ -58,10 +58,12 @@
         public long rawContactId;
         public String accountType;
         public String accountName;
+        public String dataSet;
 
         @Override
         public String toString() {
-            return "ID: " + rawContactId + " account: " + accountType + "/" + accountName;
+            return "ID: " + rawContactId + " account: " + accountType + "/" + accountName
+                    + " dataSet: " + dataSet;
         }
     }
 
@@ -277,6 +279,7 @@
             Photo.PHOTO,
             RawContacts.ACCOUNT_TYPE,
             RawContacts.ACCOUNT_NAME,
+            RawContacts.DATA_SET
         };
 
         public static final int ID = 0;
@@ -291,6 +294,7 @@
         public static final int PHOTO = 9;
         public static final int ACCOUNT_TYPE = 10;
         public static final int ACCOUNT_NAME = 11;
+        public static final int DATA_SET = 12;
     }
 
     private void loadAggregationSuggestions(Uri uri) {
@@ -390,6 +394,7 @@
                     rawContact.rawContactId = rawContactId;
                     rawContact.accountName = mDataCursor.getString(DataQuery.ACCOUNT_NAME);
                     rawContact.accountType = mDataCursor.getString(DataQuery.ACCOUNT_TYPE);
+                    rawContact.dataSet = mDataCursor.getString(DataQuery.DATA_SET);
                     suggestion.rawContacts.add(rawContact);
                 }
 
diff --git a/src/com/android/contacts/editor/AggregationSuggestionView.java b/src/com/android/contacts/editor/AggregationSuggestionView.java
index af8e7f8..07e67e8 100644
--- a/src/com/android/contacts/editor/AggregationSuggestionView.java
+++ b/src/com/android/contacts/editor/AggregationSuggestionView.java
@@ -118,10 +118,11 @@
         AccountTypeManager accountTypes = AccountTypeManager.getInstance(getContext());
         for (RawContact rawContact : mRawContacts) {
             String accountType = rawContact.accountType;
+            String dataSet = rawContact.dataSet;
             if (accountType == null) {
                 return true;
             }
-            AccountType type = accountTypes.getAccountType(accountType);
+            AccountType type = accountTypes.getAccountType(accountType, dataSet);
             if (!type.readOnly) {
                 return true;
             }
diff --git a/src/com/android/contacts/editor/ContactEditorFragment.java b/src/com/android/contacts/editor/ContactEditorFragment.java
index 5d9494c..e0f99ce 100644
--- a/src/com/android/contacts/editor/ContactEditorFragment.java
+++ b/src/com/android/contacts/editor/ContactEditorFragment.java
@@ -26,6 +26,7 @@
 import com.android.contacts.editor.Editor.EditorListener;
 import com.android.contacts.model.AccountType;
 import com.android.contacts.model.AccountTypeManager;
+import com.android.contacts.model.AccountWithDataSet;
 import com.android.contacts.model.EntityDelta;
 import com.android.contacts.model.EntityDelta.ValuesDelta;
 import com.android.contacts.model.EntityDeltaList;
@@ -316,11 +317,13 @@
                 if (mListener != null) mListener.setTitleTo(R.string.editContact_title_insert);
 
                 final Account account = mIntentExtras == null ? null :
-                    (Account) mIntentExtras.getParcelable(Intents.Insert.ACCOUNT);
+                        (Account) mIntentExtras.getParcelable(Intents.Insert.ACCOUNT);
+                final String dataSet = mIntentExtras == null ? null :
+                        mIntentExtras.getString(Intents.Insert.DATA_SET);
 
                 if (account != null) {
                     // Account specified in Intent
-                    createContact(account);
+                    createContact(new AccountWithDataSet(account.name, account.type, dataSet));
                 } else {
                     // No Account specified. Let the user choose
                     // Load Accounts async so that we can present them
@@ -396,12 +399,15 @@
             Entity entity = entities.get(0);
             ContentValues entityValues = entity.getEntityValues();
             String type = entityValues.getAsString(RawContacts.ACCOUNT_TYPE);
-            AccountType accountType = AccountTypeManager.getInstance(mContext).getAccountType(type);
+            String dataSet = entityValues.getAsString(RawContacts.DATA_SET);
+            AccountType accountType = AccountTypeManager.getInstance(mContext).getAccountType(
+                    type, dataSet);
             if (accountType.getEditContactActivityClassName() != null) {
                 if (mListener != null) {
                     String name = entityValues.getAsString(RawContacts.ACCOUNT_NAME);
                     long rawContactId = entityValues.getAsLong(RawContacts.Entity._ID);
-                    mListener.onCustomEditContactActivityRequested(new Account(name, type),
+                    mListener.onCustomEditContactActivityRequested(
+                            new AccountWithDataSet(name, type, dataSet),
                             ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId),
                             mIntentExtras, true);
                 }
@@ -413,7 +419,7 @@
     }
 
     @Override
-    public void onExternalEditorRequest(Account account, Uri uri) {
+    public void onExternalEditorRequest(AccountWithDataSet account, Uri uri) {
         mListener.onCustomEditContactActivityRequested(account, uri, null, false);
     }
 
@@ -440,7 +446,8 @@
         final AccountTypeManager accountTypes = AccountTypeManager.getInstance(mContext);
         for (EntityDelta state : mState) {
             final String accountType = state.getValues().getAsString(RawContacts.ACCOUNT_TYPE);
-            final AccountType type = accountTypes.getAccountType(accountType);
+            final String dataSet = state.getValues().getAsString(RawContacts.DATA_SET);
+            final AccountType type = accountTypes.getAccountType(accountType, dataSet);
             if (!type.readOnly) {
                 // Apply extras to the first writable raw contact only
                 EntityModifier.parseExtras(mContext, type, state, extras);
@@ -454,7 +461,7 @@
      * selected. If there's no available account, device-local contact should be created.
      */
     private void createContact() {
-        final ArrayList<Account> accounts =
+        final List<AccountWithDataSet> accounts =
                 AccountTypeManager.getInstance(mContext).getAccounts(true);
         // No Accounts available.  Create a phone-local contact.
         if (accounts.isEmpty()) {
@@ -473,10 +480,11 @@
      *
      * @param account may be null to signal a device-local contact should be created.
      */
-    private void createContact(Account account) {
+    private void createContact(AccountWithDataSet account) {
         final AccountTypeManager accountTypes = AccountTypeManager.getInstance(mContext);
         final AccountType accountType =
-                accountTypes.getAccountType(account != null ? account.type : null);
+                accountTypes.getAccountType(account != null ? account.type : null,
+                        account != null ? account.dataSet : null);
 
         if (accountType.getCreateContactActivityClassName() != null) {
             if (mListener != null) {
@@ -491,15 +499,17 @@
      * Removes a current editor ({@link #mState}) and rebinds new editor for a new account.
      * Some of old data are reused with new restriction enforced by the new account.
      *
-     * @param oldState Old data being editted.
+     * @param oldState Old data being edited.
      * @param oldAccount Old account associated with oldState.
      * @param newAccount New account to be used.
      */
     private void rebindEditorsForNewContact(
-            EntityDelta oldState, Account oldAccount, Account newAccount) {
+            EntityDelta oldState, AccountWithDataSet oldAccount, AccountWithDataSet newAccount) {
         AccountTypeManager accountTypes = AccountTypeManager.getInstance(mContext);
-        AccountType oldAccountType = accountTypes.getAccountType(oldAccount.type);
-        AccountType newAccountType = accountTypes.getAccountType(newAccount.type);
+        AccountType oldAccountType = accountTypes.getAccountType(
+                oldAccount.type, oldAccount.dataSet);
+        AccountType newAccountType = accountTypes.getAccountType(
+                newAccount.type, newAccount.dataSet);
 
         if (newAccountType.getCreateContactActivityClassName() != null) {
             Log.w(TAG, "external activity called in rebind situation");
@@ -512,21 +522,24 @@
         }
     }
 
-    private void bindEditorsForNewContact(Account account, final AccountType accountType) {
+    private void bindEditorsForNewContact(AccountWithDataSet account,
+            final AccountType accountType) {
         bindEditorsForNewContact(account, accountType, null, null);
     }
 
-    private void bindEditorsForNewContact(Account newAccount, final AccountType newAccountType,
-            EntityDelta oldState, AccountType oldAccountType) {
+    private void bindEditorsForNewContact(AccountWithDataSet newAccount,
+            final AccountType newAccountType, EntityDelta oldState, AccountType oldAccountType) {
         mStatus = Status.EDITING;
 
         final ContentValues values = new ContentValues();
         if (newAccount != null) {
             values.put(RawContacts.ACCOUNT_NAME, newAccount.name);
             values.put(RawContacts.ACCOUNT_TYPE, newAccount.type);
+            values.put(RawContacts.DATA_SET, newAccount.dataSet);
         } else {
             values.putNull(RawContacts.ACCOUNT_NAME);
             values.putNull(RawContacts.ACCOUNT_TYPE);
+            values.putNull(RawContacts.DATA_SET);
         }
 
         EntityDelta insert = new EntityDelta(ValuesDelta.fromAfter(values));
@@ -577,7 +590,8 @@
             if (!values.isVisible()) continue;
 
             final String accountType = values.getAsString(RawContacts.ACCOUNT_TYPE);
-            final AccountType type = accountTypes.getAccountType(accountType);
+            final String dataSet = values.getAsString(RawContacts.DATA_SET);
+            final AccountType type = accountTypes.getAccountType(accountType, dataSet);
             final long rawContactId = values.getAsLong(RawContacts._ID);
 
             final BaseRawContactEditorView editor;
@@ -596,7 +610,7 @@
                 editor = rawContactEditor;
             }
             if (Intent.ACTION_INSERT.equals(mAction) && numRawContacts == 1) {
-                final ArrayList<Account> accounts =
+                final List<AccountWithDataSet> accounts =
                         AccountTypeManager.getInstance(mContext).getAccounts(true);
                 if (accounts.size() > 1) {
                     addAccountSwitcher(mState.get(0), editor);
@@ -676,9 +690,10 @@
     private void addAccountSwitcher(
             final EntityDelta currentState, BaseRawContactEditorView editor) {
         ValuesDelta values = currentState.getValues();
-        final Account currentAccount = new Account(
+        final AccountWithDataSet currentAccount = new AccountWithDataSet(
                 values.getAsString(RawContacts.ACCOUNT_NAME),
-                values.getAsString(RawContacts.ACCOUNT_TYPE));
+                values.getAsString(RawContacts.ACCOUNT_TYPE),
+                values.getAsString(RawContacts.DATA_SET));
         final View accountView = editor.findViewById(R.id.account);
         final View anchorView = editor.findViewById(R.id.anchor_for_account_switcher);
         accountView.setOnClickListener(new View.OnClickListener() {
@@ -697,7 +712,7 @@
                     public void onItemClick(AdapterView<?> parent, View view, int position,
                             long id) {
                         popup.dismiss();
-                        Account newAccount = adapter.getItem(position);
+                        AccountWithDataSet newAccount = adapter.getItem(position);
                         if (!newAccount.equals(currentAccount)) {
                             rebindEditorsForNewContact(currentState, currentAccount, newAccount);
                         }
@@ -1059,7 +1074,8 @@
         for (int i = 0; i < size; i++) {
             ValuesDelta values = mState.get(i).getValues();
             final String accountType = values.getAsString(RawContacts.ACCOUNT_TYPE);
-            final AccountType type = accountTypes.getAccountType(accountType);
+            final String dataSet = values.getAsString(RawContacts.DATA_SET);
+            final AccountType type = accountTypes.getAccountType(accountType, dataSet);
             if (!type.readOnly) {
                 return true;
             }
@@ -1107,7 +1123,8 @@
          * Contact is being created for an external account that provides its own
          * new contact activity.
          */
-        void onCustomCreateContactActivityRequested(Account account, Bundle intentExtras);
+        void onCustomCreateContactActivityRequested(AccountWithDataSet account,
+                Bundle intentExtras);
 
         /**
          * The edited raw contact belongs to an external account that provides
@@ -1116,7 +1133,7 @@
          * @param redirect indicates that the current editor should be closed
          *            before the custom editor is shown.
          */
-        void onCustomEditContactActivityRequested(Account account, Uri rawContactUri,
+        void onCustomEditContactActivityRequested(AccountWithDataSet account, Uri rawContactUri,
                 Bundle intentExtras, boolean redirect);
     }
 
@@ -1132,10 +1149,12 @@
             }
 
             final AccountTypeManager accountTypes = AccountTypeManager.getInstance(mContext);
-            String accountType2 = one.getValues().getAsString(RawContacts.ACCOUNT_TYPE);
-            final AccountType type1 = accountTypes.getAccountType(accountType2);
-            accountType2 = two.getValues().getAsString(RawContacts.ACCOUNT_TYPE);
-            final AccountType type2 = accountTypes.getAccountType(accountType2);
+            String accountType1 = one.getValues().getAsString(RawContacts.ACCOUNT_TYPE);
+            String dataSet1 = one.getValues().getAsString(RawContacts.DATA_SET);
+            final AccountType type1 = accountTypes.getAccountType(accountType1, dataSet1);
+            String accountType2 = two.getValues().getAsString(RawContacts.ACCOUNT_TYPE);
+            String dataSet2 = two.getValues().getAsString(RawContacts.DATA_SET);
+            final AccountType type2 = accountTypes.getAccountType(accountType2, dataSet2);
 
             // Check read-only
             if (type1.readOnly && !type2.readOnly) {
@@ -1164,6 +1183,16 @@
                 value = type1.accountType.compareTo(type2.accountType);
                 if (value != 0) {
                     return value;
+                } else {
+                    // Fall back to data set.
+                    if (type1.dataSet != null) {
+                        value = type1.dataSet.compareTo(type2.dataSet);
+                        if (value != 0) {
+                            return value;
+                        }
+                    } else if (type2.dataSet != null) {
+                        return 1;
+                    }
                 }
             }
 
diff --git a/src/com/android/contacts/editor/ExternalRawContactEditorView.java b/src/com/android/contacts/editor/ExternalRawContactEditorView.java
index e1a669b..734f013 100644
--- a/src/com/android/contacts/editor/ExternalRawContactEditorView.java
+++ b/src/com/android/contacts/editor/ExternalRawContactEditorView.java
@@ -18,14 +18,13 @@
 
 import com.android.contacts.ContactsUtils;
 import com.android.contacts.R;
-import com.android.contacts.editor.ExternalRawContactEditorView.Listener;
 import com.android.contacts.model.AccountType;
+import com.android.contacts.model.AccountWithDataSet;
 import com.android.contacts.model.DataKind;
 import com.android.contacts.model.EntityDelta;
 import com.android.contacts.model.EntityDelta.ValuesDelta;
 import com.android.contacts.model.EntityModifier;
 
-import android.accounts.Account;
 import android.content.ContentUris;
 import android.content.Context;
 import android.net.Uri;
@@ -66,12 +65,13 @@
 
     private String mAccountName;
     private String mAccountType;
+    private String mDataSet;
     private long mRawContactId = -1;
 
     private Listener mListener;
 
     public interface Listener {
-        void onExternalEditorRequest(Account account, Uri uri);
+        void onExternalEditorRequest(AccountWithDataSet account, Uri uri);
     }
 
     public ExternalRawContactEditorView(Context context) {
@@ -127,6 +127,7 @@
         ValuesDelta values = state.getValues();
         mAccountName = values.getAsString(RawContacts.ACCOUNT_NAME);
         mAccountType = values.getAsString(RawContacts.ACCOUNT_TYPE);
+        mDataSet = values.getAsString(RawContacts.DATA_SET);
         CharSequence accountType = type.getDisplayLabel(mContext);
         if (TextUtils.isEmpty(accountType)) {
             accountType = mContext.getString(R.string.account_phone);
@@ -136,6 +137,9 @@
                     mContext.getString(R.string.from_account_format, mAccountName));
         }
         mAccountTypeTextView.setText(mContext.getString(R.string.account_type_format, accountType));
+
+        // TODO: Expose data set in the UI somehow?
+
         mAccountIcon.setImageDrawable(type.getDisplayIcon(mContext));
 
         mRawContactId = values.getAsLong(RawContacts._ID);
@@ -221,7 +225,8 @@
     public void onClick(View v) {
         if (v.getId() == R.id.button_edit_externally) {
             if (mListener != null) {
-                mListener.onExternalEditorRequest(new Account(mAccountName, mAccountType),
+                mListener.onExternalEditorRequest(
+                        new AccountWithDataSet(mAccountName, mAccountType, mDataSet),
                         ContentUris.withAppendedId(RawContacts.CONTENT_URI, mRawContactId));
             }
         }
diff --git a/src/com/android/contacts/editor/GroupMembershipView.java b/src/com/android/contacts/editor/GroupMembershipView.java
index a581b11..9693915 100644
--- a/src/com/android/contacts/editor/GroupMembershipView.java
+++ b/src/com/android/contacts/editor/GroupMembershipView.java
@@ -23,6 +23,7 @@
 import com.android.contacts.model.EntityDelta;
 import com.android.contacts.model.EntityDelta.ValuesDelta;
 import com.android.contacts.model.EntityModifier;
+import com.android.internal.util.Objects;
 
 import android.app.Activity;
 import android.content.Context;
@@ -84,6 +85,7 @@
     private Cursor mGroupMetaData;
     private String mAccountName;
     private String mAccountType;
+    private String mDataSet;
     private TextView mGroupList;
     private ArrayAdapter<GroupSelectionItem> mAdapter;
     private long mDefaultGroupId;
@@ -125,6 +127,7 @@
         ValuesDelta values = state.getValues();
         mAccountType = values.getAsString(RawContacts.ACCOUNT_TYPE);
         mAccountName = values.getAsString(RawContacts.ACCOUNT_NAME);
+        mDataSet = values.getAsString(RawContacts.DATA_SET);
         mDefaultGroupVisibilityKnown = false;
         updateView();
     }
@@ -145,7 +148,9 @@
         while (mGroupMetaData.moveToNext()) {
             String accountName = mGroupMetaData.getString(GroupMetaDataLoader.ACCOUNT_NAME);
             String accountType = mGroupMetaData.getString(GroupMetaDataLoader.ACCOUNT_TYPE);
-            if (accountName.equals(mAccountName) && accountType.equals(mAccountType)) {
+            String dataSet = mGroupMetaData.getString(GroupMetaDataLoader.DATA_SET);
+            if (accountName.equals(mAccountName) && accountType.equals(mAccountType)
+                    && Objects.equal(dataSet, mDataSet)) {
                 long groupId = mGroupMetaData.getLong(GroupMetaDataLoader.GROUP_ID);
                 if (!mGroupMetaData.isNull(GroupMetaDataLoader.FAVORITES)
                         && mGroupMetaData.getInt(GroupMetaDataLoader.FAVORITES) != 0) {
@@ -209,7 +214,9 @@
         while (mGroupMetaData.moveToNext()) {
             String accountName = mGroupMetaData.getString(GroupMetaDataLoader.ACCOUNT_NAME);
             String accountType = mGroupMetaData.getString(GroupMetaDataLoader.ACCOUNT_TYPE);
-            if (accountName.equals(mAccountName) && accountType.equals(mAccountType)) {
+            String dataSet = mGroupMetaData.getString(GroupMetaDataLoader.DATA_SET);
+            if (accountName.equals(mAccountName) && accountType.equals(mAccountType)
+                    && Objects.equal(dataSet, mDataSet)) {
                 long groupId = mGroupMetaData.getLong(GroupMetaDataLoader.GROUP_ID);
                 if (groupId != mFavoritesGroupId
                         && (groupId != mDefaultGroupId || mDefaultGroupVisible)) {
@@ -328,6 +335,7 @@
         }
 
         GroupCreationDialogFragment.show(
-                ((Activity) getContext()).getFragmentManager(), mAccountType, mAccountName);
+                ((Activity) getContext()).getFragmentManager(), mAccountType, mAccountName,
+                mDataSet);
     }
 }
diff --git a/src/com/android/contacts/editor/RawContactEditorView.java b/src/com/android/contacts/editor/RawContactEditorView.java
index 499b86f..41f2ebd 100644
--- a/src/com/android/contacts/editor/RawContactEditorView.java
+++ b/src/com/android/contacts/editor/RawContactEditorView.java
@@ -24,6 +24,7 @@
 import com.android.contacts.model.EntityDelta;
 import com.android.contacts.model.EntityDelta.ValuesDelta;
 import com.android.contacts.model.EntityModifier;
+import com.android.internal.util.Objects;
 
 import android.content.Context;
 import android.content.Entity;
@@ -350,11 +351,14 @@
     private long getDefaultGroupId() {
         String accountType = mState.getValues().getAsString(RawContacts.ACCOUNT_TYPE);
         String accountName = mState.getValues().getAsString(RawContacts.ACCOUNT_NAME);
+        String accountDataSet = mState.getValues().getAsString(RawContacts.DATA_SET);
         mGroupMetaData.moveToPosition(-1);
         while (mGroupMetaData.moveToNext()) {
             String name = mGroupMetaData.getString(GroupMetaDataLoader.ACCOUNT_NAME);
             String type = mGroupMetaData.getString(GroupMetaDataLoader.ACCOUNT_TYPE);
-            if (name.equals(accountName) && type.equals(accountType)) {
+            String dataSet = mGroupMetaData.getString(GroupMetaDataLoader.DATA_SET);
+            if (name.equals(accountName) && type.equals(accountType)
+                    && Objects.equal(dataSet, accountDataSet)) {
                 long groupId = mGroupMetaData.getLong(GroupMetaDataLoader.GROUP_ID);
                 if (!mGroupMetaData.isNull(GroupMetaDataLoader.AUTO_ADD)
                             && mGroupMetaData.getInt(GroupMetaDataLoader.AUTO_ADD) != 0) {
diff --git a/src/com/android/contacts/editor/SelectAccountDialogFragment.java b/src/com/android/contacts/editor/SelectAccountDialogFragment.java
index 0a33f25..9dbe20a 100644
--- a/src/com/android/contacts/editor/SelectAccountDialogFragment.java
+++ b/src/com/android/contacts/editor/SelectAccountDialogFragment.java
@@ -17,9 +17,9 @@
 package com.android.contacts.editor;
 
 import com.android.contacts.R;
+import com.android.contacts.model.AccountWithDataSet;
 import com.android.contacts.util.AccountsListAdapter;
 
-import android.accounts.Account;
 import android.app.AlertDialog;
 import android.app.Dialog;
 import android.app.DialogFragment;
@@ -80,10 +80,10 @@
     }
 
     /**
-     * Calls {@link Listener#onAccountChosen(int, Account)} if the target fragment is castable
-     * to {@link Listener}. Subclasses can also overide to directly perform an operation
+     * Calls {@link Listener#onAccountChosen(int, AccountWithDataSet)} if the target fragment is
+     * castable to {@link Listener}. Subclasses can also overide to directly perform an operation.
      */
-    protected void onAccountSelected(Account account) {
+    protected void onAccountSelected(AccountWithDataSet account) {
         final Fragment targetFragment = getTargetFragment();
         if (targetFragment != null && targetFragment instanceof Listener) {
             final Listener target = (Listener) targetFragment;
@@ -92,7 +92,7 @@
     }
 
     public interface Listener {
-        void onAccountChosen(int requestCode, Account account);
+        void onAccountChosen(int requestCode, AccountWithDataSet account);
         void onAccountSelectorCancelled();
     }
 }
diff --git a/src/com/android/contacts/group/GroupBrowseListAdapter.java b/src/com/android/contacts/group/GroupBrowseListAdapter.java
index be99738..753261a 100644
--- a/src/com/android/contacts/group/GroupBrowseListAdapter.java
+++ b/src/com/android/contacts/group/GroupBrowseListAdapter.java
@@ -20,6 +20,8 @@
 import com.android.contacts.R;
 import com.android.contacts.model.AccountType;
 import com.android.contacts.model.AccountTypeManager;
+import com.android.contacts.model.AccountWithDataSet;
+import com.android.internal.util.Objects;
 
 import android.content.ContentUris;
 import android.content.Context;
@@ -104,6 +106,7 @@
         }
         String accountName = mCursor.getString(GroupListLoader.ACCOUNT_NAME);
         String accountType = mCursor.getString(GroupListLoader.ACCOUNT_TYPE);
+        String dataSet = mCursor.getString(GroupListLoader.DATA_SET);
         long groupId = mCursor.getLong(GroupListLoader.GROUP_ID);
         String title = mCursor.getString(GroupListLoader.TITLE);
         int memberCount = mCursor.getInt(GroupListLoader.MEMBER_COUNT);
@@ -117,14 +120,17 @@
         if (previousIndex >= 0 && mCursor.moveToPosition(previousIndex)) {
             String previousGroupAccountName = mCursor.getString(GroupListLoader.ACCOUNT_NAME);
             String previousGroupAccountType = mCursor.getString(GroupListLoader.ACCOUNT_TYPE);
+            String previousGroupDataSet = mCursor.getString(GroupListLoader.DATA_SET);
+
             if (accountName.equals(previousGroupAccountName) &&
-                    accountType.equals(previousGroupAccountType)) {
+                    accountType.equals(previousGroupAccountType) &&
+                    Objects.equal(dataSet, previousGroupDataSet)) {
                 isFirstGroupInAccount = false;
             }
         }
 
-        return new GroupListItem(accountName, accountType, groupId, title, isFirstGroupInAccount,
-                memberCount, groupCountForThisAccount);
+        return new GroupListItem(accountName, accountType, dataSet, groupId, title,
+                isFirstGroupInAccount, memberCount, groupCountForThisAccount);
     }
 
     @Override
@@ -167,7 +173,8 @@
     }
 
     private void bindHeaderView(GroupListItem entry, GroupListItemViewCache viewCache) {
-        AccountType accountType = mAccountTypeManager.getAccountType(entry.getAccountType());
+        AccountType accountType = mAccountTypeManager.getAccountType(
+                entry.getAccountType(), entry.getDataSet());
         viewCache.accountType.setText(accountType.getDisplayLabel(mContext).toString());
         viewCache.accountName.setText(entry.getAccountName());
 
diff --git a/src/com/android/contacts/group/GroupDetailDisplayUtils.java b/src/com/android/contacts/group/GroupDetailDisplayUtils.java
index 56413b5..bb4cd5c 100644
--- a/src/com/android/contacts/group/GroupDetailDisplayUtils.java
+++ b/src/com/android/contacts/group/GroupDetailDisplayUtils.java
@@ -37,14 +37,15 @@
         return inflater.inflate(R.layout.group_source_button, null);
     }
 
-    public static void bindGroupSourceView(Context context, View view, String accountTypeString) {
+    public static void bindGroupSourceView(Context context, View view, String accountTypeString,
+            String dataSet) {
         ImageView accountIcon = (ImageView) view.findViewById(android.R.id.icon);
         if (accountIcon == null) {
             throw new IllegalStateException("Group source view must contain view with id"
                     + "android.R.id.icon");
         }
         AccountTypeManager accountTypeManager = AccountTypeManager.getInstance(context);
-        AccountType accountType = accountTypeManager.getAccountType(accountTypeString);
+        AccountType accountType = accountTypeManager.getAccountType(accountTypeString, dataSet);
         accountIcon.setImageDrawable(accountType.getDisplayIcon(context));
     }
 }
\ No newline at end of file
diff --git a/src/com/android/contacts/group/GroupDetailFragment.java b/src/com/android/contacts/group/GroupDetailFragment.java
index 576f6c1..019dc11 100644
--- a/src/com/android/contacts/group/GroupDetailFragment.java
+++ b/src/com/android/contacts/group/GroupDetailFragment.java
@@ -70,8 +70,8 @@
         /**
          * The group source (intent action and action URI) has been determined.
          */
-        public void onGroupSourceUpdated(String accountTypeString, String groupSourceAction,
-                String groupSourceUri);
+        public void onGroupSourceUpdated(String accountTypeString, String dataSet,
+                String groupSourceAction, String groupSourceUri);
 
         /**
          * User decided to go to Edit-Mode
@@ -108,6 +108,7 @@
     private long mGroupId;
     private String mGroupName;
     private String mAccountTypeString;
+    private String mDataSet;
     private boolean mIsReadOnly;
 
     private boolean mShowGroupActionInActionBar;
@@ -271,6 +272,7 @@
         cursor.moveToPosition(-1);
         if (cursor.moveToNext()) {
             mAccountTypeString = cursor.getString(GroupMetaDataLoader.ACCOUNT_TYPE);
+            mDataSet = cursor.getString(GroupMetaDataLoader.DATA_SET);
             mGroupId = cursor.getLong(GroupMetaDataLoader.GROUP_ID);
             mGroupName = cursor.getString(GroupMetaDataLoader.TITLE);
             mIsReadOnly = cursor.getInt(GroupMetaDataLoader.IS_READ_ONLY) == 1;
@@ -279,9 +281,10 @@
             getActivity().invalidateOptionsMenu ();
 
             final String accountTypeString = cursor.getString(GroupMetaDataLoader.ACCOUNT_TYPE);
+            final String dataSet = cursor.getString(GroupMetaDataLoader.DATA_SET);
             final String groupSourceAction = cursor.getString(GroupMetaDataLoader.ACTION);
             final String groupSourceUri = cursor.getString(GroupMetaDataLoader.ACTION_URI);
-            updateGroupSouce(accountTypeString, groupSourceAction, groupSourceUri);
+            updateGroupSource(accountTypeString, dataSet, groupSourceAction, groupSourceUri);
         }
     }
 
@@ -304,7 +307,8 @@
         } else {
             String groupSizeTemplateString = getResources().getQuantityString(
                     R.plurals.num_contacts_in_group, size);
-            AccountType accountType = mAccountTypeManager.getAccountType(mAccountTypeString);
+            AccountType accountType = mAccountTypeManager.getAccountType(mAccountTypeString,
+                    mDataSet);
             groupSizeString = String.format(groupSizeTemplateString, size,
                     accountType.getDisplayLabel(mContext));
         }
@@ -323,14 +327,15 @@
      * a button in a static header on the page, or as a header that scrolls with the
      * {@link ListView}.
      */
-    private void updateGroupSouce(final String accountTypeString, final String groupSourceAction,
-            final String groupSourceUri) {
+    private void updateGroupSource(final String accountTypeString, final String dataSet,
+            final String groupSourceAction, final String groupSourceUri) {
 
         // If the group action should be shown in the action bar, then pass the data to the
         // listener who will take care of setting up the view and click listener. There is nothing
         // else to be done by this {@link Fragment}.
         if (mShowGroupActionInActionBar) {
-            mListener.onGroupSourceUpdated(accountTypeString, groupSourceAction, groupSourceUri);
+            mListener.onGroupSourceUpdated(accountTypeString, dataSet, groupSourceAction,
+                    groupSourceUri);
             return;
         }
 
@@ -354,7 +359,7 @@
             // Rebind the data since this action can change if the loader returns updated data
             mGroupSourceView.setVisibility(View.VISIBLE);
             GroupDetailDisplayUtils.bindGroupSourceView(mContext, mGroupSourceView,
-                    accountTypeString);
+                    accountTypeString, dataSet);
             mGroupSourceView.setOnClickListener(new OnClickListener() {
                 @Override
                 public void onClick(View v) {
diff --git a/src/com/android/contacts/group/GroupEditorFragment.java b/src/com/android/contacts/group/GroupEditorFragment.java
index bc9e5ba..96fb4b8 100644
--- a/src/com/android/contacts/group/GroupEditorFragment.java
+++ b/src/com/android/contacts/group/GroupEditorFragment.java
@@ -27,6 +27,7 @@
 import com.android.contacts.group.SuggestedMemberListAdapter.SuggestedMember;
 import com.android.contacts.model.AccountType;
 import com.android.contacts.model.AccountTypeManager;
+import com.android.contacts.model.AccountWithDataSet;
 import com.android.internal.util.Objects;
 
 import android.accounts.Account;
@@ -172,6 +173,7 @@
     private boolean mGroupNameIsReadOnly;
     private String mAccountName;
     private String mAccountType;
+    private String mDataSet;
     private String mOriginalGroupName = "";
 
     private MemberListAdapter mMemberListAdapter;
@@ -221,11 +223,14 @@
 
             final Account account = mIntentExtras == null ? null :
                     (Account) mIntentExtras.getParcelable(Intents.Insert.ACCOUNT);
+            final String dataSet = mIntentExtras == null ? null :
+                    mIntentExtras.getString(Intents.Insert.DATA_SET);
 
             if (account != null) {
-                // Account specified in Intent
+                // Account specified in Intent - no data set can be specified in this manner.
                 mAccountName = account.name;
                 mAccountType = account.type;
+                mDataSet = dataSet;
                 setupEditorForAccount();
             } else {
                 // No Account specified. Let the user choose from a disambiguation dialog.
@@ -245,7 +250,7 @@
     }
 
     private void selectAccountAndCreateGroup() {
-        final ArrayList<Account> accounts =
+        final List<AccountWithDataSet> accounts =
                 AccountTypeManager.getInstance(mContext).getAccounts(true /* writeable */);
         // No Accounts available
         if (accounts.isEmpty()) {
@@ -257,6 +262,7 @@
         if (accounts.size() == 1) {
             mAccountName = accounts.get(0).name;
             mAccountType = accounts.get(0).type;
+            mDataSet = accounts.get(0).dataSet;
             setupEditorForAccount();
             return;  // Don't show a dialog.
         }
@@ -268,9 +274,10 @@
     }
 
     @Override
-    public void onAccountChosen(int requestCode, Account account) {
+    public void onAccountChosen(int requestCode, AccountWithDataSet account) {
         mAccountName = account.name;
         mAccountType = account.type;
+        mDataSet = account.dataSet;
         setupEditorForAccount();
     }
 
@@ -287,7 +294,7 @@
      */
     private void setupEditorForAccount() {
         final AccountTypeManager accountTypeManager = AccountTypeManager.getInstance(mContext);
-        final AccountType accountType = accountTypeManager.getAccountType(mAccountType);
+        final AccountType accountType = accountTypeManager.getAccountType(mAccountType, mDataSet);
         final boolean editable = accountType.isGroupMembershipEditable();
         mMemberListAdapter.setIsGroupMembershipEditable(editable);
 
@@ -322,6 +329,7 @@
             mAutoCompleteAdapter.setContentResolver(mContentResolver);
             mAutoCompleteAdapter.setAccountType(mAccountType);
             mAutoCompleteAdapter.setAccountName(mAccountName);
+            mAutoCompleteAdapter.setDataSet(mDataSet);
             mAutoCompleteTextView.setAdapter(mAutoCompleteAdapter);
             mAutoCompleteTextView.setOnItemClickListener(new OnItemClickListener() {
                 @Override
@@ -478,16 +486,17 @@
             return false;
         }
         Intent saveIntent = null;
-        if (mAction == Intent.ACTION_INSERT) {
+        if (Intent.ACTION_INSERT.equals(mAction)) {
             // Create array of raw contact IDs for contacts to add to the group
             long[] membersToAddArray = convertToArray(mListMembersToAdd);
 
             // Create the save intent to create the group and add members at the same time
             saveIntent = ContactSaveService.createNewGroupIntent(activity,
-                    new Account(mAccountName, mAccountType), mGroupNameView.getText().toString(),
+                    new AccountWithDataSet(mAccountName, mAccountType, mDataSet),
+                    mGroupNameView.getText().toString(),
                     membersToAddArray, activity.getClass(),
                     GroupEditorActivity.ACTION_SAVE_COMPLETED);
-        } else if (mAction == Intent.ACTION_EDIT) {
+        } else if (Intent.ACTION_EDIT.equals(mAction)) {
             // Create array of raw contact IDs for contacts to add to the group
             long[] membersToAddArray = convertToArray(mListMembersToAdd);
 
diff --git a/src/com/android/contacts/group/GroupListItem.java b/src/com/android/contacts/group/GroupListItem.java
index 349b86e..c707ea7 100644
--- a/src/com/android/contacts/group/GroupListItem.java
+++ b/src/com/android/contacts/group/GroupListItem.java
@@ -22,6 +22,7 @@
 public final class GroupListItem {
     private final String mAccountName;
     private final String mAccountType;
+    private final String mDataSet;
     private final long mGroupId;
     private final String mTitle;
     private final boolean mIsFirstGroupInAccount;
@@ -30,10 +31,12 @@
     /** Number of groups in the account that this group belongs to */
     private final int mGroupCountForThisAccount;
 
-    public GroupListItem(String accountName, String accountType, long groupId, String title,
-            boolean isFirstGroupInAccount, int memberCount, int groupCountForThisAccount) {
+    public GroupListItem(String accountName, String accountType, String dataSet, long groupId,
+            String title, boolean isFirstGroupInAccount, int memberCount,
+            int groupCountForThisAccount) {
         mAccountName = accountName;
         mAccountType = accountType;
+        mDataSet = dataSet;
         mGroupId = groupId;
         mTitle = title;
         mIsFirstGroupInAccount = isFirstGroupInAccount;
@@ -49,6 +52,10 @@
         return mAccountType;
     }
 
+    public String getDataSet() {
+        return mDataSet;
+    }
+
     public long getGroupId() {
         return mGroupId;
     }
diff --git a/src/com/android/contacts/group/SuggestedMemberListAdapter.java b/src/com/android/contacts/group/SuggestedMemberListAdapter.java
index 5abb5fb..e013665 100644
--- a/src/com/android/contacts/group/SuggestedMemberListAdapter.java
+++ b/src/com/android/contacts/group/SuggestedMemberListAdapter.java
@@ -76,8 +76,9 @@
     private ContentResolver mContentResolver;
     private LayoutInflater mInflater;
 
-    private String mAccountType = "";
-    private String mAccountName = "";
+    private String mAccountType;
+    private String mAccountName;
+    private String mDataSet;
 
     // TODO: Make this a Map for better performance when we check if a new contact is in the list
     // or not
@@ -98,6 +99,10 @@
         mAccountName = accountName;
     }
 
+    public void setDataSet(String dataSet) {
+        mDataSet = dataSet;
+    }
+
     public void setContentResolver(ContentResolver resolver) {
         mContentResolver = resolver;
     }
@@ -171,12 +176,25 @@
             // First query for all the raw contacts that match the given search query
             // and have the same account name and type as specified in this adapter
             String searchQuery = prefix.toString() + "%";
+            String accountClause = RawContacts.ACCOUNT_NAME + "=? AND " +
+                    RawContacts.ACCOUNT_TYPE + "=?";
+            String[] args;
+            if (mDataSet == null) {
+                accountClause += " AND " + RawContacts.DATA_SET + " IS NULL";
+                args = new String[] {mAccountName, mAccountType, searchQuery, searchQuery};
+            } else {
+                accountClause += " AND " + RawContacts.DATA_SET + "=?";
+                args = new String[] {
+                        mAccountName, mAccountType, mDataSet, searchQuery, searchQuery
+                };
+            }
+
             Cursor cursor = mContentResolver.query(
                     RawContacts.CONTENT_URI, PROJECTION_FILTERED_MEMBERS,
-                    RawContacts.ACCOUNT_NAME + "=? AND " + RawContacts.ACCOUNT_TYPE + "=? AND (" +
+                    accountClause + " AND (" +
                     RawContacts.DISPLAY_NAME_PRIMARY + " LIKE ? OR " +
                     RawContacts.DISPLAY_NAME_ALTERNATIVE + " LIKE ? )",
-                    new String[] {mAccountName, mAccountType, searchQuery, searchQuery}, null);
+                    args, null);
 
             if (cursor == null) {
                 return results;
diff --git a/src/com/android/contacts/interactions/ContactDeletionInteraction.java b/src/com/android/contacts/interactions/ContactDeletionInteraction.java
index dfcd7b6..93bd10e 100644
--- a/src/com/android/contacts/interactions/ContactDeletionInteraction.java
+++ b/src/com/android/contacts/interactions/ContactDeletionInteraction.java
@@ -59,14 +59,16 @@
     private static final String[] ENTITY_PROJECTION = new String[] {
         Entity.RAW_CONTACT_ID, //0
         Entity.ACCOUNT_TYPE, //1
-        Entity.CONTACT_ID, // 2
-        Entity.LOOKUP_KEY, // 3
+        Entity.DATA_SET, // 2
+        Entity.CONTACT_ID, // 3
+        Entity.LOOKUP_KEY, // 4
     };
 
     private static final int COLUMN_INDEX_RAW_CONTACT_ID = 0;
     private static final int COLUMN_INDEX_ACCOUNT_TYPE = 1;
-    private static final int COLUMN_INDEX_CONTACT_ID = 2;
-    private static final int COLUMN_INDEX_LOOKUP_KEY = 3;
+    private static final int COLUMN_INDEX_DATA_SET = 2;
+    private static final int COLUMN_INDEX_CONTACT_ID = 3;
+    private static final int COLUMN_INDEX_LOOKUP_KEY = 4;
 
     private boolean mActive;
     private Uri mContactUri;
@@ -233,9 +235,10 @@
         while (cursor.moveToNext()) {
             final long rawContactId = cursor.getLong(COLUMN_INDEX_RAW_CONTACT_ID);
             final String accountType = cursor.getString(COLUMN_INDEX_ACCOUNT_TYPE);
+            final String dataSet = cursor.getString(COLUMN_INDEX_DATA_SET);
             contactId = cursor.getLong(COLUMN_INDEX_CONTACT_ID);
             lookupKey = cursor.getString(COLUMN_INDEX_LOOKUP_KEY);
-            AccountType type = accountTypes.getAccountType(accountType);
+            AccountType type = accountTypes.getAccountType(accountType, dataSet);
             boolean readonly = type != null && type.readOnly;
             if (readonly) {
                 readOnlyRawContacts.add(rawContactId);
diff --git a/src/com/android/contacts/interactions/GroupCreationDialogFragment.java b/src/com/android/contacts/interactions/GroupCreationDialogFragment.java
index 87d83b4..224b4a0 100644
--- a/src/com/android/contacts/interactions/GroupCreationDialogFragment.java
+++ b/src/com/android/contacts/interactions/GroupCreationDialogFragment.java
@@ -17,8 +17,8 @@
 
 import com.android.contacts.ContactSaveService;
 import com.android.contacts.R;
+import com.android.contacts.model.AccountWithDataSet;
 
-import android.accounts.Account;
 import android.app.Activity;
 import android.app.FragmentManager;
 import android.content.Intent;
@@ -31,13 +31,16 @@
 public class GroupCreationDialogFragment extends GroupNameDialogFragment {
     private static final String ARG_ACCOUNT_TYPE = "accountType";
     private static final String ARG_ACCOUNT_NAME = "accountName";
+    private static final String ARG_DATA_SET = "dataSet";
 
     public static void show(
-            FragmentManager fragmentManager, String accountType, String accountName) {
+            FragmentManager fragmentManager, String accountType, String accountName,
+            String dataSet) {
         GroupCreationDialogFragment dialog = new GroupCreationDialogFragment();
         Bundle args = new Bundle();
         args.putString(ARG_ACCOUNT_TYPE, accountType);
         args.putString(ARG_ACCOUNT_NAME, accountName);
+        args.putString(ARG_DATA_SET, dataSet);
         dialog.setArguments(args);
         dialog.show(fragmentManager, "createGroup");
     }
@@ -56,10 +59,11 @@
         Bundle arguments = getArguments();
         String accountType = arguments.getString(ARG_ACCOUNT_TYPE);
         String accountName = arguments.getString(ARG_ACCOUNT_NAME);
+        String dataSet = arguments.getString(ARG_DATA_SET);
 
         Activity activity = getActivity();
         activity.startService(ContactSaveService.createNewGroupIntent(activity,
-                new Account(accountName, accountType), groupLabel,
+                new AccountWithDataSet(accountName, accountType, dataSet), groupLabel,
                 null /* no new members to add */,
                 activity.getClass(), Intent.ACTION_EDIT));
     }
diff --git a/src/com/android/contacts/interactions/ImportExportDialogFragment.java b/src/com/android/contacts/interactions/ImportExportDialogFragment.java
index 4e22fa2..a6a37ef 100644
--- a/src/com/android/contacts/interactions/ImportExportDialogFragment.java
+++ b/src/com/android/contacts/interactions/ImportExportDialogFragment.java
@@ -19,10 +19,10 @@
 import com.android.contacts.R;
 import com.android.contacts.editor.SelectAccountDialogFragment;
 import com.android.contacts.model.AccountTypeManager;
+import com.android.contacts.model.AccountWithDataSet;
 import com.android.contacts.util.AccountSelectionUtil;
 import com.android.contacts.vcard.ExportVCardActivity;
 
-import android.accounts.Account;
 import android.app.AlertDialog;
 import android.app.Dialog;
 import android.app.DialogFragment;
@@ -169,7 +169,7 @@
         // - just one account -> use the account without asking the user
         // - no account -> use phone-local storage without asking the user
         final AccountTypeManager accountTypes = AccountTypeManager.getInstance(getActivity());
-        final List<Account> accountList = accountTypes.getAccounts(true);
+        final List<AccountWithDataSet> accountList = accountTypes.getAccounts(true);
         final int size = accountList.size();
         if (size > 1) {
             // Send over to the account selector
@@ -196,7 +196,7 @@
         }
 
         @Override
-        protected void onAccountSelected(Account account) {
+        protected void onAccountSelected(AccountWithDataSet account) {
             final int resourceId = getArguments().getInt(BUNDLE_RES_ID);
             AccountSelectionUtil.doImport(getActivity(), resourceId, account);
         }
diff --git a/src/com/android/contacts/interactions/PhoneNumberInteraction.java b/src/com/android/contacts/interactions/PhoneNumberInteraction.java
index 9762e3d..9442f5e 100644
--- a/src/com/android/contacts/interactions/PhoneNumberInteraction.java
+++ b/src/com/android/contacts/interactions/PhoneNumberInteraction.java
@@ -85,6 +85,7 @@
         long id;
         String phoneNumber;
         String accountType;
+        String dataSet;
         long type;
         String label;
 
@@ -92,6 +93,7 @@
             dest.writeLong(id);
             dest.writeString(phoneNumber);
             dest.writeString(accountType);
+            dest.writeString(dataSet);
             dest.writeLong(type);
             dest.writeString(label);
         }
@@ -148,7 +150,8 @@
             final View view = super.getView(position, convertView, parent);
 
             final PhoneItem item = getItem(position);
-            final AccountType accountType = mAccountTypeManager.getAccountType(item.accountType);
+            final AccountType accountType = mAccountTypeManager.getAccountType(
+                    item.accountType, item.dataSet);
             final TextView typeView = (TextView) view.findViewById(android.R.id.text1);
             final DataKind kind = accountType.getKindForMimetype(Phone.CONTENT_ITEM_TYPE);
             if (kind != null) {
@@ -237,6 +240,7 @@
             Phone.NUMBER,
             Phone.IS_SUPER_PRIMARY,
             RawContacts.ACCOUNT_TYPE,
+            RawContacts.DATA_SET,
             Phone.TYPE,
             Phone.LABEL
     };
@@ -335,6 +339,7 @@
                 item.phoneNumber = cursor.getString(cursor.getColumnIndex(Phone.NUMBER));
                 item.accountType =
                         cursor.getString(cursor.getColumnIndex(RawContacts.ACCOUNT_TYPE));
+                item.dataSet = cursor.getString(cursor.getColumnIndex(RawContacts.DATA_SET));
                 item.type = cursor.getInt(cursor.getColumnIndex(Phone.TYPE));
                 item.label = cursor.getString(cursor.getColumnIndex(Phone.LABEL));
 
diff --git a/src/com/android/contacts/list/AccountFilterActivity.java b/src/com/android/contacts/list/AccountFilterActivity.java
index 24eab23..f99b14e 100644
--- a/src/com/android/contacts/list/AccountFilterActivity.java
+++ b/src/com/android/contacts/list/AccountFilterActivity.java
@@ -22,8 +22,8 @@
 import com.android.contacts.activities.PeopleActivity;
 import com.android.contacts.model.AccountType;
 import com.android.contacts.model.AccountTypeManager;
+import com.android.contacts.model.AccountWithDataSet;
 
-import android.accounts.Account;
 import android.app.ActionBar;
 import android.app.Activity;
 import android.content.Context;
@@ -81,12 +81,12 @@
     private void loadAccountFilters() {
         ArrayList<ContactListFilter> accountFilters = new ArrayList<ContactListFilter>();
         final AccountTypeManager accountTypes = AccountTypeManager.getInstance(this);
-        ArrayList<Account> accounts = accountTypes.getAccounts(false);
-        for (Account account : accounts) {
-            AccountType accountType = accountTypes.getAccountType(account.type);
+        List<AccountWithDataSet> accounts = accountTypes.getAccounts(false);
+        for (AccountWithDataSet account : accounts) {
+            AccountType accountType = accountTypes.getAccountType(account.type, account.dataSet);
             Drawable icon = accountType != null ? accountType.getDisplayIcon(this) : null;
             accountFilters.add(ContactListFilter.createAccountFilter(account.type, account.name,
-                    icon, account.name));
+                    account.dataSet, icon, account.name));
         }
         int count = accountFilters.size();
 
diff --git a/src/com/android/contacts/list/ContactListFilter.java b/src/com/android/contacts/list/ContactListFilter.java
index 0651986..cfcde2a 100644
--- a/src/com/android/contacts/list/ContactListFilter.java
+++ b/src/com/android/contacts/list/ContactListFilter.java
@@ -40,6 +40,7 @@
     private static final String KEY_FILTER_TYPE = "filter.type";
     private static final String KEY_ACCOUNT_NAME = "filter.accountName";
     private static final String KEY_ACCOUNT_TYPE = "filter.accountType";
+    private static final String KEY_DATA_SET = "filter.dataSet";
     private static final String KEY_GROUP_ID = "filter.groupId";
     private static final String KEY_GROUP_SOURCE_ID = "filter.groupSourceId";
     private static final String KEY_GROUP_READ_ONLY = "filter.groupReadOnly";
@@ -48,6 +49,7 @@
     public final int filterType;
     public final String accountType;
     public final String accountName;
+    public final String dataSet;
     public final Drawable icon;
     public long groupId;
     public String groupSourceId;
@@ -55,11 +57,13 @@
     public final String title;
     private String mId;
 
-    public ContactListFilter(int filterType, String accountType, String accountName, Drawable icon,
-            long groupId, String groupSourceId, boolean groupReadOnly, String title) {
+    public ContactListFilter(int filterType, String accountType, String accountName, String dataSet,
+            Drawable icon, long groupId, String groupSourceId, boolean groupReadOnly,
+            String title) {
         this.filterType = filterType;
         this.accountType = accountType;
         this.accountName = accountName;
+        this.dataSet = dataSet;
         this.icon = icon;
         this.groupId = groupId;
         this.groupSourceId = groupSourceId;
@@ -68,24 +72,25 @@
     }
 
     public static ContactListFilter createFilterWithType(int filterType) {
-        return new ContactListFilter(filterType, null, null, null, 0, null, false, null);
+        return new ContactListFilter(filterType, null, null, null, null, 0, null, false, null);
     }
 
     public static ContactListFilter createGroupFilter(long groupId) {
-        return new ContactListFilter(ContactListFilter.FILTER_TYPE_GROUP, null, null, null, groupId,
-                null, false, null);
+        return new ContactListFilter(ContactListFilter.FILTER_TYPE_GROUP, null, null, null, null,
+                groupId, null, false, null);
     }
 
     public static ContactListFilter createGroupFilter(String accountType, String accountName,
-            long groupId, String groupSourceId, boolean groupReadOnly, String title) {
+            String dataSet, long groupId, String groupSourceId, boolean groupReadOnly,
+            String title) {
         return new ContactListFilter(ContactListFilter.FILTER_TYPE_GROUP, accountType, accountName,
-                null, groupId, groupSourceId, groupReadOnly, title);
+                dataSet, null, groupId, groupSourceId, groupReadOnly, title);
     }
 
     public static ContactListFilter createAccountFilter(String accountType, String accountName,
-            Drawable icon, String title) {
+            String dataSet, Drawable icon, String title) {
         return new ContactListFilter(ContactListFilter.FILTER_TYPE_ACCOUNT, accountType,
-                accountName, icon, 0, null, false, title);
+                accountName, dataSet, icon, 0, null, false, title);
     }
 
     /**
@@ -111,10 +116,11 @@
             case FILTER_TYPE_SINGLE_CONTACT:
                 return "single";
             case FILTER_TYPE_ACCOUNT:
-                return "account: " + accountType + " " + accountName;
+                return "account: " + accountType + (dataSet != null ? "/" + dataSet : "")
+                        + " " + accountName;
             case FILTER_TYPE_GROUP:
-                return "group: " + accountType + " " + accountName + " " + title + "(" + groupId
-                        + ")";
+                return "group: " + accountType + (dataSet != null ? "/" + dataSet : "")
+                        + " " + accountName + " " + title + "(" + groupId + ")";
         }
         return super.toString();
     }
@@ -147,6 +153,9 @@
             code = code * 31 + accountType.hashCode();
             code = code * 31 + accountName.hashCode();
         }
+        if (dataSet != null) {
+            code = code * 31 + dataSet.hashCode();
+        }
         if (groupSourceId != null) {
             code = code * 31 + groupSourceId.hashCode();
         } else if (groupId != 0) {
@@ -168,7 +177,8 @@
         ContactListFilter otherFilter = (ContactListFilter) other;
         if (filterType != otherFilter.filterType
                 || !TextUtils.equals(accountName, otherFilter.accountName)
-                || !TextUtils.equals(accountType, otherFilter.accountType)) {
+                || !TextUtils.equals(accountType, otherFilter.accountType)
+                || !TextUtils.equals(dataSet, otherFilter.dataSet)) {
             return false;
         }
 
@@ -184,6 +194,7 @@
             .putInt(KEY_FILTER_TYPE, filter == null ? FILTER_TYPE_DEFAULT : filter.filterType)
             .putString(KEY_ACCOUNT_NAME, filter == null ? null : filter.accountName)
             .putString(KEY_ACCOUNT_TYPE, filter == null ? null : filter.accountType)
+            .putString(KEY_DATA_SET, filter == null ? null : filter.dataSet)
             .putLong(KEY_GROUP_ID, filter == null ? -1 : filter.groupId)
             .putString(KEY_GROUP_SOURCE_ID, filter == null ? null : filter.groupSourceId)
             .putBoolean(KEY_GROUP_READ_ONLY, filter == null ? false : filter.groupReadOnly)
@@ -199,11 +210,12 @@
 
         String accountName = prefs.getString(KEY_ACCOUNT_NAME, null);
         String accountType = prefs.getString(KEY_ACCOUNT_TYPE, null);
+        String dataSet = prefs.getString(KEY_DATA_SET, null);
         long groupId = prefs.getLong(KEY_GROUP_ID, -1);
         String groupSourceId = prefs.getString(KEY_GROUP_SOURCE_ID, null);
         boolean groupReadOnly = prefs.getBoolean(KEY_GROUP_READ_ONLY, false);
         String title = prefs.getString(KEY_GROUP_TITLE, "group");
-        return new ContactListFilter(filterType, accountType, accountName, null, groupId,
+        return new ContactListFilter(filterType, accountType, accountName, dataSet, null, groupId,
                 groupSourceId, groupReadOnly, title);
     }
 
@@ -213,6 +225,7 @@
         dest.writeInt(filterType);
         dest.writeString(accountName);
         dest.writeString(accountType);
+        dest.writeString(dataSet);
         dest.writeLong(groupId);
         dest.writeString(groupSourceId);
         dest.writeInt(groupReadOnly ? 1 : 0);
@@ -225,11 +238,12 @@
             int filterType = source.readInt();
             String accountName = source.readString();
             String accountType = source.readString();
+            String dataSet = source.readString();
             long groupId = source.readLong();
             String groupSourceId = source.readString();
             boolean groupReadOnly = source.readInt() != 0;
-            return new ContactListFilter(filterType, accountType, accountName, null, groupId,
-                    groupSourceId, groupReadOnly, null);
+            return new ContactListFilter(filterType, accountType, accountName, dataSet, null,
+                    groupId, groupSourceId, groupReadOnly, null);
         }
 
         @Override
@@ -253,6 +267,9 @@
             if (accountType != null) {
                 sb.append('-').append(accountType);
             }
+            if (dataSet != null) {
+                sb.append('/').append(dataSet);
+            }
             if (accountName != null) {
                 sb.append('-').append(accountName.replace('-', '_'));
             }
diff --git a/src/com/android/contacts/list/ContactTileAdapter.java b/src/com/android/contacts/list/ContactTileAdapter.java
index 53b744d..8993cdd 100644
--- a/src/com/android/contacts/list/ContactTileAdapter.java
+++ b/src/com/android/contacts/list/ContactTileAdapter.java
@@ -198,8 +198,8 @@
         }
 
         // There are not NON Starred contacts in cursor
-        // Set divider positon to end and add 1 to make sure it doesn't get drawn
-        return cursor.getCount() + 1;
+        // Set divider positon to end
+        return cursor.getCount();
     }
 
     private ContactEntry createContactEntryFromCursor(Cursor cursor, int position) {
@@ -246,15 +246,19 @@
                 return getRowCount(mContactCursor.getCount());
             case STREQUENT:
             case STREQUENT_PHONE_ONLY:
-                /*
-                 * Takes numbers of rows the Starred Contacts Occupy
-                 * Calculates the number of frequent contacts
-                 * Adds them together and an additional 1 for the divider
-                 */
-                return getRowCount(mDividerPosition) +
-                        mContactCursor.getCount() - mDividerPosition + 1;
+                // Takes numbers of rows the Starred Contacts Occupy
+                int starredRowCount = getRowCount(mDividerPosition);
+
+                // Calculates the number of frequent contacts
+                int frequentRowCount = mContactCursor.getCount() - mDividerPosition ;
+
+                // If there are any frequent contacts add one for the divider
+                frequentRowCount += frequentRowCount == 0 ? 0 : 1;
+
+                // Return the number of starred plus frequent rows
+                return starredRowCount + frequentRowCount;
             case FREQUENT_ONLY:
-                // Number of contacts plus one for the header
+                // Number of frequent contacts plus one for the header
                 return mContactCursor.getCount() + 1;
             default:
                 throw new IllegalArgumentException("Unrecognized DisplayType " + mDisplayType);
@@ -280,7 +284,8 @@
 
         switch (mDisplayType) {
             case FREQUENT_ONLY:
-                resultList.add(createContactEntryFromCursor(mContactCursor, position));
+                // Taking the current position and subtracting one because of the header
+                resultList.add(createContactEntryFromCursor(mContactCursor, position - 1));
                 break;
             case STARRED_ONLY:
             case GROUP_MEMBERS:
@@ -316,11 +321,9 @@
 
     @Override
     public long getItemId(int position) {
-        /*
-         * As we show several selectable items for each ListView row,
-         * we can not determine a stable id. But as we don't rely on ListView's selection,
-         * this should not be a problem.
-         */
+        // As we show several selectable items for each ListView row,
+        // we can not determine a stable id. But as we don't rely on ListView's selection,
+        // this should not be a problem.
         return position;
     }
 
diff --git a/src/com/android/contacts/list/CustomContactListFilterActivity.java b/src/com/android/contacts/list/CustomContactListFilterActivity.java
index 0f6aaad..ae21824 100644
--- a/src/com/android/contacts/list/CustomContactListFilterActivity.java
+++ b/src/com/android/contacts/list/CustomContactListFilterActivity.java
@@ -21,6 +21,7 @@
 import com.android.contacts.R;
 import com.android.contacts.model.AccountType;
 import com.android.contacts.model.AccountTypeManager;
+import com.android.contacts.model.AccountWithDataSet;
 import com.android.contacts.model.EntityDelta.ValuesDelta;
 import com.android.contacts.model.GoogleAccountType;
 import com.android.contacts.util.EmptyService;
@@ -28,7 +29,6 @@
 import com.android.contacts.util.WeakAsyncTask;
 import com.google.android.collect.Lists;
 
-import android.accounts.Account;
 import android.app.Activity;
 import android.app.AlertDialog;
 import android.app.LoaderManager.LoaderCallbacks;
@@ -124,13 +124,14 @@
             final ContentResolver resolver = context.getContentResolver();
 
             final AccountSet accounts = new AccountSet();
-            for (Account account : accountTypes.getAccounts(false)) {
+            for (AccountWithDataSet account : accountTypes.getAccounts(false)) {
                 AccountDisplay accountDisplay =
-                        new AccountDisplay(resolver, account.name, account.type);
+                        new AccountDisplay(resolver, account.name, account.type, account.dataSet);
 
                 final Uri groupsUri = Groups.CONTENT_URI.buildUpon()
                         .appendQueryParameter(Groups.ACCOUNT_NAME, account.name)
-                        .appendQueryParameter(Groups.ACCOUNT_TYPE, account.type).build();
+                        .appendQueryParameter(Groups.ACCOUNT_TYPE, account.type)
+                        .appendQueryParameter(Groups.DATA_SET, account.dataSet).build();
                 EntityIterator iterator = ContactsContract.Groups.newEntityIterator(resolver.query(
                         groupsUri, null, null, null, null));
                 try {
@@ -417,12 +418,13 @@
     }
 
     /**
-     * {@link GroupDelta} details for a single {@link Account}, usually shown as
+     * {@link GroupDelta} details for a single {@link AccountWithDataSet}, usually shown as
      * children under a single expandable group.
      */
     protected static class AccountDisplay {
-        public String mName;
-        public String mType;
+        public final String mName;
+        public final String mType;
+        public final String mDataSet;
 
         public GroupDelta mUngrouped;
         public ArrayList<GroupDelta> mSyncedGroups = Lists.newArrayList();
@@ -430,11 +432,13 @@
 
         /**
          * Build an {@link AccountDisplay} covering all {@link Groups} under the
-         * given {@link Account}.
+         * given {@link AccountWithDataSet}.
          */
-        public AccountDisplay(ContentResolver resolver, String accountName, String accountType) {
+        public AccountDisplay(ContentResolver resolver, String accountName, String accountType,
+                String dataSet) {
             mName = accountName;
             mType = accountType;
+            mDataSet = dataSet;
         }
 
         /**
@@ -489,7 +493,7 @@
 
         /**
          * Build set of {@link ContentProviderOperation} to persist any user
-         * changes to {@link GroupDelta} rows under this {@link Account}.
+         * changes to {@link GroupDelta} rows under this {@link AccountWithDataSet}.
          */
         public void buildDiff(ArrayList<ContentProviderOperation> diff) {
             for (GroupDelta group : mSyncedGroups) {
@@ -505,7 +509,7 @@
 
     /**
      * {@link ExpandableListAdapter} that shows {@link GroupDelta} settings,
-     * grouped by {@link Account} type. Shows footer row when any groups are
+     * grouped by {@link AccountWithDataSet} type. Shows footer row when any groups are
      * unsynced, as determined through {@link AccountDisplay#mUnsyncedGroups}.
      */
     protected static class DisplayAdapter extends BaseExpandableListAdapter {
@@ -548,7 +552,8 @@
 
             final AccountDisplay account = (AccountDisplay)this.getGroup(groupPosition);
 
-            final AccountType accountType = mAccountTypes.getAccountType(account.mType);
+            final AccountType accountType = mAccountTypes.getAccountType(
+                    account.mType, account.mDataSet);
 
             text1.setText(account.mName);
             text1.setVisibility(account.mName == null ? View.GONE : View.VISIBLE);
@@ -693,7 +698,7 @@
 
     protected int getSyncMode(AccountDisplay account) {
         // TODO: read sync mode through <sync-adapter> definition
-        if (GoogleAccountType.ACCOUNT_TYPE.equals(account.mType)) {
+        if (GoogleAccountType.ACCOUNT_TYPE.equals(account.mType) && account.mDataSet == null) {
             return SYNC_MODE_EVERYTHING;
         } else {
             return SYNC_MODE_UNSUPPORTED;
diff --git a/src/com/android/contacts/list/DefaultContactListAdapter.java b/src/com/android/contacts/list/DefaultContactListAdapter.java
index 8b93888..8e96690 100644
--- a/src/com/android/contacts/list/DefaultContactListAdapter.java
+++ b/src/com/android/contacts/list/DefaultContactListAdapter.java
@@ -196,9 +196,15 @@
                                 + "SELECT DISTINCT " + RawContacts.CONTACT_ID
                                 + " FROM raw_contacts"
                                 + " WHERE " + RawContacts.ACCOUNT_TYPE + "=?"
-                                + "   AND " + RawContacts.ACCOUNT_NAME + "=?)");
+                                + "   AND " + RawContacts.ACCOUNT_NAME + "=?");
                 selectionArgs.add(filter.accountType);
                 selectionArgs.add(filter.accountName);
+                if (filter.dataSet != null) {
+                    selection.append(" AND " + RawContacts.DATA_SET + "=?)");
+                    selectionArgs.add(filter.dataSet);
+                } else {
+                    selection.append(" AND " + RawContacts.DATA_SET + " IS NULL)");
+                }
                 break;
             }
             case ContactListFilter.FILTER_TYPE_GROUP: {
diff --git a/src/com/android/contacts/model/AccountType.java b/src/com/android/contacts/model/AccountType.java
index 608fca3..59b9f45 100644
--- a/src/com/android/contacts/model/AccountType.java
+++ b/src/com/android/contacts/model/AccountType.java
@@ -38,6 +38,7 @@
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.HashMap;
+import java.util.List;
 
 /**
  * Internal structure that represents constraints and styles for a specific data
@@ -49,12 +50,19 @@
 public abstract class AccountType {
     private static final String TAG = "AccountType";
 
+    private static final String ACCOUNT_TYPE_DATA_SET_DELIMITER = "/";
+
     /**
      * The {@link RawContacts#ACCOUNT_TYPE} these constraints apply to.
      */
     public String accountType = null;
 
     /**
+     * The {@link RawContacts#DATA_SET} these constraints apply to.
+     */
+    public String dataSet = null;
+
+    /**
      * Package that resources should be loaded from, either defined through an
      * {@link Account} or for matching against {@link Data#RES_PACKAGE}.
      */
@@ -116,6 +124,34 @@
     }
 
     /**
+     * Returns the account type with the data set (if any) appended after a delimiter.
+     * If the data set is null, this will simply return the account type.
+     */
+    public String getAccountTypeAndDataSet() {
+        return getAccountTypeAndDataSet(accountType, dataSet);
+    }
+
+    /**
+     * Utility method to concatenate the given account type with a data set with a delimiter.
+     * If the data set is null, this will simply return the account type.
+     */
+    public static String getAccountTypeAndDataSet(String accountType, String dataSet) {
+        return dataSet == null
+                ? accountType
+                : accountType + ACCOUNT_TYPE_DATA_SET_DELIMITER + dataSet;
+    }
+
+    /**
+     * Returns a list of additional package names that should be inspected as additional
+     * external account types.  This allows for a primary account type to indicate other packages
+     * that may not be sync adapters but which still provide contact data, perhaps under a
+     * separate data set within the account.
+     */
+    public List<String> getExtensionPackageNames() {
+        return new ArrayList<String>();
+    }
+
+    /**
      * Returns an optional custom label for the "invite contact" action, which will be shown on
      * the contact card.  (If not defined, returns null.)
      */
@@ -186,7 +222,7 @@
     /**
      * Find the {@link DataKind} for a specific MIME-type, if it's handled by
      * this data source. If you may need a fallback {@link DataKind}, use
-     * {@link AccountTypeManager#getKindOrFallback(String, String)}.
+     * {@link AccountTypeManager#getKindOrFallback(String, String, String)}.
      */
     public DataKind getKindForMimetype(String mimeType) {
         return this.mMimeKinds.get(mimeType);
diff --git a/src/com/android/contacts/model/AccountTypeManager.java b/src/com/android/contacts/model/AccountTypeManager.java
index ea2568f..7232a26 100644
--- a/src/com/android/contacts/model/AccountTypeManager.java
+++ b/src/com/android/contacts/model/AccountTypeManager.java
@@ -16,8 +16,10 @@
 
 package com.android.contacts.model;
 
+import com.android.internal.util.Objects;
 import com.google.android.collect.Lists;
 import com.google.android.collect.Maps;
+import com.google.android.collect.Sets;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.i18n.phonenumbers.PhoneNumberUtil;
 
@@ -43,13 +45,14 @@
 import android.text.TextUtils;
 import android.util.Log;
 
-import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Locale;
 import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.CountDownLatch;
 
 /**
@@ -79,9 +82,9 @@
         return new AccountTypeManagerImpl(context);
     }
 
-    public abstract ArrayList<Account> getAccounts(boolean writableOnly);
+    public abstract List<AccountWithDataSet> getAccounts(boolean writableOnly);
 
-    public abstract AccountType getAccountType(String accountType);
+    public abstract AccountType getAccountType(String accountType, String dataSet);
 
     /**
      * @return Unmodifiable map from account type strings to {@link AccountType}s which support
@@ -91,11 +94,11 @@
 
     /**
      * Find the best {@link DataKind} matching the requested
-     * {@link AccountType#accountType} and {@link DataKind#mimeType}. If no
-     * direct match found, we try searching {@link FallbackAccountType}.
+     * {@link AccountType#accountType}, {@link AccountType#dataSet}, and {@link DataKind#mimeType}.
+     * If no direct match found, we try searching {@link FallbackAccountType}.
      */
-    public DataKind getKindOrFallback(String accountType, String mimeType) {
-        final AccountType type = getAccountType(accountType);
+    public DataKind getKindOrFallback(String accountType, String dataSet, String mimeType) {
+        final AccountType type = getAccountType(accountType, dataSet);
         return type == null ? null : type.getKindForMimetype(mimeType);
     }
 }
@@ -108,9 +111,9 @@
 
     private AccountType mFallbackAccountType;
 
-    private ArrayList<Account> mAccounts = Lists.newArrayList();
-    private ArrayList<Account> mWritableAccounts = Lists.newArrayList();
-    private HashMap<String, AccountType> mAccountTypes = Maps.newHashMap();
+    private List<AccountWithDataSet> mAccounts = Lists.newArrayList();
+    private List<AccountWithDataSet> mWritableAccounts = Lists.newArrayList();
+    private Map<String, AccountType> mAccountTypesWithDataSets = Maps.newHashMap();
     private Map<String, AccountType> mInvitableAccountTypes = Collections.unmodifiableMap(
             new HashMap<String, AccountType>());
 
@@ -134,14 +137,41 @@
     private volatile CountDownLatch mInitializationLatch = new CountDownLatch(1);
 
     private static final Comparator<Account> ACCOUNT_COMPARATOR = new Comparator<Account>() {
-
         @Override
-        public int compare(Account account1, Account account2) {
-            int diff = account1.name.compareTo(account2.name);
-            if (diff != 0) {
-                return diff;
+        public int compare(Account a, Account b) {
+            String aDataSet = null;
+            String bDataSet = null;
+            if (a instanceof AccountWithDataSet) {
+                aDataSet = ((AccountWithDataSet) a).dataSet;
             }
-            return account1.type.compareTo(account2.type);
+            if (b instanceof AccountWithDataSet) {
+                bDataSet = ((AccountWithDataSet) b).dataSet;
+            }
+
+            if (Objects.equal(a.name, b.name) && Objects.equal(a.type, b.type)
+                    && Objects.equal(aDataSet, bDataSet)) {
+                return 0;
+            } else if (b.name == null || b.type == null) {
+                return -1;
+            } else if (a.name == null || a.type == null) {
+                return 1;
+            } else {
+                int diff = a.name.compareTo(b.name);
+                if (diff != 0) {
+                    return diff;
+                }
+                diff = a.type.compareTo(b.type);
+                if (diff != 0) {
+                    return diff;
+                }
+
+                // Accounts without data sets get sorted before those that have them.
+                if (aDataSet != null) {
+                    return bDataSet == null ? 1 : aDataSet.compareTo(bDataSet);
+                } else {
+                    return -1;
+                }
+            }
         }
     };
 
@@ -228,15 +258,23 @@
     }
 
     /**
-     * Loads account list and corresponding account types. Always called on a
-     * background thread.
+     * Loads account list and corresponding account types (potentially with data sets). Always
+     * called on a background thread.
      */
     protected void loadAccountsInBackground() {
         long startTime = SystemClock.currentThreadTimeMillis();
 
-        HashMap<String, AccountType> accountTypes = Maps.newHashMap();
-        ArrayList<Account> allAccounts = Lists.newArrayList();
-        ArrayList<Account> writableAccounts = Lists.newArrayList();
+        // Account types, keyed off the account type and data set concatenation.
+        Map<String, AccountType> accountTypesByTypeAndDataSet = Maps.newHashMap();
+
+        // The same AccountTypes, but keyed off {@link RawContacts#ACCOUNT_TYPE}.  Since there can
+        // be multiple account types (with different data sets) for the same type of account, each
+        // type string may have multiple AccountType entries.
+        Map<String, List<AccountType>> accountTypesByType = Maps.newHashMap();
+
+        List<AccountWithDataSet> allAccounts = Lists.newArrayList();
+        List<AccountWithDataSet> writableAccounts = Lists.newArrayList();
+        Set<String> extensionPackages = Sets.newHashSet();
 
         final AccountManager am = mAccountManager;
         final IContentService cs = ContentResolver.getContentService();
@@ -245,6 +283,7 @@
             final SyncAdapterType[] syncs = cs.getSyncAdapterTypes();
             final AuthenticatorDescription[] auths = am.getAuthenticatorTypes();
 
+            // First process sync adapters to find any that provide contact data.
             for (SyncAdapterType sync : syncs) {
                 if (!ContactsContract.AUTHORITY.equals(sync.authority)) {
                     // Skip sync adapters that don't provide contact data.
@@ -277,31 +316,52 @@
                 accountType.titleRes = auth.labelId;
                 accountType.iconRes = auth.iconId;
 
-                accountTypes.put(accountType.accountType, accountType);
+                addAccountType(accountType, accountTypesByTypeAndDataSet, accountTypesByType);
+
+                // Check to see if the account type knows of any other non-sync-adapter packages
+                // that may provide other data sets of contact data.
+                extensionPackages.addAll(accountType.getExtensionPackageNames());
+            }
+
+            // If any extension packages were specified, process them as well.
+            if (!extensionPackages.isEmpty()) {
+                Log.d(TAG, "Registering " + extensionPackages.size() + " extension packages");
+                for (String extensionPackage : extensionPackages) {
+                    ExternalAccountType accountType =
+                            new ExternalAccountType(mContext, extensionPackage);
+                    Log.d(TAG, "Registering extension package account type="
+                            + accountType.accountType + ", dataSet=" + accountType.dataSet
+                            + ", packageName=" + extensionPackage);
+
+                    addAccountType(accountType, accountTypesByTypeAndDataSet, accountTypesByType);
+                }
             }
         } catch (RemoteException e) {
             Log.w(TAG, "Problem loading accounts: " + e.toString());
         }
 
+        // Map in accounts to associate the account names with each account type entry.
         Account[] accounts = mAccountManager.getAccounts();
         for (Account account : accounts) {
             boolean syncable = false;
             try {
-                int isSyncable = cs.getIsSyncable(account, ContactsContract.AUTHORITY);
-                if (isSyncable > 0) {
-                    syncable = true;
-                }
+                syncable = cs.getIsSyncable(account, ContactsContract.AUTHORITY) > 0;
             } catch (RemoteException e) {
                 Log.e(TAG, "Cannot obtain sync flag for account: " + account, e);
             }
 
             if (syncable) {
-                // Ensure we have details loaded for each account
-                final AccountType accountType = accountTypes.get(account.type);
-                if (accountType != null) {
-                    allAccounts.add(account);
-                    if (!accountType.readOnly) {
-                        writableAccounts.add(account);
+                List<AccountType> accountTypes = accountTypesByType.get(account.type);
+                if (accountTypes != null) {
+                    // Add an account-with-data-set entry for each account type that is
+                    // authenticated by this account.
+                    for (AccountType accountType : accountTypes) {
+                        AccountWithDataSet accountWithDataSet = new AccountWithDataSet(
+                                account.name, account.type, accountType.dataSet);
+                        allAccounts.add(accountWithDataSet);
+                        if (!accountType.readOnly) {
+                            writableAccounts.add(accountWithDataSet);
+                        }
                     }
                 }
             }
@@ -317,13 +377,14 @@
         long endTime = SystemClock.currentThreadTimeMillis();
 
         synchronized (this) {
-            mAccountTypes = accountTypes;
+            mAccountTypesWithDataSets = accountTypesByTypeAndDataSet;
             mAccounts = allAccounts;
             mWritableAccounts = writableAccounts;
-            mInvitableAccountTypes = findInvitableAccountTypes(mContext, allAccounts, accountTypes);
+            mInvitableAccountTypes = findInvitableAccountTypes(
+                    mContext, allAccounts, accountTypesByTypeAndDataSet);
         }
 
-        Log.i(TAG, "Loaded meta-data for " + mAccountTypes.size() + " account types, "
+        Log.i(TAG, "Loaded meta-data for " + mAccountTypesWithDataSets.size() + " account types, "
                 + mAccounts.size() + " accounts in " + (endTime - startTime) + "ms");
 
         if (mInitializationLatch != null) {
@@ -332,6 +393,19 @@
         }
     }
 
+    // Bookkeeping method for tracking the known account types in the given maps.
+    private void addAccountType(AccountType accountType,
+            Map<String, AccountType> accountTypesByTypeAndDataSet,
+            Map<String, List<AccountType>> accountTypesByType) {
+        accountTypesByTypeAndDataSet.put(accountType.getAccountTypeAndDataSet(), accountType);
+        List<AccountType> accountsForType = accountTypesByType.get(accountType.accountType);
+        if (accountsForType == null) {
+            accountsForType = Lists.newArrayList();
+        }
+        accountsForType.add(accountType);
+        accountTypesByType.put(accountType.accountType, accountsForType);
+    }
+
     /**
      * Find a specific {@link AuthenticatorDescription} in the provided list
      * that matches the given account type.
@@ -347,26 +421,27 @@
     }
 
     /**
-     * Return list of all known, writable {@link Account}'s.
+     * Return list of all known, writable {@link AccountWithDataSet}'s.
      */
     @Override
-    public ArrayList<Account> getAccounts(boolean writableOnly) {
+    public List<AccountWithDataSet> getAccounts(boolean writableOnly) {
         ensureAccountsLoaded();
         return writableOnly ? mWritableAccounts : mAccounts;
     }
 
     /**
      * Find the best {@link DataKind} matching the requested
-     * {@link AccountType#accountType} and {@link DataKind#mimeType}. If no
-     * direct match found, we try searching {@link FallbackAccountType}.
+     * {@link AccountType#accountType}, {@link AccountType#dataSet}, and {@link DataKind#mimeType}.
+     * If no direct match found, we try searching {@link FallbackAccountType}.
      */
     @Override
-    public DataKind getKindOrFallback(String accountType, String mimeType) {
+    public DataKind getKindOrFallback(String accountType, String dataSet, String mimeType) {
         ensureAccountsLoaded();
         DataKind kind = null;
 
         // Try finding account type and kind matching request
-        final AccountType type = mAccountTypes.get(accountType);
+        final AccountType type = mAccountTypesWithDataSets.get(
+                AccountType.getAccountTypeAndDataSet(accountType, dataSet));
         if (type != null) {
             kind = type.getKindForMimetype(mimeType);
         }
@@ -384,13 +459,14 @@
     }
 
     /**
-     * Return {@link AccountType} for the given account type.
+     * Return {@link AccountType} for the given account type and data set.
      */
     @Override
-    public AccountType getAccountType(String accountType) {
+    public AccountType getAccountType(String accountType, String dataSet) {
         ensureAccountsLoaded();
         synchronized (this) {
-            AccountType type = mAccountTypes.get(accountType);
+            AccountType type = mAccountTypesWithDataSets.get(
+                    AccountType.getAccountTypeAndDataSet(accountType, dataSet));
             return type != null ? type : mFallbackAccountType;
         }
     }
@@ -406,20 +482,23 @@
      */
     @VisibleForTesting
     static Map<String, AccountType> findInvitableAccountTypes(Context context,
-            Collection<Account> accounts, Map<String, AccountType> accountTypes) {
+            Collection<AccountWithDataSet> accounts,
+            Map<String, AccountType> accountTypesByTypeAndDataSet) {
         HashMap<String, AccountType> result = Maps.newHashMap();
-        for (Account account : accounts) {
-            AccountType type = accountTypes.get(account.type);
+        for (AccountWithDataSet account : accounts) {
+            String accountTypeWithDataSet = account.getAccountTypeWithDataSet();
+            AccountType type = accountTypesByTypeAndDataSet.get(
+                    account.getAccountTypeWithDataSet());
             if (type == null) continue; // just in case
-            if (result.containsKey(type.accountType)) continue;
+            if (result.containsKey(accountTypeWithDataSet)) continue;
 
             if (Log.isLoggable(TAG, Log.DEBUG)) {
-                Log.d(TAG, "Type " + type.accountType
+                Log.d(TAG, "Type " + accountTypeWithDataSet
                         + " inviteClass=" + type.getInviteContactActivityClassName()
                         + " inviteAction=" + type.getInviteContactActionLabel(context));
             }
             if (!TextUtils.isEmpty(type.getInviteContactActivityClassName())) {
-                result.put(type.accountType, type);
+                result.put(accountTypeWithDataSet, type);
             }
         }
         return Collections.unmodifiableMap(result);
diff --git a/src/com/android/contacts/model/AccountWithDataSet.java b/src/com/android/contacts/model/AccountWithDataSet.java
new file mode 100644
index 0000000..1d97614
--- /dev/null
+++ b/src/com/android/contacts/model/AccountWithDataSet.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.contacts.model;
+
+import com.android.internal.util.Objects;
+
+import android.accounts.Account;
+import android.os.Parcel;
+
+/**
+ * Wrapper for an account that includes a data set (which may be null).
+ */
+public class AccountWithDataSet extends Account {
+
+    public final String dataSet;
+
+    public AccountWithDataSet(String name, String type, String dataSet) {
+        super(name, type);
+        this.dataSet = dataSet;
+    }
+
+    public AccountWithDataSet(Parcel in, String dataSet) {
+        super(in);
+        this.dataSet = dataSet;
+    }
+
+    public String getAccountTypeWithDataSet() {
+        return dataSet == null ? type : AccountType.getAccountTypeAndDataSet(type, dataSet);
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        return (o instanceof AccountWithDataSet) && super.equals(o)
+                && Objects.equal(((AccountWithDataSet) o).dataSet, dataSet);
+    }
+
+    @Override
+    public int hashCode() {
+        return 31 * super.hashCode()
+                + (dataSet == null ? 0 : dataSet.hashCode());
+    }
+
+    @Override
+    public String toString() {
+        return "AccountWithDataSet {name=" + name + ", type=" + type + ", dataSet=" + dataSet + "}";
+    }
+}
diff --git a/src/com/android/contacts/model/BaseAccountType.java b/src/com/android/contacts/model/BaseAccountType.java
index 06cb039..aca2d3c 100644
--- a/src/com/android/contacts/model/BaseAccountType.java
+++ b/src/com/android/contacts/model/BaseAccountType.java
@@ -64,6 +64,7 @@
 
     public BaseAccountType() {
         this.accountType = null;
+        this.dataSet = null;
         this.titleRes = R.string.account_phone;
         this.iconRes = R.mipmap.ic_launcher_contacts;
     }
@@ -205,6 +206,7 @@
                 android.R.drawable.sym_action_call, 10, true,
                 R.layout.text_fields_editor_view, android.R.style.TextAppearance_Medium));
         kind.iconAltRes = R.drawable.sym_action_sms;
+        kind.iconAltResDark = R.drawable.ic_text_holo_dark;
         kind.actionHeader = new PhoneActionInflater();
         kind.actionAltHeader = new PhoneActionAltInflater();
         kind.actionBody = new SimpleInflater(Phone.NUMBER);
diff --git a/src/com/android/contacts/model/DataKind.java b/src/com/android/contacts/model/DataKind.java
index 40f6f99..a3b31e3 100644
--- a/src/com/android/contacts/model/DataKind.java
+++ b/src/com/android/contacts/model/DataKind.java
@@ -27,7 +27,10 @@
     public String mimeType;
     public int titleRes;
     public int iconRes;
+    /** Icon used for secondary action when shown on top of a bright background */
     public int iconAltRes;
+    /** Icon used for secondary action when shown on top of a dark background */
+    public int iconAltResDark;
     public int weight;
     public boolean editable;
 
diff --git a/src/com/android/contacts/model/EntityModifier.java b/src/com/android/contacts/model/EntityModifier.java
index fb05162..fdac645 100644
--- a/src/com/android/contacts/model/EntityModifier.java
+++ b/src/com/android/contacts/model/EntityModifier.java
@@ -378,8 +378,10 @@
      */
     public static void trimEmpty(EntityDeltaList set, AccountTypeManager accountTypes) {
         for (EntityDelta state : set) {
-            final String accountType = state.getValues().getAsString(RawContacts.ACCOUNT_TYPE);
-            final AccountType type = accountTypes.getAccountType(accountType);
+            ValuesDelta values = state.getValues();
+            final String accountType = values.getAsString(RawContacts.ACCOUNT_TYPE);
+            final String dataSet = values.getAsString(RawContacts.DATA_SET);
+            final AccountType type = accountTypes.getAccountType(accountType, dataSet);
             trimEmpty(state, type);
         }
     }
@@ -390,8 +392,10 @@
         }
 
         for (EntityDelta state : set) {
-            final String accountType = state.getValues().getAsString(RawContacts.ACCOUNT_TYPE);
-            final AccountType type = accountTypes.getAccountType(accountType);
+            ValuesDelta values = state.getValues();
+            final String accountType = values.getAsString(RawContacts.ACCOUNT_TYPE);
+            final String dataSet = values.getAsString(RawContacts.DATA_SET);
+            final AccountType type = accountTypes.getAccountType(accountType, dataSet);
             if (hasChanges(state, type)) {
                 return true;
             }
@@ -678,8 +682,8 @@
 
             DataKind kind = accountType.getKindForMimetype(mimeType);
             if (kind == null) {
-                Log.e(TAG, "Mimetype not supported for account type " + accountType.accountType
-                        + ". Ignoring: " + values);
+                Log.e(TAG, "Mimetype not supported for account type "
+                        + accountType.getAccountTypeAndDataSet() + ". Ignoring: " + values);
                 continue;
             }
 
diff --git a/src/com/android/contacts/model/ExternalAccountType.java b/src/com/android/contacts/model/ExternalAccountType.java
index 4e6add0..caf311b 100644
--- a/src/com/android/contacts/model/ExternalAccountType.java
+++ b/src/com/android/contacts/model/ExternalAccountType.java
@@ -36,6 +36,7 @@
 import android.util.Xml;
 
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -55,12 +56,24 @@
     private static final String ATTR_CREATE_CONTACT_ACTIVITY = "createContactActivity";
     private static final String ATTR_INVITE_CONTACT_ACTIVITY = "inviteContactActivity";
     private static final String ATTR_INVITE_CONTACT_ACTION_LABEL = "inviteContactActionLabel";
+    private static final String ATTR_DATA_SET = "dataSet";
+    private static final String ATTR_EXTENSION_PACKAGE_NAMES = "extensionPackageNames";
+
+    // The following attributes should only be set in non-sync-adapter account types.  They allow
+    // for the account type and resource IDs to be specified without an associated authenticator.
+    private static final String ATTR_ACCOUNT_TYPE = "accountType";
+    private static final String ATTR_READ_ONLY = "readOnly";
+    private static final String ATTR_ACCOUNT_LABEL = "accountTypeLabel";
+    private static final String ATTR_ACCOUNT_ICON = "accountTypeIcon";
 
     private String mEditContactActivityClassName;
     private String mCreateContactActivityClassName;
     private String mInviteContactActivity;
     private String mInviteActionLabelAttribute;
+    private List<String> mExtensionPackageNames;
     private int mInviteActionLabelResId;
+    private String mAccountTypeLabelAttribute;
+    private String mAccountTypeIconAttribute;
 
     public ExternalAccountType(Context context, String resPackageName) {
         this.resPackageName = resPackageName;
@@ -81,8 +94,13 @@
             }
         }
 
+        mExtensionPackageNames = new ArrayList<String>();
         mInviteActionLabelResId = resolveExternalResId(context, mInviteActionLabelAttribute,
                 summaryResPackageName, ATTR_INVITE_CONTACT_ACTION_LABEL);
+        titleRes = resolveExternalResId(context, mAccountTypeLabelAttribute,
+                this.resPackageName, ATTR_ACCOUNT_LABEL);
+        iconRes = resolveExternalResId(context, mAccountTypeIconAttribute,
+                this.resPackageName, ATTR_ACCOUNT_ICON);
 
         // Bring in name and photo from fallback source, which are non-optional
         addDataKindStructuredName(context);
@@ -116,6 +134,11 @@
         return mInviteActionLabelResId;
     }
 
+    @Override
+    public List<String> getExtensionPackageNames() {
+        return mExtensionPackageNames;
+    }
+
     /**
      * Inflate this {@link AccountType} from the given parser. This may only
      * load details matching the publicly-defined schema.
@@ -156,6 +179,18 @@
                     mInviteContactActivity = value;
                 } else if (ATTR_INVITE_CONTACT_ACTION_LABEL.equals(attr)) {
                     mInviteActionLabelAttribute = value;
+                } else if (ATTR_DATA_SET.equals(attr)) {
+                    dataSet = value;
+                } else if (ATTR_EXTENSION_PACKAGE_NAMES.equals(attr)) {
+                    mExtensionPackageNames.add(value);
+                } else if (ATTR_ACCOUNT_TYPE.equals(attr)) {
+                    accountType = value;
+                } else if (ATTR_READ_ONLY.equals(attr)) {
+                    readOnly = !"0".equals(value) && !"false".equals(value);
+                } else if (ATTR_ACCOUNT_LABEL.equals(attr)) {
+                    mAccountTypeLabelAttribute = value;
+                } else if (ATTR_ACCOUNT_ICON.equals(attr)) {
+                    mAccountTypeIconAttribute = value;
                 } else {
                     Log.e(TAG, "Unsupported attribute " + attr);
                 }
diff --git a/src/com/android/contacts/model/FallbackAccountType.java b/src/com/android/contacts/model/FallbackAccountType.java
index 13540be..8bb3992 100644
--- a/src/com/android/contacts/model/FallbackAccountType.java
+++ b/src/com/android/contacts/model/FallbackAccountType.java
@@ -24,6 +24,7 @@
 
     public FallbackAccountType(Context context) {
         this.accountType = null;
+        this.dataSet = null;
         this.titleRes = R.string.account_phone;
         this.iconRes = R.mipmap.ic_launcher_contacts;
 
diff --git a/src/com/android/contacts/model/GoogleAccountType.java b/src/com/android/contacts/model/GoogleAccountType.java
index fd0eea4..c3dbd79 100644
--- a/src/com/android/contacts/model/GoogleAccountType.java
+++ b/src/com/android/contacts/model/GoogleAccountType.java
@@ -28,6 +28,8 @@
 import android.provider.ContactsContract.CommonDataKinds.Relation;
 import android.view.inputmethod.EditorInfo;
 
+import java.util.List;
+
 public class GoogleAccountType extends BaseAccountType {
     public static final String ACCOUNT_TYPE = "com.google";
     protected static final int FLAGS_RELATION = EditorInfo.TYPE_CLASS_TEXT
@@ -57,6 +59,12 @@
     }
 
     @Override
+    public List<String> getExtensionPackageNames() {
+        // TODO: Return the Google+ package name once it has the XML for an ExternalAccountType.
+        return super.getExtensionPackageNames();
+    }
+
+    @Override
     protected DataKind addDataKindPhone(Context context) {
         final DataKind kind = super.addDataKindPhone(context);
 
diff --git a/src/com/android/contacts/quickcontact/Action.java b/src/com/android/contacts/quickcontact/Action.java
index bdfbe48..f6e282c 100644
--- a/src/com/android/contacts/quickcontact/Action.java
+++ b/src/com/android/contacts/quickcontact/Action.java
@@ -27,20 +27,21 @@
  * string description and icon.
  */
 public interface Action extends Collapser.Collapsible<Action> {
-    public CharSequence getHeader();
     public CharSequence getBody();
+    public CharSequence getSubtitle();
 
     public String getMimeType();
-    public Drawable getFallbackIcon();
 
-    /**
-     * Build an {@link Intent} that will perform this action.
-     */
+    /** Returns an icon that can be clicked for the alternate action. */
+    public Drawable getAlternateIcon();
+
+    /** Build an {@link Intent} that will perform this action. */
     public Intent getIntent();
 
-    /**
-     * Checks if the contact data for this action is primary.
-     */
+    /** Build an {@link Intent} that will perform the alternate action. */
+    public Intent getAlternateIntent();
+
+    /** Checks if the contact data for this action is primary. */
     public Boolean isPrimary();
 
     /**
diff --git a/src/com/android/contacts/quickcontact/ClearDefaultsAction.java b/src/com/android/contacts/quickcontact/ClearDefaultsAction.java
deleted file mode 100644
index d1acc6b..0000000
--- a/src/com/android/contacts/quickcontact/ClearDefaultsAction.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.contacts.quickcontact;
-
-import android.content.Intent;
-import android.graphics.drawable.Drawable;
-import android.net.Uri;
-
-/**
- * Action that expands to show and allow clearing the currently selected defaults.
- */
-public class ClearDefaultsAction implements Action {
-    /**
-     * This is a pseudo-mimetype that is only needed for the action list. It has to be
-     * different from the real mime-types used
-     */
-    public static final String PSEUDO_MIME_TYPE = "__clear_defaults_mime_type";
-
-    @Override
-    public boolean collapseWith(Action t) {
-        return false;
-    }
-
-    @Override
-    public boolean shouldCollapseWith(Action t) {
-        return false;
-    }
-
-    @Override
-    public CharSequence getHeader() {
-        return null;
-    }
-
-    @Override
-    public CharSequence getBody() {
-        return null;
-    }
-
-    @Override
-    public String getMimeType() {
-        return PSEUDO_MIME_TYPE;
-    }
-
-    @Override
-    public Drawable getFallbackIcon() {
-        return null;
-    }
-
-    @Override
-    public Intent getIntent() {
-        return null;
-    }
-
-    @Override
-    public Boolean isPrimary() {
-        return null;
-    }
-
-    @Override
-    public Uri getDataUri() {
-        return null;
-    }
-
-    @Override
-    public long getDataId() {
-        return -1;
-    }
-}
diff --git a/src/com/android/contacts/quickcontact/DataAction.java b/src/com/android/contacts/quickcontact/DataAction.java
index 787d482..6f719af 100644
--- a/src/com/android/contacts/quickcontact/DataAction.java
+++ b/src/com/android/contacts/quickcontact/DataAction.java
@@ -3,6 +3,7 @@
 import com.android.contacts.ContactsUtils;
 import com.android.contacts.R;
 import com.android.contacts.model.DataKind;
+import com.android.contacts.model.AccountType.EditType;
 import com.android.contacts.util.Constants;
 import com.android.contacts.util.PhoneCapabilityTester;
 
@@ -34,11 +35,12 @@
     private final DataKind mKind;
     private final String mMimeType;
 
-    private CharSequence mHeader;
     private CharSequence mBody;
+    private CharSequence mSubtitle;
     private Intent mIntent;
+    private Intent mAlternateIntent;
+    private int mAlternateIconRes;
 
-    private boolean mAlternate;
     private Uri mDataUri;
     private long mDataId;
     private boolean mIsPrimary;
@@ -46,18 +48,33 @@
     /**
      * Create an action from common {@link Data} elements.
      */
-    public DataAction(Context context, String mimeType, DataKind kind,
-            long dataId, Cursor cursor) {
+    public DataAction(Context context, String mimeType, DataKind kind, long dataId, Cursor cursor) {
         mContext = context;
         mKind = kind;
         mMimeType = mimeType;
 
-        // Inflate strings from cursor
-        mAlternate = Constants.MIME_TYPE_SMS_ADDRESS.equals(mimeType);
-        if (mAlternate && mKind.actionAltHeader != null) {
-            mHeader = mKind.actionAltHeader.inflateUsing(context, cursor);
-        } else if (mKind.actionHeader != null) {
-            mHeader = mKind.actionHeader.inflateUsing(context, cursor);
+        // Determine type for subtitle
+        mSubtitle = "";
+        if (kind.typeColumn != null) {
+            final int typeColumnIndex = cursor.getColumnIndex(kind.typeColumn);
+            if (typeColumnIndex != -1) {
+                final int typeValue = cursor.getInt(typeColumnIndex);
+
+                // get type string
+                for (EditType type : kind.typeList) {
+                    if (type.rawValue == typeValue) {
+                        if (type.customColumn == null) {
+                            // Non-custom type. Get its description from the resource
+                            mSubtitle = context.getString(type.labelRes);
+                        } else {
+                            // Custom type. Read it from the database
+                            mSubtitle = cursor.getString(cursor.getColumnIndexOrThrow(
+                                    type.customColumn));
+                        }
+                        break;
+                    }
+                }
+            }
         }
 
         if (getAsInt(cursor, Data.IS_SUPER_PRIMARY) != 0) {
@@ -71,13 +88,30 @@
         mDataId = dataId;
         mDataUri = ContentUris.withAppendedId(Data.CONTENT_URI, dataId);
 
+        final boolean hasPhone = PhoneCapabilityTester.isPhone(mContext);
+        final boolean hasSms = PhoneCapabilityTester.isSmsIntentRegistered(mContext);
+
         // Handle well-known MIME-types with special care
         if (Phone.CONTENT_ITEM_TYPE.equals(mimeType)) {
             if (PhoneCapabilityTester.isPhone(mContext)) {
                 final String number = getAsString(cursor, Phone.NUMBER);
                 if (!TextUtils.isEmpty(number)) {
-                    final Uri callUri = Uri.fromParts(Constants.SCHEME_TEL, number, null);
-                    mIntent = new Intent(Intent.ACTION_CALL_PRIVILEGED, callUri);
+
+                    final Intent phoneIntent = hasPhone ? new Intent(Intent.ACTION_CALL_PRIVILEGED,
+                            Uri.fromParts(Constants.SCHEME_TEL, number, null)) : null;
+                    final Intent smsIntent = hasSms ? new Intent(Intent.ACTION_SENDTO,
+                            Uri.fromParts(Constants.SCHEME_SMSTO, number, null)) : null;
+
+                    // Configure Icons and Intents. Notice actionIcon is already set to the phone
+                    if (hasPhone && hasSms) {
+                        mIntent = phoneIntent;
+                        mAlternateIntent = smsIntent;
+                        mAlternateIconRes = kind.iconAltResDark;
+                    } else if (hasPhone) {
+                        mIntent = phoneIntent;
+                    } else if (hasSms) {
+                        mIntent = smsIntent;
+                    }
                 }
             }
         } else if (SipAddress.CONTENT_ITEM_TYPE.equals(mimeType)) {
@@ -94,14 +128,6 @@
                     // for the SIP-related intent-filters in its manifest.
                 }
             }
-        } else if (Constants.MIME_TYPE_SMS_ADDRESS.equals(mimeType)) {
-            if (PhoneCapabilityTester.isSmsIntentRegistered(mContext)) {
-                final String number = getAsString(cursor, Phone.NUMBER);
-                if (!TextUtils.isEmpty(number)) {
-                    final Uri smsUri = Uri.fromParts(Constants.SCHEME_SMSTO, number, null);
-                    mIntent = new Intent(Intent.ACTION_SENDTO, smsUri);
-                }
-            }
         } else if (Email.CONTENT_ITEM_TYPE.equals(mimeType)) {
             final String address = getAsString(cursor, Email.DATA);
             if (!TextUtils.isEmpty(address)) {
@@ -127,7 +153,7 @@
                 if (isEmail) {
                     // Use Google Talk string when using Email, and clear data
                     // Uri so we don't try saving Email as primary.
-                    mHeader = context.getText(R.string.chat_gtalk);
+                    mSubtitle = context.getText(R.string.chat_gtalk);
                     mDataUri = null;
                 }
 
@@ -189,66 +215,59 @@
         return true;
     }
 
-    /** {@inheritDoc} */
     @Override
-    public CharSequence getHeader() {
-        return mHeader;
+    public CharSequence getSubtitle() {
+        return mSubtitle;
     }
 
-    /** {@inheritDoc} */
     @Override
     public CharSequence getBody() {
         return mBody;
     }
 
-    /** {@inheritDoc} */
     @Override
     public String getMimeType() {
         return mMimeType;
     }
 
-    /** {@inheritDoc} */
     @Override
     public Uri getDataUri() {
         return mDataUri;
     }
 
-    /** {@inheritDoc} */
     @Override
     public long getDataId() {
         return mDataId;
     }
 
-    /** {@inheritDoc} */
     @Override
     public Boolean isPrimary() {
         return mIsPrimary;
     }
 
-    /** {@inheritDoc} */
     @Override
-    public Drawable getFallbackIcon() {
-        // Bail early if no valid resources
+    public Drawable getAlternateIcon() {
+        if (mAlternateIconRes == 0) return null;
+
         final String resPackageName = mKind.resPackageName;
-        if (resPackageName == null) return null;
+        if (resPackageName == null) {
+            return mContext.getResources().getDrawable(mAlternateIconRes);
+        }
 
         final PackageManager pm = mContext.getPackageManager();
-        if (mAlternate && mKind.iconAltRes != -1) {
-            return pm.getDrawable(resPackageName, mKind.iconAltRes, null);
-        } else if (mKind.iconRes != -1) {
-            return pm.getDrawable(resPackageName, mKind.iconRes, null);
-        } else {
-            return null;
-        }
+        return pm.getDrawable(resPackageName, mAlternateIconRes, null);
     }
 
-    /** {@inheritDoc} */
     @Override
     public Intent getIntent() {
         return mIntent;
     }
 
-    /** {@inheritDoc} */
+    @Override
+    public Intent getAlternateIntent() {
+        return mAlternateIntent;
+    }
+
     @Override
     public boolean collapseWith(Action other) {
         if (!shouldCollapseWith(other)) {
@@ -257,7 +276,6 @@
         return true;
     }
 
-    /** {@inheritDoc} */
     @Override
     public boolean shouldCollapseWith(Action t) {
         if (t == null) {
@@ -276,8 +294,7 @@
             return false;
         }
         if (!TextUtils.equals(mMimeType, other.mMimeType)
-                || !ContactsUtils.areIntentActionEqual(mIntent, other.mIntent)
-                ) {
+                || !ContactsUtils.areIntentActionEqual(mIntent, other.mIntent)) {
             return false;
         }
         return true;
diff --git a/src/com/android/contacts/quickcontact/FloatingChildLayout.java b/src/com/android/contacts/quickcontact/FloatingChildLayout.java
index ddba609..11d3176 100644
--- a/src/com/android/contacts/quickcontact/FloatingChildLayout.java
+++ b/src/com/android/contacts/quickcontact/FloatingChildLayout.java
@@ -18,15 +18,16 @@
 
 import com.android.contacts.R;
 
+import android.animation.Animator;
+import android.animation.Animator.AnimatorListener;
 import android.content.Context;
+import android.content.res.Resources;
 import android.graphics.Rect;
 import android.graphics.drawable.Drawable;
 import android.util.AttributeSet;
-import android.util.Log;
 import android.view.MotionEvent;
 import android.view.View;
-import android.view.animation.Animation;
-import android.view.animation.Animation.AnimationListener;
+import android.view.ViewPropertyAnimator;
 import android.view.animation.AnimationUtils;
 import android.widget.FrameLayout;
 import android.widget.PopupWindow;
@@ -46,22 +47,28 @@
  */
 public class FloatingChildLayout extends FrameLayout {
     private static final String TAG = "FloatingChild";
+    private int mFixedTopPosition;
+    private View mChild;
+    private Rect mTargetScreen = new Rect();
+    private final int mAnimationDuration;
 
     public FloatingChildLayout(Context context, AttributeSet attrs) {
         super(context, attrs);
+        final Resources resources = getResources();
+        mFixedTopPosition =
+                resources.getDimensionPixelOffset(R.dimen.quick_contact_top_position);
+        mAnimationDuration = resources.getInteger(android.R.integer.config_shortAnimTime);
     }
 
-    private View mChild;
-
-    private Rect mTargetScreen = new Rect();
-
-    private int mCalloutState = 0;
-    private int mCalloutLeft;
-
     @Override
     protected void onFinishInflate() {
         mChild = findViewById(android.R.id.content);
         mChild.setDuplicateParentStateEnabled(true);
+
+        // this will be expanded in showChild()
+        mChild.setScaleX(0.0f);
+        mChild.setScaleY(0.0f);
+        mChild.setAlpha(0.0f);
     }
 
     public View getChild() {
@@ -90,26 +97,6 @@
         return target;
     }
 
-    private void updateCallout(int calloutState, int calloutLeft) {
-        if (mCalloutState != calloutState) {
-            mCalloutState = calloutState;
-            mChild.refreshDrawableState();
-        }
-
-        final Drawable background = mChild.getBackground();
-        if (background != null && mCalloutLeft != calloutLeft) {
-            mCalloutLeft = calloutLeft;
-            background.setLevel(calloutLeft);
-        }
-    }
-
-    @Override
-    protected int[] onCreateDrawableState(int extraSpace) {
-        final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
-        mergeDrawableStates(drawableState, new int[] { mCalloutState });
-        return drawableState;
-    }
-
     @Override
     protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
 
@@ -119,38 +106,23 @@
         final int childWidth = child.getMeasuredWidth();
         final int childHeight = child.getMeasuredHeight();
 
-        // default is no callout, left-aligned, and vertically centered
-        int calloutState = 0;
-        int childLeft = target.left;
-        int childTop = target.centerY() - (childHeight / 2);
+        if (mFixedTopPosition != -1) {
+            // Horizontally centered, vertically fixed position
+            final int childLeft = (getWidth() - childWidth) / 2;
+            final int childTop = mFixedTopPosition;
+            layoutChild(child, childLeft, childTop);
+        } else {
+            // default is centered horizontally around target...
+            final int childLeft = target.centerX() - (childWidth / 2);
+            // ... and vertically aligned at the top
+            final int childTop = target.top;
 
-        // when target is wide, horizontally center instead of left-align
-        if (target.width() > childWidth / 2) {
-            childLeft = target.centerX() - (childWidth / 2);
+            // when child is outside bounds, nudge back inside
+            final int clampedChildLeft = clampDimension(childLeft, childWidth, getWidth());
+            final int clampedChildTop = clampDimension(childTop, childHeight, getHeight());
+
+            layoutChild(child, clampedChildLeft, clampedChildTop);
         }
-
-        final int areaAboveTarget = target.top;
-        final int areaBelowTarget = getHeight() - target.bottom;
-
-        if (areaAboveTarget >= childHeight) {
-            // enough room above target, place above and callout down
-            calloutState = android.R.attr.state_first;
-            childTop = target.top - childHeight;
-
-        } else if (areaBelowTarget >= childHeight) {
-            // enough room below target, place below and callout up
-            calloutState = android.R.attr.state_last;
-            childTop = target.bottom;
-        }
-
-        // when child is outside bounds, nudge back inside
-        childLeft = clampDimension(childLeft, childWidth, getWidth());
-        childTop = clampDimension(childTop, childHeight, getHeight());
-
-        final int calloutLeft = target.centerX() - childLeft;
-        updateCallout(calloutState, calloutLeft);
-        layoutChild(child, childLeft, childTop);
-
     }
 
     private static int clampDimension(int value, int size, int max) {
@@ -159,58 +131,55 @@
             return (max - size) / 2;
         }
 
-        // clamp to lower bound
-        value = Math.max(value, 0);
-        // clamp to higher bound
-        value = Math.min(value, max - size);
-
-        return value;
+        // clamp to bounds
+        return Math.min(Math.max(value, 0), max - size);
     }
 
     private static void layoutChild(View child, int left, int top) {
         child.layout(left, top, left + child.getMeasuredWidth(), top + child.getMeasuredHeight());
     }
 
-    /**
-     * Begin animating {@link #getChild()} visible.
-     */
-    public void showChild() {
-        final boolean calloutAbove = mCalloutState == android.R.attr.state_first;
-        final Animation anim = AnimationUtils.loadAnimation(getContext(),
-                calloutAbove ? R.anim.quickcontact_above_enter : R.anim.quickcontact_below_enter);
-        mChild.startAnimation(anim);
-        mChild.setVisibility(View.VISIBLE);
+    /** Begin animating {@link #getChild()} visible. */
+    public void showChild(Runnable onAnimationEndRunnable) {
+        animateScale(false, onAnimationEndRunnable);
     }
 
-    /**
-     * Begin animating {@link #getChild()} invisible.
-     */
-    public void hideChild(final Runnable onAnimationEnd) {
-        final boolean calloutAbove = mCalloutState == android.R.attr.state_first;
-        final Animation anim = AnimationUtils.loadAnimation(getContext(),
-                calloutAbove ? R.anim.quickcontact_above_exit : R.anim.quickcontact_below_exit);
+    /** Begin animating {@link #getChild()} invisible. */
+    public void hideChild(Runnable onAnimationEndRunnable) {
+        animateScale(true, onAnimationEndRunnable);
+    }
 
-        if (onAnimationEnd != null) {
-            anim.setAnimationListener(new AnimationListener() {
-                /** {@inheritDoc} */
-                public void onAnimationStart(Animation animation) {
-                    // ignored
-                }
+    /** Creates the open/close animation */
+    private void animateScale(boolean isExitAnimation, final Runnable onAnimationEndRunnable) {
+        mChild.setPivotX(mTargetScreen.centerX() - mChild.getLeft());
+        mChild.setPivotY(mTargetScreen.centerY() - mChild.getTop());
+        ViewPropertyAnimator animator = mChild.animate();
+        animator.setDuration(mAnimationDuration);
+        final int scaleInterpolator = isExitAnimation ? android.R.interpolator.accelerate_quint
+                : android.R.interpolator.decelerate_quint;
+        animator.setInterpolator(AnimationUtils.loadInterpolator(getContext(), scaleInterpolator));
+        final float scaleTarget = isExitAnimation ? 0.7f : 1.0f;
+        animator.scaleX(scaleTarget);
+        animator.scaleY(scaleTarget);
+        animator.alpha(isExitAnimation ? 0.0f : 1.0f);
 
-                /** {@inheritDoc} */
-                public void onAnimationRepeat(Animation animation) {
-                    // ignored
-                }
+        if (onAnimationEndRunnable != null) {
+            animator.setListener(new AnimatorListener() {
+                @Override
+                public void onAnimationStart(Animator animation) {}
 
-                /** {@inheritDoc} */
-                public void onAnimationEnd(Animation animation) {
-                    onAnimationEnd.run();
+                @Override
+                public void onAnimationRepeat(Animator animation) {}
+
+                @Override
+                public void onAnimationCancel(Animator animation) {}
+
+                @Override
+                public void onAnimationEnd(Animator animation) {
+                    onAnimationEndRunnable.run();
                 }
             });
         }
-
-        mChild.startAnimation(anim);
-        mChild.setVisibility(View.INVISIBLE);
     }
 
     private View.OnTouchListener mOutsideTouchListener;
@@ -224,8 +193,7 @@
         // at this point, touch wasn't handled by child view; assume outside
         if (mOutsideTouchListener != null) {
             return mOutsideTouchListener.onTouch(this, event);
-        } else {
-            return false;
         }
+        return false;
     }
 }
diff --git a/src/com/android/contacts/quickcontact/ProfileAction.java b/src/com/android/contacts/quickcontact/ProfileAction.java
deleted file mode 100644
index a04e522..0000000
--- a/src/com/android/contacts/quickcontact/ProfileAction.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.contacts.quickcontact;
-
-import com.android.contacts.R;
-
-import android.content.Context;
-import android.content.Intent;
-import android.graphics.drawable.Drawable;
-import android.net.Uri;
-import android.provider.ContactsContract.Contacts;
-
-/**
- * Specific action that launches the profile card.
- */
-public class ProfileAction implements Action {
-    private final Context mContext;
-    private final Uri mLookupUri;
-
-    public ProfileAction(Context context, Uri lookupUri) {
-        mContext = context;
-        mLookupUri = lookupUri;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public CharSequence getHeader() {
-        return null;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public CharSequence getBody() {
-        return null;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public String getMimeType() {
-        return Contacts.CONTENT_ITEM_TYPE;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public Drawable getFallbackIcon() {
-        return mContext.getResources().getDrawable(R.drawable.ic_contacts_details);
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public Intent getIntent() {
-        final Intent intent = new Intent(Intent.ACTION_VIEW, mLookupUri);
-        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
-        return intent;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public Boolean isPrimary() {
-        return null;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public Uri getDataUri() {
-        return null;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public long getDataId() {
-        return -1;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public boolean collapseWith(Action t) {
-        return false; // Never dup.
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public boolean shouldCollapseWith(Action t) {
-        return false; // Never dup.
-    }
-}
diff --git a/src/com/android/contacts/quickcontact/QuickContactActivity.java b/src/com/android/contacts/quickcontact/QuickContactActivity.java
new file mode 100644
index 0000000..47e7173
--- /dev/null
+++ b/src/com/android/contacts/quickcontact/QuickContactActivity.java
@@ -0,0 +1,725 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.contacts.quickcontact;
+
+import com.android.contacts.Collapser;
+import com.android.contacts.ContactPresenceIconUtil;
+import com.android.contacts.R;
+import com.android.contacts.model.AccountTypeManager;
+import com.android.contacts.model.DataKind;
+import com.android.contacts.util.Constants;
+import com.android.contacts.util.ContactBadgeUtil;
+import com.android.contacts.util.DataStatus;
+import com.android.contacts.util.NotifyingAsyncQueryHandler;
+import com.android.contacts.util.NotifyingAsyncQueryHandler.AsyncQueryListener;
+import com.google.common.base.Preconditions;
+import com.google.common.collect.Lists;
+
+import android.app.Activity;
+import android.app.Fragment;
+import android.app.FragmentManager;
+import android.content.ActivityNotFoundException;
+import android.content.ContentUris;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.res.AssetFileDescriptor;
+import android.database.Cursor;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.net.Uri;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.os.Handler;
+import android.provider.ContactsContract.CommonDataKinds.Email;
+import android.provider.ContactsContract.CommonDataKinds.Im;
+import android.provider.ContactsContract.CommonDataKinds.Phone;
+import android.provider.ContactsContract.CommonDataKinds.Photo;
+import android.provider.ContactsContract.CommonDataKinds.SipAddress;
+import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
+import android.provider.ContactsContract.CommonDataKinds.Website;
+import android.provider.ContactsContract.Contacts;
+import android.provider.ContactsContract.Data;
+import android.provider.ContactsContract.DisplayPhoto;
+import android.provider.ContactsContract.QuickContact;
+import android.provider.ContactsContract.RawContacts;
+import android.support.v13.app.FragmentPagerAdapter;
+import android.support.v4.view.ViewPager;
+import android.support.v4.view.ViewPager.SimpleOnPageChangeListener;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.ViewGroup;
+import android.widget.HorizontalScrollView;
+import android.widget.ImageButton;
+import android.widget.ImageView;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+// TODO: Save selected tab index during rotation
+// TODO: Handle GTalk Audio/Videochat secondary actions
+// TODO: Don't do a query in QuickContactBadge
+// TODO: Fix bug when QuickContact is dismissed using HOME or task switching
+//        (it will relaunch with the previous contact)
+
+// Missing assets and specs:
+//   Pushed states for list items
+
+/**
+ * Mostly translucent {@link Activity} that shows QuickContact dialog. It loads
+ * data asynchronously, and then shows a popup with details centered around
+ * {@link Intent#getSourceBounds()}.
+ */
+public class QuickContactActivity extends Activity {
+    private static final String TAG = "QuickContact";
+
+    private static final boolean TRACE_LAUNCH = false;
+    private static final String TRACE_TAG = "quickcontact";
+
+    @SuppressWarnings("deprecation")
+    private static final String LEGACY_AUTHORITY = android.provider.Contacts.AUTHORITY;
+
+    private NotifyingAsyncQueryHandler mHandler;
+
+    private Uri mLookupUri;
+    private String[] mExcludeMimes;
+    private List<String> mSortedActionMimeTypes = Lists.newArrayList();
+
+    private boolean mHasFinishedAnimatingIn = false;
+    private boolean mHasStartedAnimatingOut = false;
+
+    private FloatingChildLayout mFloatingLayout;
+
+    private View mPhotoContainer;
+    private ViewGroup mTrack;
+    private HorizontalScrollView mTrackScroller;
+    private View mSelectedTabRectangle;
+    /** Line before the track. Depending on the layout, this can be null */
+    private View mLineBeforeTrack;
+
+    private ImageButton mOpenDetailsButton;
+    private ImageButton mOpenDetailsPushLayerButton;
+    private ViewPager mListPager;
+
+    /**
+     * Keeps the default action per mimetype. Empty if no default actions are set
+     */
+    private HashMap<String, Action> mDefaultsMap = new HashMap<String, Action>();
+
+    /**
+     * Set of {@link Action} that are associated with the aggregate currently
+     * displayed by this dialog, represented as a map from {@link String}
+     * MIME-type to a list of {@link Action}.
+     */
+    private ActionMultiMap mActions = new ActionMultiMap();
+
+    /**
+     * {@link #LEADING_MIMETYPES} and {@link #TRAILING_MIMETYPES} are used to sort MIME-types.
+     *
+     * <p>The MIME-types in {@link #LEADING_MIMETYPES} appear in the front of the dialog,
+     * in the order specified here.</p>
+     *
+     * <p>The ones in {@link #TRAILING_MIMETYPES} appear in the end of the dialog, in the order
+     * specified here.</p>
+     *
+     * <p>The rest go between them, in the order in the array.</p>
+     */
+    private static final List<String> LEADING_MIMETYPES = Lists.newArrayList(
+            Phone.CONTENT_ITEM_TYPE, SipAddress.CONTENT_ITEM_TYPE, Email.CONTENT_ITEM_TYPE);
+
+    /** See {@link #LEADING_MIMETYPES}. */
+    private static final List<String> TRAILING_MIMETYPES = Lists.newArrayList(
+            StructuredPostal.CONTENT_ITEM_TYPE, Website.CONTENT_ITEM_TYPE);
+
+    /** Id for the background handler that loads the data */
+    private static final int HANDLER_ID_DATA = 1;
+
+    @Override
+    protected void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+
+        setContentView(R.layout.quickcontact_activity);
+
+        mFloatingLayout = (FloatingChildLayout) findViewById(R.id.floating_layout);
+        mTrack = (ViewGroup) findViewById(R.id.track);
+        mTrackScroller = (HorizontalScrollView) findViewById(R.id.track_scroller);
+        mOpenDetailsButton = (ImageButton) findViewById(R.id.open_details_button);
+        mOpenDetailsPushLayerButton = (ImageButton) findViewById(R.id.open_details_push_layer);
+        mListPager = (ViewPager) findViewById(R.id.item_list_pager);
+        mSelectedTabRectangle = findViewById(R.id.selected_tab_rectangle);
+        mLineBeforeTrack = findViewById(R.id.line_before_track);
+
+        mFloatingLayout.setOnOutsideTouchListener(new View.OnTouchListener() {
+            @Override
+            public boolean onTouch(View v, MotionEvent event) {
+                return handleOutsideTouch();
+            }
+        });
+
+        final OnClickListener openDetailsClickHandler = new OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                final Intent intent = new Intent(Intent.ACTION_VIEW, mLookupUri);
+                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
+                startActivity(intent);
+                hide(false);
+            }
+        };
+        mOpenDetailsButton.setOnClickListener(openDetailsClickHandler);
+        mOpenDetailsPushLayerButton.setOnClickListener(openDetailsClickHandler);
+        mListPager.setAdapter(new ViewPagerAdapter(getFragmentManager()));
+        mListPager.setOnPageChangeListener(new PageChangeListener());
+
+        mHandler = new NotifyingAsyncQueryHandler(this, mQueryListener);
+
+        show();
+    }
+
+    private void show() {
+
+        if (TRACE_LAUNCH) {
+            android.os.Debug.startMethodTracing(TRACE_TAG);
+        }
+
+        final Intent intent = getIntent();
+
+        Uri lookupUri = intent.getData();
+
+        // Check to see whether it comes from the old version.
+        if (LEGACY_AUTHORITY.equals(lookupUri.getAuthority())) {
+            final long rawContactId = ContentUris.parseId(lookupUri);
+            lookupUri = RawContacts.getContactLookupUri(getContentResolver(),
+                    ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId));
+        }
+
+        mLookupUri = Preconditions.checkNotNull(lookupUri, "missing lookupUri");
+
+        // Read requested parameters for displaying
+        final Rect targetScreen = intent.getSourceBounds();
+        Preconditions.checkNotNull(targetScreen, "missing targetScreen");
+        mFloatingLayout.setChildTargetScreen(targetScreen);
+
+        mExcludeMimes = intent.getStringArrayExtra(QuickContact.EXTRA_EXCLUDE_MIMES);
+
+        // find and prepare correct header view
+        mPhotoContainer = findViewById(R.id.photo_container);
+        setHeaderText(R.id.name, R.string.quickcontact_missing_name);
+        setHeaderText(R.id.status, null);
+        setHeaderText(R.id.timestamp, null);
+        setHeaderImage(R.id.presence, null);
+
+        // Start background query for data, but only select photo rows when they
+        // directly match the super-primary PHOTO_ID.
+        final Uri dataUri = Uri.withAppendedPath(lookupUri, Contacts.Data.CONTENT_DIRECTORY);
+        mHandler.cancelOperation(HANDLER_ID_DATA);
+
+        // Select all data items of the contact (except for photos, where we only select the display
+        // photo)
+        mHandler.startQuery(HANDLER_ID_DATA, lookupUri, dataUri, DataQuery.PROJECTION, Data.MIMETYPE
+                + "!=? OR (" + Data.MIMETYPE + "=? AND " + Data._ID + "=" + Contacts.PHOTO_ID
+                + ")", new String[] { Photo.CONTENT_ITEM_TYPE, Photo.CONTENT_ITEM_TYPE }, null);
+    }
+
+    private boolean handleOutsideTouch() {
+        if (!mHasFinishedAnimatingIn) return false;
+        if (mHasStartedAnimatingOut) return false;
+
+        mHasStartedAnimatingOut = true;
+        hide(true);
+        return true;
+    }
+
+    private void hide(boolean withAnimation) {
+        // cancel any pending queries
+        mHandler.cancelOperation(HANDLER_ID_DATA);
+
+        if (withAnimation) {
+            mFloatingLayout.hideChild(new Runnable() {
+                @Override
+                public void run() {
+                    finish();
+                }
+            });
+        } else {
+            mFloatingLayout.hideChild(null);
+            finish();
+        }
+    }
+
+    @Override
+    public void onBackPressed() {
+        hide(true);
+    }
+
+    private final AsyncQueryListener mQueryListener = new AsyncQueryListener() {
+        @Override
+        public synchronized void onQueryComplete(int token, Object cookie, Cursor cursor) {
+            try {
+                if (isFinishing()) {
+                    hide(false);
+                    return;
+                } else if (cursor == null || cursor.getCount() == 0) {
+                    Toast.makeText(QuickContactActivity.this, R.string.invalidContactMessage,
+                            Toast.LENGTH_LONG).show();
+                    hide(false);
+                    return;
+                }
+
+                bindData(cursor);
+
+                if (TRACE_LAUNCH) {
+                    android.os.Debug.stopMethodTracing();
+                }
+
+                // Data bound and ready, pull curtain to show. Put this on the Handler to ensure
+                // that the layout passes are completed
+                mHandler.post(new Runnable() {
+                    @Override
+                    public void run() {
+                        mFloatingLayout.showChild(new Runnable() {
+                            @Override
+                            public void run() {
+                                mHasFinishedAnimatingIn = true;
+                            }
+                        });
+                    }
+                });
+            } finally {
+                if (cursor != null) {
+                    cursor.close();
+                }
+            }
+        }
+    };
+
+    /** Assign this string to the view, if found in {@link #mPhotoContainer}. */
+    private void setHeaderText(int id, int resId) {
+        setHeaderText(id, getText(resId));
+    }
+
+    /** Assign this string to the view, if found in {@link #mPhotoContainer}. */
+    private void setHeaderText(int id, CharSequence value) {
+        final View view = mPhotoContainer.findViewById(id);
+        if (view instanceof TextView) {
+            ((TextView)view).setText(value);
+            view.setVisibility(TextUtils.isEmpty(value) ? View.GONE : View.VISIBLE);
+        }
+    }
+
+    /** Assign this image to the view, if found in {@link #mPhotoContainer}. */
+    private void setHeaderImage(int id, Drawable drawable) {
+        final View view = mPhotoContainer.findViewById(id);
+        if (view instanceof ImageView) {
+            ((ImageView)view).setImageDrawable(drawable);
+            view.setVisibility(drawable == null ? View.GONE : View.VISIBLE);
+        }
+    }
+
+    /**
+     * Check if the given MIME-type appears in the list of excluded MIME-types
+     * that the most-recent caller requested.
+     */
+    private boolean isMimeExcluded(String mimeType) {
+        if (mExcludeMimes == null) return false;
+        for (String excludedMime : mExcludeMimes) {
+            if (TextUtils.equals(excludedMime, mimeType)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Handle the result from the {@link #TOKEN_DATA} query.
+     */
+    private void bindData(Cursor cursor) {
+        final ResolveCache cache = ResolveCache.getInstance(this);
+        final Context context = this;
+
+        mOpenDetailsButton.setVisibility(isMimeExcluded(Contacts.CONTENT_ITEM_TYPE) ? View.GONE
+                : View.VISIBLE);
+
+        mDefaultsMap.clear();
+
+        final DataStatus status = new DataStatus();
+        final AccountTypeManager accountTypes = AccountTypeManager.getInstance(
+                context.getApplicationContext());
+        final ImageView photoView = (ImageView) mPhotoContainer.findViewById(R.id.photo);
+
+        Bitmap photoBitmap = null;
+        while (cursor.moveToNext()) {
+            // Handle any social status updates from this row
+            status.possibleUpdate(cursor);
+
+            final String mimeType = cursor.getString(DataQuery.MIMETYPE);
+
+            // Skip this data item if MIME-type excluded
+            if (isMimeExcluded(mimeType)) continue;
+
+            final long dataId = cursor.getLong(DataQuery._ID);
+            final String accountType = cursor.getString(DataQuery.ACCOUNT_TYPE);
+            final String dataSet = cursor.getString(DataQuery.DATA_SET);
+            final boolean isPrimary = cursor.getInt(DataQuery.IS_PRIMARY) != 0;
+            final boolean isSuperPrimary = cursor.getInt(DataQuery.IS_SUPER_PRIMARY) != 0;
+
+            // Handle photos included as data row
+            if (Photo.CONTENT_ITEM_TYPE.equals(mimeType)) {
+                final int displayPhotoColumnIndex = cursor.getColumnIndex(Photo.PHOTO_FILE_ID);
+                final boolean hasDisplayPhoto = !cursor.isNull(displayPhotoColumnIndex);
+                if (hasDisplayPhoto) {
+                    final long displayPhotoId = cursor.getLong(displayPhotoColumnIndex);
+                    final Uri displayPhotoUri = ContentUris.withAppendedId(
+                            DisplayPhoto.CONTENT_URI, displayPhotoId);
+                    // Fetch and JPEG uncompress on the background thread
+                    new AsyncTask<Void, Void, Bitmap>() {
+                        @Override
+                        protected Bitmap doInBackground(Void... params) {
+                            try {
+                                AssetFileDescriptor fd = getContentResolver()
+                                        .openAssetFileDescriptor(displayPhotoUri, "r");
+                                return BitmapFactory.decodeStream(fd.createInputStream());
+                            } catch (IOException e) {
+                                Log.e(TAG, "Error getting display photo. Ignoring, as we already " +
+                                        "have the thumbnail", e);
+                                return null;
+                            }
+                        }
+
+                        @Override
+                        protected void onPostExecute(Bitmap result) {
+                            if (result == null) return;
+                            photoView.setImageBitmap(result);
+                        }
+                    }.execute();
+                }
+                final int photoColumnIndex = cursor.getColumnIndex(Photo.PHOTO);
+                final byte[] photoBlob = cursor.getBlob(photoColumnIndex);
+                if (photoBlob != null) {
+                    photoBitmap = BitmapFactory.decodeByteArray(photoBlob, 0, photoBlob.length);
+                }
+                continue;
+            }
+
+            final DataKind kind = accountTypes.getKindOrFallback(accountType, dataSet, mimeType);
+
+            if (kind != null) {
+                // Build an action for this data entry, find a mapping to a UI
+                // element, build its summary from the cursor, and collect it
+                // along with all others of this MIME-type.
+                final Action action = new DataAction(context, mimeType, kind, dataId, cursor);
+                final boolean wasAdded = considerAdd(action, cache);
+                if (wasAdded) {
+                    // Remember the default
+                    if (isSuperPrimary || (isPrimary && (mDefaultsMap.get(mimeType) == null))) {
+                        mDefaultsMap.put(mimeType, action);
+                    }
+                }
+            }
+
+            boolean isIm = Im.CONTENT_ITEM_TYPE.equals(mimeType);
+
+            // Handle Email rows with presence data as Im entry
+            final boolean hasPresence = !cursor.isNull(DataQuery.PRESENCE);
+            if (hasPresence && Email.CONTENT_ITEM_TYPE.equals(mimeType)) {
+                final DataKind imKind = accountTypes.getKindOrFallback(accountType, dataSet,
+                        Im.CONTENT_ITEM_TYPE);
+                if (imKind != null) {
+                    final DataAction action = new DataAction(context, Im.CONTENT_ITEM_TYPE, imKind,
+                            dataId, cursor);
+                    considerAdd(action, cache);
+                    isIm = true;
+                }
+            }
+
+            if (hasPresence && isIm) {
+                int chatCapability = cursor.getInt(DataQuery.CHAT_CAPABILITY);
+                if ((chatCapability & Im.CAPABILITY_HAS_CAMERA) != 0) {
+                    final DataKind imKind = accountTypes.getKindOrFallback(accountType, dataSet,
+                            Im.CONTENT_ITEM_TYPE);
+                    if (imKind != null) {
+                        final DataAction chatAction = new DataAction(context,
+                                Constants.MIME_TYPE_VIDEO_CHAT, imKind, dataId, cursor);
+                        considerAdd(chatAction, cache);
+                    }
+                }
+            }
+        }
+
+        // Collapse Action Lists (remove e.g. duplicate e-mail addresses from different sources)
+        for (List<Action> actionChildren : mActions.values()) {
+            Collapser.collapseList(actionChildren);
+        }
+
+        if (cursor.moveToLast()) {
+            // Read contact information from last data row
+            final String name = cursor.getString(DataQuery.DISPLAY_NAME);
+            final int presence = cursor.getInt(DataQuery.CONTACT_PRESENCE);
+            final int chatCapability = cursor.getInt(DataQuery.CONTACT_CHAT_CAPABILITY);
+            final Drawable statusIcon = ContactPresenceIconUtil.getChatCapabilityIcon(
+                    context, presence, chatCapability);
+
+            setHeaderText(R.id.name, name);
+            // TODO: Bring this back once we have a design
+//            setHeaderImage(R.id.presence, statusIcon);
+        }
+
+        if (photoView != null) {
+            // Place photo when discovered in data, otherwise show generic avatar
+            photoView.setImageBitmap(photoBitmap != null ? photoBitmap
+                    : ContactBadgeUtil.loadPlaceholderPhoto(context));
+        }
+
+        // TODO: Bring this back once we have a design
+//        if (status.isValid()) {
+//            // Update status when valid was found
+//            setHeaderText(R.id.status, status.getStatus());
+//            setHeaderText(R.id.timestamp, status.getTimestampLabel(context));
+//        }
+
+        // All the mime-types to add.
+        final Set<String> containedTypes = new HashSet<String>(mActions.keySet());
+        mSortedActionMimeTypes.clear();
+        // First, add LEADING_MIMETYPES, which are most common.
+        for (String mimeType : LEADING_MIMETYPES) {
+            if (containedTypes.contains(mimeType)) {
+                mSortedActionMimeTypes.add(mimeType);
+                containedTypes.remove(mimeType);
+            }
+        }
+
+        // Add all the remaining ones that are not TRAILING
+        for (String mimeType : containedTypes.toArray(new String[containedTypes.size()])) {
+            if (!TRAILING_MIMETYPES.contains(mimeType)) {
+                mSortedActionMimeTypes.add(mimeType);
+                containedTypes.remove(mimeType);
+            }
+        }
+
+        // Then, add TRAILING_MIMETYPES, which are least common.
+        for (String mimeType : TRAILING_MIMETYPES) {
+            if (containedTypes.contains(mimeType)) {
+                containedTypes.remove(mimeType);
+                mSortedActionMimeTypes.add(mimeType);
+            }
+        }
+
+        // Add buttons for each mimetype
+        for (String mimeType : mSortedActionMimeTypes) {
+            final View actionView = inflateAction(mimeType, cache, mTrack);
+            mTrack.addView(actionView);
+        }
+
+        final boolean hasData = !mSortedActionMimeTypes.isEmpty();
+        if (mLineBeforeTrack != null) {
+            mLineBeforeTrack.setVisibility(hasData ? View.VISIBLE : View.GONE);
+        }
+        mTrackScroller.setVisibility(hasData ? View.VISIBLE : View.GONE);
+        mSelectedTabRectangle.setVisibility(hasData ? View.VISIBLE : View.GONE);
+        mListPager.setVisibility(hasData ? View.VISIBLE : View.GONE);
+    }
+
+    /**
+     * Consider adding the given {@link Action}, which will only happen if
+     * {@link PackageManager} finds an application to handle
+     * {@link Action#getIntent()}.
+     * @return true if action has been added
+     */
+    private boolean considerAdd(Action action, ResolveCache resolveCache) {
+        if (resolveCache.hasResolve(action)) {
+            mActions.put(action.getMimeType(), action);
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Inflate the in-track view for the action of the given MIME-type, collapsing duplicate values.
+     * Will use the icon provided by the {@link DataKind}.
+     */
+    private View inflateAction(String mimeType, ResolveCache resolveCache, ViewGroup root) {
+        final CheckableImageView typeView = (CheckableImageView) getLayoutInflater().inflate(
+                R.layout.quickcontact_track_button, root, false);
+
+        List<Action> children = mActions.get(mimeType);
+        typeView.setTag(mimeType);
+        final Action firstInfo = children.get(0);
+
+        // Set icon and listen for clicks
+        final CharSequence descrip = resolveCache.getDescription(firstInfo);
+        final Drawable icon = resolveCache.getIcon(firstInfo);
+        typeView.setChecked(false);
+        typeView.setContentDescription(descrip);
+        typeView.setImageDrawable(icon);
+        typeView.setOnClickListener(mTypeViewClickListener);
+
+        return typeView;
+    }
+
+    private CheckableImageView getActionViewAt(int position) {
+        return (CheckableImageView) mTrack.getChildAt(position);
+    }
+
+    @Override
+    public void onAttachFragment(Fragment fragment) {
+        final QuickContactListFragment listFragment = (QuickContactListFragment) fragment;
+        listFragment.setListener(mListFragmentListener);
+    }
+
+    /** A type (e.g. Call/Addresses was clicked) */
+    private final OnClickListener mTypeViewClickListener = new OnClickListener() {
+        @Override
+        public void onClick(View view) {
+            final CheckableImageView actionView = (CheckableImageView)view;
+            final String mimeType = (String) actionView.getTag();
+            int index = mSortedActionMimeTypes.indexOf(mimeType);
+            mListPager.setCurrentItem(index, true);
+        }
+    };
+
+    private class ViewPagerAdapter extends FragmentPagerAdapter {
+        public ViewPagerAdapter(FragmentManager fragmentManager) {
+            super(fragmentManager);
+        }
+
+        @Override
+        public Fragment getItem(int position) {
+            QuickContactListFragment fragment = new QuickContactListFragment();
+            final String mimeType = mSortedActionMimeTypes.get(position);
+            final List<Action> actions = mActions.get(mimeType);
+            fragment.setActions(actions);
+            return fragment;
+        }
+
+        @Override
+        public int getCount() {
+            return mSortedActionMimeTypes.size();
+        }
+    }
+
+    private class PageChangeListener extends SimpleOnPageChangeListener {
+        @Override
+        public void onPageSelected(int position) {
+            final CheckableImageView actionView = getActionViewAt(position);
+            mTrackScroller.requestChildRectangleOnScreen(actionView,
+                    new Rect(0, 0, actionView.getWidth(), actionView.getHeight()), false);
+        }
+
+        @Override
+        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
+            final RelativeLayout.LayoutParams layoutParams =
+                    (RelativeLayout.LayoutParams) mSelectedTabRectangle.getLayoutParams();
+            final int width = mSelectedTabRectangle.getWidth();
+            layoutParams.leftMargin = (int) ((position + positionOffset) * width);
+            mSelectedTabRectangle.setLayoutParams(layoutParams);
+        }
+    }
+
+    private final QuickContactListFragment.Listener mListFragmentListener =
+            new QuickContactListFragment.Listener() {
+        @Override
+        public void onOutsideClick() {
+            // If there is no background, we want to dismiss, because to the user it seems
+            // like he had touched outside. If the ViewPager is solid however, those taps
+            // must be ignored
+            final boolean isTransparent = mListPager.getBackground() == null;
+            if (isTransparent) handleOutsideTouch();
+        }
+
+        @Override
+        public void onItemClicked(final Action action, final boolean alternate) {
+            final Runnable startAppRunnable = new Runnable() {
+                @Override
+                public void run() {
+                    try {
+                        startActivity(alternate ? action.getAlternateIntent() : action.getIntent());
+                    } catch (ActivityNotFoundException e) {
+                        Toast.makeText(QuickContactActivity.this, R.string.quickcontact_missing_app,
+                                Toast.LENGTH_SHORT).show();
+                    }
+
+                    hide(false);
+                }
+            };
+            // Defer the action to make the window properly repaint
+            new Handler().post(startAppRunnable);
+        }
+    };
+
+    private interface DataQuery {
+        final String[] PROJECTION = new String[] {
+                Data._ID,
+
+                RawContacts.ACCOUNT_TYPE,
+                RawContacts.DATA_SET,
+                Contacts.STARRED,
+                Contacts.DISPLAY_NAME,
+                Contacts.CONTACT_PRESENCE,
+                Contacts.CONTACT_CHAT_CAPABILITY,
+
+                Data.STATUS,
+                Data.STATUS_RES_PACKAGE,
+                Data.STATUS_ICON,
+                Data.STATUS_LABEL,
+                Data.STATUS_TIMESTAMP,
+                Data.PRESENCE,
+                Data.CHAT_CAPABILITY,
+
+                Data.RES_PACKAGE,
+                Data.MIMETYPE,
+                Data.IS_PRIMARY,
+                Data.IS_SUPER_PRIMARY,
+                Data.RAW_CONTACT_ID,
+
+                Data.DATA1, Data.DATA2, Data.DATA3, Data.DATA4, Data.DATA5,
+                Data.DATA6, Data.DATA7, Data.DATA8, Data.DATA9, Data.DATA10, Data.DATA11,
+                Data.DATA12, Data.DATA13, Data.DATA14, Data.DATA15,
+        };
+
+        final int _ID = 0;
+
+        final int ACCOUNT_TYPE = 1;
+        final int DATA_SET = 2;
+        final int STARRED = 3;
+        final int DISPLAY_NAME = 4;
+        final int CONTACT_PRESENCE = 5;
+        final int CONTACT_CHAT_CAPABILITY = 6;
+
+        final int STATUS = 7;
+        final int STATUS_RES_PACKAGE = 8;
+        final int STATUS_ICON = 9;
+        final int STATUS_LABEL = 10;
+        final int STATUS_TIMESTAMP = 11;
+        final int PRESENCE = 12;
+        final int CHAT_CAPABILITY = 13;
+
+        final int RES_PACKAGE = 14;
+        final int MIMETYPE = 15;
+        final int IS_PRIMARY = 16;
+        final int IS_SUPER_PRIMARY = 17;
+    }
+}
diff --git a/src/com/android/contacts/quickcontact/QuickContactBackgroundDrawable.java b/src/com/android/contacts/quickcontact/QuickContactBackgroundDrawable.java
deleted file mode 100644
index 15311f9..0000000
--- a/src/com/android/contacts/quickcontact/QuickContactBackgroundDrawable.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.contacts.quickcontact;
-
-import com.android.contacts.R;
-
-import android.content.res.Resources;
-import android.graphics.Canvas;
-import android.graphics.ColorFilter;
-import android.graphics.PixelFormat;
-import android.graphics.Rect;
-import android.graphics.drawable.Drawable;
-
-/**
- * Background {@link Drawable} for {@link QuickContactWindow} that draws arrow
- * centered around requested position.
- */
-public class QuickContactBackgroundDrawable extends Drawable {
-    private Drawable mLeftDrawable;
-    private Drawable mMiddleDrawable;
-    private Drawable mRightDrawable;
-
-    private int mBottomOverride = Integer.MIN_VALUE;
-
-    public QuickContactBackgroundDrawable(Resources res) {
-        mLeftDrawable = res.getDrawable(R.drawable.quickactions_arrow_left_holo_light);
-        mMiddleDrawable = res.getDrawable(R.drawable.quickactions_arrow_middle_holo_light);
-        mRightDrawable = res.getDrawable(R.drawable.quickactions_arrow_right_holo_light);
-    }
-
-    @Override
-    public void setAlpha(int alpha) {
-        mLeftDrawable.setAlpha(alpha);
-        mMiddleDrawable.setAlpha(alpha);
-        mRightDrawable.setAlpha(alpha);
-    }
-
-    /**
-     * Overrides the bottom bounds. This is used for the animation when the
-     * QuickContact expands/collapses options
-     */
-    public void setBottomOverride(int value) {
-        mBottomOverride = value;
-        onBoundsChange(getBounds());
-        invalidateSelf();
-    }
-
-    public void clearBottomOverride() {
-        mBottomOverride = Integer.MIN_VALUE;
-        onBoundsChange(getBounds());
-        invalidateSelf();
-    }
-
-    public float getBottomOverride() {
-        return mBottomOverride;
-    }
-
-    @Override
-    public boolean isStateful() {
-        return true;
-    }
-
-    @Override
-    protected boolean onStateChange(int[] state) {
-        super.onStateChange(state);
-        mLeftDrawable.setState(state);
-        mMiddleDrawable.setState(state);
-        mRightDrawable.setState(state);
-        return true;
-    }
-
-    @Override
-    protected boolean onLevelChange(int level) {
-        return true;
-    }
-
-    @Override
-    public void setColorFilter(ColorFilter cf) {
-        mLeftDrawable.setColorFilter(cf);
-        mMiddleDrawable.setColorFilter(cf);
-        mRightDrawable.setColorFilter(cf);
-    }
-
-    @Override
-    public int getOpacity() {
-        return PixelFormat.TRANSLUCENT;
-    }
-
-    @Override
-    protected void onBoundsChange(Rect bounds) {
-        final int requestedX = getLevel();
-
-        int middleLeft = requestedX - mMiddleDrawable.getIntrinsicWidth() / 2;
-        int middleRight = requestedX + mMiddleDrawable.getIntrinsicWidth() / 2;
-
-        // ensure left drawable is not smaller than its Intrinsic Width
-        final int leftExtra = (middleLeft - bounds.left) - mLeftDrawable.getIntrinsicWidth();
-        if (leftExtra < 0) {
-            middleLeft -= leftExtra;
-            middleRight -= leftExtra;
-        }
-
-        // ensure right drawable is not smaller than its Intrinsic Width
-        final int rightExtra = (bounds.right - middleRight) - mRightDrawable.getIntrinsicWidth();
-        if (rightExtra < 0) {
-            middleLeft += rightExtra;
-            middleRight += rightExtra;
-        }
-
-        final int bottom = mBottomOverride == Integer.MIN_VALUE ? bounds.bottom : mBottomOverride;
-        mLeftDrawable.setBounds(bounds.left, bounds.top, middleLeft, bottom);
-        mMiddleDrawable.setBounds(middleLeft, bounds.top, middleRight, bottom);
-        mRightDrawable.setBounds(middleRight, bounds.top, bounds.right, bottom);
-    }
-
-    @Override
-    public void draw(Canvas canvas) {
-        mLeftDrawable.draw(canvas);
-        mMiddleDrawable.draw(canvas);
-        mRightDrawable.draw(canvas);
-    }
-}
diff --git a/src/com/android/contacts/quickcontact/QuickContactListFragment.java b/src/com/android/contacts/quickcontact/QuickContactListFragment.java
new file mode 100644
index 0000000..910fede
--- /dev/null
+++ b/src/com/android/contacts/quickcontact/QuickContactListFragment.java
@@ -0,0 +1,151 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.contacts.quickcontact;
+
+import com.android.contacts.R;
+
+import android.app.Fragment;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.ViewGroup;
+import android.widget.AbsListView;
+import android.widget.AdapterView;
+import android.widget.BaseAdapter;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.ListView;
+import android.widget.TextView;
+
+import java.util.List;
+
+/** A fragment that shows the list of resolve items below a tab */
+public class QuickContactListFragment extends Fragment {
+    private ListView mListView;
+    private List<Action> mActions;
+    private LinearLayout mFragmentContainer;
+    private Listener mListener;
+
+    public QuickContactListFragment() {
+        setRetainInstance(true);
+    }
+
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedState) {
+        mFragmentContainer = (LinearLayout) inflater.inflate(R.layout.quickcontact_list_fragment,
+                container, false);
+        mListView = (ListView) mFragmentContainer.findViewById(R.id.list);
+        mListView.setOnItemClickListener(mItemClickListener);
+        mFragmentContainer.setOnClickListener(mOutsideClickListener);
+        configureAdapter();
+        return mFragmentContainer;
+    }
+
+    public void setActions(List<Action> actions) {
+        mActions = actions;
+        configureAdapter();
+    }
+
+    public void setListener(Listener value) {
+        mListener = value;
+    }
+
+    private void configureAdapter() {
+        if (mActions == null || mListView == null) return;
+
+        mListView.setAdapter(new BaseAdapter() {
+            @Override
+            public int getCount() {
+                return mActions.size();
+            }
+
+            @Override
+            public Object getItem(int position) {
+                return mActions.get(position);
+            }
+
+            @Override
+            public long getItemId(int position) {
+                return position;
+            }
+
+            @Override
+            public View getView(int position, View convertView, ViewGroup parent) {
+                final View resultView = convertView != null ? convertView
+                        : getActivity().getLayoutInflater()
+                        .inflate(R.layout.quickcontact_list_item, parent, false);
+
+                // Set action title based on summary value
+                final Action action = mActions.get(position);
+
+                // TODO: Put those findViewByIds in a container
+                final TextView text1 = (TextView) resultView.findViewById(
+                        android.R.id.text1);
+                final TextView text2 = (TextView) resultView.findViewById(
+                        android.R.id.text2);
+                final ImageView alternateActionButton = (ImageView) resultView.findViewById(
+                        R.id.secondary_action_button);
+                final View alternateActionDivider = resultView.findViewById(R.id.vertical_divider);
+
+                alternateActionButton.setOnClickListener(mSecondaryActionClickListener);
+                alternateActionButton.setTag(action);
+
+                final boolean hasAlternateAction = action.getAlternateIntent() != null;
+                alternateActionDivider.setVisibility(hasAlternateAction ? View.VISIBLE : View.GONE);
+                alternateActionButton.setImageDrawable(action.getAlternateIcon());
+
+                text1.setText(action.getBody());
+                text2.setText(action.getSubtitle().toString().toUpperCase());
+
+                resultView.setTag(action);
+                return resultView;
+            }
+        });
+    }
+
+    /** A secondary action (SMS) was clicked */
+    protected final OnClickListener mSecondaryActionClickListener = new OnClickListener() {
+        @Override
+        public void onClick(View v) {
+            final Action action = (Action) v.getTag();
+            if (mListener != null) mListener.onItemClicked(action, true);
+        }
+    };
+
+    /** A data item (e.g. phone number) was clicked */
+    private final AbsListView.OnItemClickListener mItemClickListener =
+            new AbsListView.OnItemClickListener() {
+        @Override
+        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+            final Action action = (Action) view.getTag();
+            if (mListener != null) mListener.onItemClicked(action, false);
+        }
+    };
+
+    private final OnClickListener mOutsideClickListener = new OnClickListener() {
+        @Override
+        public void onClick(View v) {
+            if (mListener != null) mListener.onOutsideClick();
+        }
+    };
+
+    public interface Listener {
+        void onOutsideClick();
+        void onItemClicked(Action action, boolean alternate);
+    }
+}
diff --git a/src/com/android/contacts/quickcontact/QuickContactWindow.java b/src/com/android/contacts/quickcontact/QuickContactWindow.java
deleted file mode 100644
index 5f4bcc9..0000000
--- a/src/com/android/contacts/quickcontact/QuickContactWindow.java
+++ /dev/null
@@ -1,1026 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.contacts.quickcontact;
-
-import com.android.contacts.Collapser;
-import com.android.contacts.ContactPresenceIconUtil;
-import com.android.contacts.ContactSaveService;
-import com.android.contacts.R;
-import com.android.contacts.model.AccountTypeManager;
-import com.android.contacts.model.DataKind;
-import com.android.contacts.util.Constants;
-import com.android.contacts.util.DataStatus;
-import com.android.contacts.util.NotifyingAsyncQueryHandler;
-import com.google.android.collect.Lists;
-import com.google.common.base.Preconditions;
-
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.animation.ObjectAnimator;
-import android.app.Activity;
-import android.content.ActivityNotFoundException;
-import android.content.ContentUris;
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.database.Cursor;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.graphics.Rect;
-import android.graphics.drawable.Drawable;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.Handler;
-import android.provider.ContactsContract.CommonDataKinds.Email;
-import android.provider.ContactsContract.CommonDataKinds.Im;
-import android.provider.ContactsContract.CommonDataKinds.Phone;
-import android.provider.ContactsContract.CommonDataKinds.Photo;
-import android.provider.ContactsContract.CommonDataKinds.SipAddress;
-import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
-import android.provider.ContactsContract.CommonDataKinds.Website;
-import android.provider.ContactsContract.Contacts;
-import android.provider.ContactsContract.Data;
-import android.provider.ContactsContract.QuickContact;
-import android.provider.ContactsContract.RawContacts;
-import android.text.TextUtils;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.ViewStub;
-import android.widget.AbsListView;
-import android.widget.AdapterView;
-import android.widget.BaseAdapter;
-import android.widget.Button;
-import android.widget.CheckBox;
-import android.widget.FrameLayout;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-import android.widget.ListView;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * Mostly translucent {@link Activity} that shows QuickContact dialog. It loads
- * data asynchronously, and then shows a popup with details centered around
- * {@link Intent#getSourceBounds()}.
- */
-public class QuickContactWindow extends Activity implements
-        NotifyingAsyncQueryHandler.AsyncQueryListener, View.OnClickListener,
-        AbsListView.OnItemClickListener {
-    private static final String TAG = "QuickContact";
-
-    private static final boolean TRACE_LAUNCH = false;
-    private static final String TRACE_TAG = "quickcontact";
-
-    private static final int ANIMATION_FADE_IN_TIME = 100;
-    private static final int ANIMATION_FADE_OUT_TIME = 100;
-    private static final int ANIMATION_EXPAND_TIME = 100;
-    private static final int ANIMATION_COLLAPSE_TIME = 100;
-
-    private NotifyingAsyncQueryHandler mHandler;
-
-    private Uri mLookupUri;
-    private int mMode;
-    private String[] mExcludeMimes;
-
-    private boolean mHasValidSocial = false;
-
-    private FloatingChildLayout mFloatingLayout;
-    private QuickContactBackgroundDrawable mBackground;
-
-    private View mHeader;
-    private ViewGroup mTrack;
-    private FrameLayout mFooter;
-    private LinearLayout mFooterDisambig;
-    private LinearLayout mFooterClearDefaults;
-
-    private ListView mResolveList;
-    private CheckableImageView mLastAction;
-    private CheckBox mSetPrimaryCheckBox;
-    private ListView mDefaultsListView;
-    private Button mClearDefaultsButton;
-
-    /**
-     * Keeps the default action per mimetype. Empty if no default actions are set
-     */
-    private HashMap<String, Action> mDefaultsMap = new HashMap<String, Action>();
-
-    /**
-     * Set of {@link Action} that are associated with the aggregate currently
-     * displayed by this dialog, represented as a map from {@link String}
-     * MIME-type to a list of {@link Action}.
-     */
-    private ActionMultiMap mActions = new ActionMultiMap();
-
-    /**
-     * {@link #PRECEDING_MIMETYPES} and {@link #FOLLOWING_MIMETYPES} are used to sort MIME-types.
-     *
-     * <p>The MIME-types in {@link #PRECEDING_MIMETYPES} appear in the front of the dialog,
-     * in the order in the array.
-     *
-     * <p>The ones in {@link #FOLLOWING_MIMETYPES} appear in the end of the dialog, in alphabetical
-     * order.
-     *
-     * <p>The rest go between them, in the order in the array.
-     */
-    private static final String[] PRECEDING_MIMETYPES = new String[] {
-            Phone.CONTENT_ITEM_TYPE,
-            SipAddress.CONTENT_ITEM_TYPE,
-            Contacts.CONTENT_ITEM_TYPE,
-            Constants.MIME_TYPE_SMS_ADDRESS,
-            Email.CONTENT_ITEM_TYPE,
-    };
-
-    /**
-     * See {@link #PRECEDING_MIMETYPES}.
-     */
-    private static final String[] FOLLOWING_MIMETYPES = new String[] {
-            StructuredPostal.CONTENT_ITEM_TYPE,
-            Website.CONTENT_ITEM_TYPE,
-    };
-
-    /**
-     * List of MIMETYPES that do not represent real data rows and can therefore not be set
-     * as defaults
-     */
-    private static final ArrayList<String> VIRTUAL_MIMETYPES = Lists.newArrayList(new String[] {
-            Im.CONTENT_ITEM_TYPE,
-            Constants.MIME_TYPE_SMS_ADDRESS,
-            Constants.MIME_TYPE_VIDEO_CHAT,
-    });
-    private static final int TOKEN_DATA = 1;
-
-    @Override
-    protected void onCreate(Bundle icicle) {
-        super.onCreate(icicle);
-
-        setContentView(R.layout.quickcontact_activity);
-
-        mBackground = new QuickContactBackgroundDrawable(getResources());
-
-        mFloatingLayout = findTypedViewById(R.id.floating_layout);
-        mFloatingLayout.getChild().setBackgroundDrawable(mBackground);
-        mFloatingLayout.setOnOutsideTouchListener(mOnOutsideTouchListener);
-
-        mTrack = findTypedViewById(R.id.quickcontact);
-        mFooter = findTypedViewById(R.id.footer);
-        mFooterDisambig = findTypedViewById(R.id.footer_disambig);
-        mFooterClearDefaults = findTypedViewById(R.id.footer_clear_defaults);
-        mResolveList = findTypedViewById(android.R.id.list);
-        mSetPrimaryCheckBox = findTypedViewById(android.R.id.checkbox);
-
-        mDefaultsListView = findTypedViewById(R.id.defaults_list);
-
-        mClearDefaultsButton = findTypedViewById(R.id.clear_defaults_button);
-        mClearDefaultsButton.setOnClickListener(mOnClearDefaultsClickListener);
-
-        mResolveList.setOnItemClickListener(this);
-
-        mHandler = new NotifyingAsyncQueryHandler(this, this);
-
-        show();
-    }
-
-    private View getHeaderView(int mode) {
-        View header = null;
-        switch (mode) {
-            case QuickContact.MODE_SMALL:
-                header = findViewById(R.id.header_small);
-                break;
-            case QuickContact.MODE_MEDIUM:
-                header = findViewById(R.id.header_medium);
-                break;
-            case QuickContact.MODE_LARGE:
-                header = findViewById(R.id.header_large);
-                break;
-        }
-
-        if (header instanceof ViewStub) {
-            // Inflate actual header if we picked a stub
-            final ViewStub stub = (ViewStub)header;
-            header = stub.inflate();
-        } else if (header != null) {
-            header.setVisibility(View.VISIBLE);
-        }
-
-        return header;
-    }
-
-    private void show() {
-
-        if (TRACE_LAUNCH) {
-            android.os.Debug.startMethodTracing(TRACE_TAG);
-        }
-
-        final Intent intent = getIntent();
-
-        Uri lookupUri = intent.getData();
-
-        // Check to see whether it comes from the old version.
-        if (android.provider.Contacts.AUTHORITY.equals(lookupUri.getAuthority())) {
-            final long rawContactId = ContentUris.parseId(lookupUri);
-            lookupUri = RawContacts.getContactLookupUri(getContentResolver(),
-                    ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId));
-        }
-
-        mLookupUri = Preconditions.checkNotNull(lookupUri, "missing lookupUri");
-
-        // Read requested parameters for displaying
-        final Rect targetScreen = intent.getSourceBounds();
-        Preconditions.checkNotNull(targetScreen, "missing targetScreen");
-        mFloatingLayout.setChildTargetScreen(targetScreen);
-
-        mMode = intent.getIntExtra(QuickContact.EXTRA_MODE, QuickContact.MODE_MEDIUM);
-        mExcludeMimes = intent.getStringArrayExtra(QuickContact.EXTRA_EXCLUDE_MIMES);
-
-        switch (mMode) {
-            case QuickContact.MODE_SMALL:
-            case QuickContact.MODE_MEDIUM:
-            case QuickContact.MODE_LARGE:
-                break;
-            default:
-                throw new IllegalArgumentException("Unexpected mode: " + mMode);
-        }
-
-        // find and prepare correct header view
-        mHeader = getHeaderView(mMode);
-        setHeaderText(R.id.name, R.string.quickcontact_missing_name);
-        setHeaderText(R.id.status, null);
-        setHeaderText(R.id.timestamp, null);
-        setHeaderImage(R.id.presence, null);
-
-        // Start background query for data, but only select photo rows when they
-        // directly match the super-primary PHOTO_ID.
-        final Uri dataUri = Uri.withAppendedPath(lookupUri, Contacts.Data.CONTENT_DIRECTORY);
-        mHandler.cancelOperation(TOKEN_DATA);
-
-        // Only request photo data when required by mode
-        if (mMode == QuickContact.MODE_LARGE) {
-            // Select photos, but only super-primary
-            mHandler.startQuery(TOKEN_DATA, lookupUri, dataUri, DataQuery.PROJECTION, Data.MIMETYPE
-                    + "!=? OR (" + Data.MIMETYPE + "=? AND " + Data._ID + "=" + Contacts.PHOTO_ID
-                    + ")", new String[] { Photo.CONTENT_ITEM_TYPE, Photo.CONTENT_ITEM_TYPE }, null);
-        } else {
-            // Exclude all photos from cursor
-            mHandler.startQuery(TOKEN_DATA, lookupUri, dataUri, DataQuery.PROJECTION, Data.MIMETYPE
-                    + "!=?", new String[] { Photo.CONTENT_ITEM_TYPE }, null);
-        }
-    }
-
-    @SuppressWarnings("unchecked")
-    private <T> T findTypedViewById(int id) {
-        return (T) super.findViewById(id);
-    }
-
-    private View.OnTouchListener mOnOutsideTouchListener = new View.OnTouchListener() {
-        /** {@inheritDoc} */
-        public boolean onTouch(View v, MotionEvent event) {
-            hide(true);
-            return true;
-        }
-    };
-
-    private View.OnClickListener mOnClearDefaultsClickListener = new View.OnClickListener() {
-        /** {@inheritDoc} */
-        public void onClick(View v) {
-            clearDefaults();
-        }
-    };
-
-    private void hide(boolean withAnimation) {
-        // cancel any pending queries
-        mHandler.cancelOperation(TOKEN_DATA);
-
-        if (withAnimation) {
-            mFloatingLayout.hideChild(new Runnable() {
-                /** {@inheritDoc} */
-                public void run() {
-                    finish();
-                }
-            });
-        } else {
-            mFloatingLayout.hideChild(null);
-            finish();
-        }
-    }
-
-    @Override
-    public void onBackPressed() {
-        hide(true);
-    }
-
-    /** {@inheritDoc} */
-    public synchronized void onQueryComplete(int token, Object cookie, Cursor cursor) {
-        try {
-            if (isFinishing()) {
-                hide(false);
-                return;
-            } else if (cursor == null || cursor.getCount() == 0) {
-                Toast.makeText(this, R.string.invalidContactMessage, Toast.LENGTH_LONG).show();
-                hide(false);
-                return;
-            }
-
-            bindData(cursor);
-
-            if (mMode == QuickContact.MODE_MEDIUM && !mHasValidSocial) {
-                // Missing valid social, swap medium for small header
-                mHeader.setVisibility(View.GONE);
-                mHeader = getHeaderView(QuickContact.MODE_SMALL);
-            }
-
-            if (TRACE_LAUNCH) {
-                android.os.Debug.stopMethodTracing();
-            }
-
-            // data bound and ready, pull curtain to show
-            mFloatingLayout.showChild();
-
-        } finally {
-            if (cursor != null) {
-                cursor.close();
-            }
-        }
-    }
-
-    /** Assign this string to the view, if found in {@link #mHeader}. */
-    private void setHeaderText(int id, int resId) {
-        setHeaderText(id, getText(resId));
-    }
-
-    /** Assign this string to the view, if found in {@link #mHeader}. */
-    private void setHeaderText(int id, CharSequence value) {
-        final View view = mHeader.findViewById(id);
-        if (view instanceof TextView) {
-            ((TextView)view).setText(value);
-            view.setVisibility(TextUtils.isEmpty(value) ? View.GONE : View.VISIBLE);
-        }
-    }
-
-    /** Assign this image to the view, if found in {@link #mHeader}. */
-    private void setHeaderImage(int id, Drawable drawable) {
-        final View view = mHeader.findViewById(id);
-        if (view instanceof ImageView) {
-            ((ImageView)view).setImageDrawable(drawable);
-            view.setVisibility(drawable == null ? View.GONE : View.VISIBLE);
-        }
-    }
-
-    /**
-     * Check if the given MIME-type appears in the list of excluded MIME-types
-     * that the most-recent caller requested.
-     */
-    private boolean isMimeExcluded(String mimeType) {
-        if (mExcludeMimes == null) return false;
-        for (String excludedMime : mExcludeMimes) {
-            if (TextUtils.equals(excludedMime, mimeType)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Handle the result from the {@link #TOKEN_DATA} query.
-     */
-    private void bindData(Cursor cursor) {
-        final ResolveCache cache = ResolveCache.getInstance(this);
-        final Context context = this;
-
-        if (!isMimeExcluded(Contacts.CONTENT_ITEM_TYPE)) {
-            // Add the profile shortcut action
-            final Action action = new ProfileAction(context, mLookupUri);
-            mActions.put(Contacts.CONTENT_ITEM_TYPE, action);
-        }
-
-        mDefaultsMap.clear();
-
-        final DataStatus status = new DataStatus();
-        final AccountTypeManager accountTypes = AccountTypeManager.getInstance(
-                context.getApplicationContext());
-        final ImageView photoView = (ImageView) mHeader.findViewById(R.id.photo);
-
-        Bitmap photoBitmap = null;
-        while (cursor.moveToNext()) {
-            final long dataId = cursor.getLong(DataQuery._ID);
-            final String accountType = cursor.getString(DataQuery.ACCOUNT_TYPE);
-            final String mimeType = cursor.getString(DataQuery.MIMETYPE);
-            final boolean isPrimary = cursor.getInt(DataQuery.IS_PRIMARY) != 0;
-            final boolean isSuperPrimary = cursor.getInt(DataQuery.IS_SUPER_PRIMARY) != 0;
-
-            // Handle any social status updates from this row
-            status.possibleUpdate(cursor);
-
-            // Skip this data item if MIME-type excluded
-            if (isMimeExcluded(mimeType)) continue;
-
-            // Handle photos included as data row
-            if (Photo.CONTENT_ITEM_TYPE.equals(mimeType)) {
-                final int colPhoto = cursor.getColumnIndex(Photo.PHOTO);
-                final byte[] photoBlob = cursor.getBlob(colPhoto);
-                if (photoBlob != null) {
-                    photoBitmap = BitmapFactory.decodeByteArray(photoBlob, 0, photoBlob.length);
-                }
-                continue;
-            }
-
-            final DataKind kind = accountTypes.getKindOrFallback(accountType, mimeType);
-
-            if (kind != null) {
-                // Build an action for this data entry, find a mapping to a UI
-                // element, build its summary from the cursor, and collect it
-                // along with all others of this MIME-type.
-                final Action action = new DataAction(context, mimeType, kind, dataId, cursor);
-                final boolean wasAdded = considerAdd(action, cache);
-                if (wasAdded) {
-                    // Remember the default
-                    if (isSuperPrimary || (isPrimary && (mDefaultsMap.get(mimeType) == null))) {
-                        mDefaultsMap.put(mimeType, action);
-                    }
-                }
-            }
-
-            // If phone number, also insert as text message action
-            if (Phone.CONTENT_ITEM_TYPE.equals(mimeType) && kind != null) {
-                final DataAction action = new DataAction(context, Constants.MIME_TYPE_SMS_ADDRESS,
-                        kind, dataId, cursor);
-                considerAdd(action, cache);
-            }
-
-            boolean isIm = Im.CONTENT_ITEM_TYPE.equals(mimeType);
-
-            // Handle Email rows with presence data as Im entry
-            final boolean hasPresence = !cursor.isNull(DataQuery.PRESENCE);
-            if (hasPresence && Email.CONTENT_ITEM_TYPE.equals(mimeType)) {
-                final DataKind imKind = accountTypes.getKindOrFallback(accountType,
-                        Im.CONTENT_ITEM_TYPE);
-                if (imKind != null) {
-                    final DataAction action = new DataAction(context, Im.CONTENT_ITEM_TYPE, imKind,
-                            dataId, cursor);
-                    considerAdd(action, cache);
-                    isIm = true;
-                }
-            }
-
-            if (hasPresence && isIm) {
-                int chatCapability = cursor.getInt(DataQuery.CHAT_CAPABILITY);
-                if ((chatCapability & Im.CAPABILITY_HAS_CAMERA) != 0) {
-                    final DataKind imKind = accountTypes.getKindOrFallback(accountType,
-                            Im.CONTENT_ITEM_TYPE);
-                    if (imKind != null) {
-                        final DataAction chatAction = new DataAction(context,
-                                Constants.MIME_TYPE_VIDEO_CHAT, imKind, dataId, cursor);
-                        considerAdd(chatAction, cache);
-                    }
-                }
-            }
-        }
-
-        // Collapse Action Lists (remove e.g. duplicate e-mail addresses from different sources)
-        for (ArrayList<Action> actionChildren : mActions.values()) {
-            Collapser.collapseList(actionChildren);
-        }
-
-        // Make sure that we only display the "clear default" action if there
-        // are actually several items to chose from
-        boolean shouldDisplayClearDefaults = false;
-        for (String mimetype : mDefaultsMap.keySet()) {
-            if (mActions.get(mimetype).size() > 1) {
-                shouldDisplayClearDefaults = true;
-                break;
-            }
-        }
-
-        if (shouldDisplayClearDefaults) {
-            final Action action = new ClearDefaultsAction();
-            mActions.put(action.getMimeType(), action);
-        }
-
-        if (cursor.moveToLast()) {
-            // Read contact information from last data row
-            final String name = cursor.getString(DataQuery.DISPLAY_NAME);
-            final int presence = cursor.getInt(DataQuery.CONTACT_PRESENCE);
-            final int chatCapability = cursor.getInt(DataQuery.CONTACT_CHAT_CAPABILITY);
-            final Drawable statusIcon = ContactPresenceIconUtil.getChatCapabilityIcon(
-                    context, presence, chatCapability);
-
-            setHeaderText(R.id.name, name);
-            setHeaderImage(R.id.presence, statusIcon);
-        }
-
-        if (photoView != null) {
-            // Place photo when discovered in data, otherwise hide
-            photoView.setVisibility(photoBitmap != null ? View.VISIBLE : View.GONE);
-            photoView.setImageBitmap(photoBitmap);
-        }
-
-        mHasValidSocial = status.isValid();
-        if (mHasValidSocial && mMode != QuickContact.MODE_SMALL) {
-            // Update status when valid was found
-            setHeaderText(R.id.status, status.getStatus());
-            setHeaderText(R.id.timestamp, status.getTimestampLabel(context));
-        }
-
-        // Turn our list of actions into UI elements
-
-        // All the mime-types to add.
-        final Set<String> containedTypes = new HashSet<String>(mActions.keySet());
-
-        boolean hasData = false;
-
-        // First, add PRECEDING_MIMETYPES, which are most common.
-        for (String mimeType : PRECEDING_MIMETYPES) {
-            if (containedTypes.contains(mimeType)) {
-                hasData = true;
-                mTrack.addView(inflateAction(mimeType, cache, mTrack));
-                containedTypes.remove(mimeType);
-            }
-        }
-
-        // Keep the current index to append non PRECEDING/FOLLOWING items.
-        final int indexAfterPreceding = mTrack.getChildCount() - 1;
-
-        // Then, add FOLLOWING_MIMETYPES, which are least common.
-        for (String mimeType : FOLLOWING_MIMETYPES) {
-            if (containedTypes.contains(mimeType)) {
-                hasData = true;
-                mTrack.addView(inflateAction(mimeType, cache, mTrack));
-                containedTypes.remove(mimeType);
-            }
-        }
-
-        // Show the clear-defaults button? If yes, it goes to the end of the list
-        if (containedTypes.contains(ClearDefaultsAction.PSEUDO_MIME_TYPE)) {
-            final ClearDefaultsAction action = (ClearDefaultsAction) mActions.get(
-                    ClearDefaultsAction.PSEUDO_MIME_TYPE).get(0);
-            final CheckableImageView view = (CheckableImageView) getLayoutInflater().inflate(
-                    R.layout.quickcontact_item, mTrack, false);
-
-            view.setChecked(false);
-            final String description = context.getResources().getString(
-                    R.string.quickcontact_clear_defaults_description);
-            view.setContentDescription(description);
-            view.setImageResource(R.drawable.ic_menu_settings_holo_light);
-            view.setOnClickListener(this);
-            view.setTag(action);
-            mTrack.addView(view);
-            containedTypes.remove(ClearDefaultsAction.PSEUDO_MIME_TYPE);
-        }
-
-        // Go back to just after PRECEDING_MIMETYPES, and append the rest.
-        int index = indexAfterPreceding;
-        final String[] remainingTypes = containedTypes.toArray(new String[containedTypes.size()]);
-        if (remainingTypes.length > 0) hasData = true;
-        Arrays.sort(remainingTypes);
-        for (String mimeType : remainingTypes) {
-            mTrack.addView(inflateAction(mimeType, cache, mTrack), index++);
-        }
-
-        if (!hasData) {
-            // When there is no data to display, add a TextView to show the user there's no data
-            View view = getLayoutInflater().inflate(
-                    R.layout.quickcontact_item_nodata, mTrack, false);
-            mTrack.addView(view, index++);
-        }
-    }
-
-    /**
-     * Clears the defaults currently set on the Contact
-     */
-    private void clearDefaults() {
-        final Context context = this;
-        final Set<String> mimeTypesKeySet = mDefaultsMap.keySet();
-
-        // Copy to array so that we can modify the HashMap below
-        final String[] mimeTypes = new String[mimeTypesKeySet.size()];
-        mimeTypesKeySet.toArray(mimeTypes);
-
-        // Send clear default Intents, one by one
-        for (String mimeType : mimeTypes) {
-            final Action action = mDefaultsMap.get(mimeType);
-            final Intent intent = ContactSaveService.createClearPrimaryIntent(
-                    context, action.getDataId());
-            context.startService(intent);
-            mDefaultsMap.remove(mimeType);
-        }
-
-        // Close up and remove the configure default button
-        animateCollapse(new Runnable() {
-            @Override
-            public void run() {
-                for (int i = mTrack.getChildCount() - 1; i >= 0; i--) {
-                    final CheckableImageView button = (CheckableImageView) mTrack.getChildAt(i);
-                    if (button.getTag() instanceof ClearDefaultsAction) {
-                        mTrack.removeViewAt(i);
-                        break;
-                    }
-                }
-            }
-        });
-    }
-
-    /**
-     * Consider adding the given {@link Action}, which will only happen if
-     * {@link PackageManager} finds an application to handle
-     * {@link Action#getIntent()}.
-     * @return true if action has been added
-     */
-    private boolean considerAdd(Action action, ResolveCache resolveCache) {
-        if (resolveCache.hasResolve(action)) {
-            mActions.put(action.getMimeType(), action);
-            return true;
-        }
-        return false;
-    }
-
-    /**
-     * Inflate the in-track view for the action of the given MIME-type, collapsing duplicate values.
-     * Will use the icon provided by the {@link DataKind}.
-     */
-    private View inflateAction(String mimeType, ResolveCache resolveCache, ViewGroup root) {
-        final CheckableImageView view = (CheckableImageView) getLayoutInflater().inflate(
-                R.layout.quickcontact_item, root, false);
-
-        // Add direct intent if single child, otherwise flag for multiple
-        List<Action> children = mActions.get(mimeType);
-        view.setTag(mimeType);
-        final Action firstInfo = children.get(0);
-
-        // Set icon and listen for clicks
-        final CharSequence descrip = resolveCache.getDescription(firstInfo);
-        final Drawable icon = resolveCache.getIcon(firstInfo);
-        view.setChecked(false);
-        view.setContentDescription(descrip);
-        view.setImageDrawable(icon);
-        view.setOnClickListener(this);
-        return view;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
-        // Pass list item clicks along so that Intents are handled uniformly
-        onClick(view);
-    }
-
-    /**
-     * Helper for checking an action view
-     */
-    private void setNewActionViewChecked(CheckableImageView actionView) {
-        if (mLastAction != null) mLastAction.setChecked(false);
-        if (actionView != null) actionView.setChecked(true);
-        mLastAction = actionView;
-    }
-
-    /**
-     * Animates collpasing of the disambig area. When done, it expands again to the new size
-     */
-    private void animateCollapse(final Runnable whenDone) {
-        final int oldBottom = mBackground.getBounds().bottom;
-        mBackground.setBottomOverride(oldBottom);
-
-        final ObjectAnimator fadeOutAnimator = ObjectAnimator.ofFloat(mFooter, "alpha",
-                1.0f, 0.0f);
-        fadeOutAnimator.setDuration(ANIMATION_FADE_OUT_TIME);
-        fadeOutAnimator.start();
-
-        final ObjectAnimator collapseAnimator = ObjectAnimator.ofInt(mBackground,
-                "bottomOverride", oldBottom, oldBottom - mFooter.getHeight());
-        collapseAnimator.setDuration(ANIMATION_COLLAPSE_TIME);
-        collapseAnimator.setStartDelay(ANIMATION_FADE_OUT_TIME);
-        collapseAnimator.start();
-
-        collapseAnimator.addListener(new AnimatorListenerAdapter() {
-            @Override
-            public void onAnimationEnd(Animator animation) {
-                mFooter.setVisibility(View.GONE);
-                new Handler().post(whenDone);
-            }
-        });
-    }
-
-    /**
-     * Animates expansion of the disambig area.
-     * @param showClearDefaults true to expand to clear defaults. false to expand to intent disambig
-     */
-    private void animateExpand(boolean showClearDefaults) {
-        mFooter.setVisibility(View.VISIBLE);
-        mFooterDisambig.setVisibility(showClearDefaults ? View.GONE : View.VISIBLE);
-        mFooterClearDefaults.setVisibility(showClearDefaults ? View.VISIBLE : View.GONE);
-        final int oldBottom = mBackground.getBounds().bottom;
-        mBackground.setBottomOverride(oldBottom);
-        mFooter.setAlpha(0.0f);
-        new Handler().post(new Runnable() {
-            @Override
-            public void run() {
-                final int newBottom = mBackground.getBounds().bottom;
-                final ObjectAnimator expandAnimator = ObjectAnimator.ofInt(mBackground,
-                        "bottomOverride", oldBottom, newBottom);
-                expandAnimator.setDuration(ANIMATION_EXPAND_TIME);
-                expandAnimator.start();
-
-                expandAnimator.addListener(new AnimatorListenerAdapter() {
-                    @Override
-                    public void onAnimationEnd(Animator animation) {
-                        mBackground.clearBottomOverride();
-                    }
-                });
-
-                final ObjectAnimator fadeInAnimator = ObjectAnimator.ofFloat(mFooter,
-                        "alpha", 0.0f, 1.0f);
-                fadeInAnimator.setDuration(ANIMATION_FADE_IN_TIME);
-                fadeInAnimator.setStartDelay(ANIMATION_EXPAND_TIME);
-                fadeInAnimator.start();
-            }
-        });
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public void onClick(View view) {
-        final Context context = this;
-
-        final boolean isActionView = (view instanceof CheckableImageView);
-        final CheckableImageView actionView = isActionView ? (CheckableImageView)view : null;
-        final Object tag = view.getTag();
-
-        if (tag instanceof ClearDefaultsAction) {
-            // Do nothing if already open
-            if (actionView == mLastAction) return;
-            // collapse any disambig that may already be open. the open clearing-defaults
-            final Runnable expandClearDefaultsRunnable = new Runnable() {
-                @Override
-                public void run() {
-                    // Show resolution list and set adapter
-                    setNewActionViewChecked(actionView);
-                    final Action[] actions = new Action[mDefaultsMap.size()];
-                    mDefaultsMap.values().toArray(actions);
-
-                    mDefaultsListView.setAdapter(new BaseAdapter() {
-                        @Override
-                        public int getCount() {
-                            return actions.length;
-                        }
-
-                        @Override
-                        public Object getItem(int position) {
-                            return actions[position];
-                        }
-
-                        @Override
-                        public long getItemId(int position) {
-                            return position;
-                        }
-
-                        @Override
-                        public boolean areAllItemsEnabled() {
-                            return false;
-                        }
-
-                        @Override
-                        public boolean isEnabled(int position) {
-                            return false;
-                        }
-
-                        @Override
-                        public View getView(int position, View convertView, ViewGroup parent) {
-                            if (convertView == null) {
-                                convertView = getLayoutInflater().inflate(
-                                        R.layout.quickcontact_default_item, parent, false);
-                            }
-
-                            // Set action title based on summary value
-                            final Action defaultAction = actions[position];
-
-                            final TextView text1 = (TextView) convertView.findViewById(
-                                    android.R.id.text1);
-                            final TextView text2 = (TextView) convertView.findViewById(
-                                    android.R.id.text2);
-
-                            text1.setText(defaultAction.getHeader());
-                            text2.setText(defaultAction.getBody());
-
-                            convertView.setTag(defaultAction);
-                            return convertView;
-                        }
-                    });
-
-                    animateExpand(true);
-                }
-            };
-            if (mFooter.getVisibility() == View.VISIBLE) {
-                animateCollapse(expandClearDefaultsRunnable);
-            } else {
-                new Handler().post(expandClearDefaultsRunnable);
-            }
-            return;
-        }
-
-        // Determine whether to launch a specific Action or show a disambig-List
-        final Action action;
-        final List<Action> actionList;
-        final boolean fromDisambigList;
-        final String mimeType;
-        if (tag instanceof Action) {
-            action = (Action) tag;
-            actionList = null;
-            fromDisambigList = true;
-            mimeType = action.getMimeType();
-        } else if (tag instanceof String) {
-            mimeType = (String) tag;
-            actionList = mActions.get(mimeType);
-
-            if (actionList.size() == 1) {
-                // Just one item? Pick that one
-                action = actionList.get(0);
-            } else if (mDefaultsMap.containsKey(mimeType)) {
-                // Default item? pick that one
-                action = mDefaultsMap.get(mimeType);
-            } else {
-                // Several actions and none is default.
-                action = null;
-            }
-            fromDisambigList = false;
-        } else {
-            throw new IllegalStateException("tag is neither Action nor (mimetype-) String");
-        }
-
-        if (action != null) {
-            final boolean isVirtual = VIRTUAL_MIMETYPES.contains(mimeType);
-            final boolean makePrimary = fromDisambigList && mSetPrimaryCheckBox.isChecked() &&
-                    !isVirtual;
-            final Runnable startAppRunnable = new Runnable() {
-                @Override
-                public void run() {
-                    // Incoming tag is concrete intent, so try launching
-                    try {
-                        context.startActivity(action.getIntent());
-                    } catch (ActivityNotFoundException e) {
-                        Toast.makeText(context, R.string.quickcontact_missing_app,
-                                Toast.LENGTH_SHORT).show();
-                    }
-
-                    // Hide the resolution list, if present
-                    setNewActionViewChecked(null);
-
-                    // Set default?
-                    final long dataId = action.getDataId();
-                    if (makePrimary && dataId != -1) {
-                        Intent serviceIntent = ContactSaveService.createSetSuperPrimaryIntent(
-                                context, dataId);
-                        context.startService(serviceIntent);
-                    }
-
-                    hide(false);
-                }
-            };
-            if (isActionView && mFooter.getVisibility() == View.VISIBLE) {
-                // If the footer is currently opened, animate its collapse and then
-                // execute the target app
-                animateCollapse(startAppRunnable);
-            } else {
-                // Defer the action to make the window properly repaint
-                new Handler().post(startAppRunnable);
-            }
-            return;
-        }
-
-        // This was not a specific Action. Expand the disambig-list
-        if (actionList == null) throw new IllegalStateException();
-
-        // Don't do anything if already open
-        if (actionView == mLastAction) return;
-        final Runnable configureListRunnable = new Runnable() {
-            @Override
-            public void run() {
-                // Show resolution list and set adapter
-                setNewActionViewChecked(actionView);
-                final boolean isVirtual = VIRTUAL_MIMETYPES.contains(mimeType);
-                mSetPrimaryCheckBox.setVisibility(isVirtual ? View.GONE : View.VISIBLE);
-
-                mResolveList.setAdapter(new BaseAdapter() {
-                    @Override
-                    public int getCount() {
-                        return actionList.size();
-                    }
-
-                    @Override
-                    public Object getItem(int position) {
-                        return actionList.get(position);
-                    }
-
-                    @Override
-                    public long getItemId(int position) {
-                        return position;
-                    }
-
-                    @Override
-                    public View getView(int position, View convertView, ViewGroup parent) {
-                        if (convertView == null) {
-                            convertView = getLayoutInflater().inflate(
-                                    R.layout.quickcontact_resolve_item, parent, false);
-                        }
-
-                        // Set action title based on summary value
-                        final Action listAction = actionList.get(position);
-
-                        final TextView text1 = (TextView) convertView.findViewById(
-                                android.R.id.text1);
-                        final TextView text2 = (TextView) convertView.findViewById(
-                                android.R.id.text2);
-
-                        text1.setText(listAction.getHeader());
-                        text2.setText(listAction.getBody());
-
-                        convertView.setTag(listAction);
-                        return convertView;
-                    }
-                });
-
-                animateExpand(false);
-            }
-        };
-
-        if (mFooter.getVisibility() == View.VISIBLE) {
-            // If the expansion list is currently opened, animate its collapse and then
-            // execute the target app
-            animateCollapse(configureListRunnable);
-        } else {
-            // Defer the action to make the window properly repaint
-            configureListRunnable.run();
-        }
-    }
-
-
-    private interface DataQuery {
-        final String[] PROJECTION = new String[] {
-                Data._ID,
-
-                RawContacts.ACCOUNT_TYPE,
-                Contacts.STARRED,
-                Contacts.DISPLAY_NAME,
-                Contacts.CONTACT_PRESENCE,
-                Contacts.CONTACT_CHAT_CAPABILITY,
-
-                Data.STATUS,
-                Data.STATUS_RES_PACKAGE,
-                Data.STATUS_ICON,
-                Data.STATUS_LABEL,
-                Data.STATUS_TIMESTAMP,
-                Data.PRESENCE,
-                Data.CHAT_CAPABILITY,
-
-                Data.RES_PACKAGE,
-                Data.MIMETYPE,
-                Data.IS_PRIMARY,
-                Data.IS_SUPER_PRIMARY,
-                Data.RAW_CONTACT_ID,
-
-                Data.DATA1, Data.DATA2, Data.DATA3, Data.DATA4, Data.DATA5,
-                Data.DATA6, Data.DATA7, Data.DATA8, Data.DATA9, Data.DATA10, Data.DATA11,
-                Data.DATA12, Data.DATA13, Data.DATA14, Data.DATA15,
-        };
-
-        final int _ID = 0;
-
-        final int ACCOUNT_TYPE = 1;
-        final int STARRED = 2;
-        final int DISPLAY_NAME = 3;
-        final int CONTACT_PRESENCE = 4;
-        final int CONTACT_CHAT_CAPABILITY = 5;
-
-        final int STATUS = 6;
-        final int STATUS_RES_PACKAGE = 7;
-        final int STATUS_ICON = 8;
-        final int STATUS_LABEL = 9;
-        final int STATUS_TIMESTAMP = 10;
-        final int PRESENCE = 11;
-        final int CHAT_CAPABILITY = 12;
-
-        final int RES_PACKAGE = 13;
-        final int MIMETYPE = 14;
-        final int IS_PRIMARY = 15;
-        final int IS_SUPER_PRIMARY = 16;
-    }
-}
diff --git a/src/com/android/contacts/quickcontact/ResolveCache.java b/src/com/android/contacts/quickcontact/ResolveCache.java
index 2b9e92f..71c4d0a 100644
--- a/src/com/android/contacts/quickcontact/ResolveCache.java
+++ b/src/com/android/contacts/quickcontact/ResolveCache.java
@@ -134,7 +134,7 @@
 
     /**
      * Best {@link ResolveInfo} when multiple found. Ties are broken by
-     * selecting first from the {QuickContactWindow#sPreferResolve} list of
+     * selecting first from the {@link QuickContactActivity#sPreferResolve} list of
      * preferred packages, second by apps that live on the system partition,
      * otherwise the app from the top of the list. This is
      * <strong>only</strong> used for selecting a default icon for
@@ -182,10 +182,10 @@
      * for accessibility purposes.
      */
     public CharSequence getDescription(Action action) {
-        final CharSequence actionHeader = action.getHeader();
+        final CharSequence actionSubtitle = action.getSubtitle();
         final ResolveInfo info = getEntry(action).bestResolve;
-        if (!TextUtils.isEmpty(actionHeader)) {
-            return actionHeader;
+        if (!TextUtils.isEmpty(actionSubtitle)) {
+            return actionSubtitle;
         } else if (info != null) {
             return info.loadLabel(mPackageManager);
         } else {
diff --git a/src/com/android/contacts/util/AccountSelectionUtil.java b/src/com/android/contacts/util/AccountSelectionUtil.java
index 46d20b8..7317d21 100644
--- a/src/com/android/contacts/util/AccountSelectionUtil.java
+++ b/src/com/android/contacts/util/AccountSelectionUtil.java
@@ -16,7 +16,11 @@
 
 package com.android.contacts.util;
 
-import android.accounts.Account;
+import com.android.contacts.R;
+import com.android.contacts.model.AccountType;
+import com.android.contacts.model.AccountTypeManager;
+import com.android.contacts.model.AccountWithDataSet;
+
 import android.app.AlertDialog;
 import android.app.Dialog;
 import android.content.Context;
@@ -31,10 +35,6 @@
 import android.widget.ArrayAdapter;
 import android.widget.TextView;
 
-import com.android.contacts.R;
-import com.android.contacts.model.AccountType;
-import com.android.contacts.model.AccountTypeManager;
-
 import java.util.List;
 
 /**
@@ -54,9 +54,10 @@
         final private Context mContext;
         final private int mResId;
 
-        final protected List<Account> mAccountList;
+        final protected List<AccountWithDataSet> mAccountList;
 
-        public AccountSelectedListener(Context context, List<Account> accountList, int resId) {
+        public AccountSelectedListener(Context context, List<AccountWithDataSet> accountList,
+                int resId) {
             if (accountList == null || accountList.size() == 0) {
                 Log.e(LOG_TAG, "The size of Account list is 0.");
             }
@@ -88,7 +89,7 @@
             DialogInterface.OnClickListener onClickListener,
             DialogInterface.OnCancelListener onCancelListener) {
         final AccountTypeManager accountTypes = AccountTypeManager.getInstance(context);
-        final List<Account> writableAccountList = accountTypes.getAccounts(true);
+        final List<AccountWithDataSet> writableAccountList = accountTypes.getAccounts(true);
 
         Log.i(LOG_TAG, "The number of available accounts: " + writableAccountList.size());
 
@@ -99,8 +100,8 @@
                 context, android.R.style.Theme_Light);
         final LayoutInflater dialogInflater = (LayoutInflater)dialogContext
                 .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
-        final ArrayAdapter<Account> accountAdapter =
-            new ArrayAdapter<Account>(context, android.R.layout.simple_list_item_2,
+        final ArrayAdapter<AccountWithDataSet> accountAdapter =
+            new ArrayAdapter<AccountWithDataSet>(context, android.R.layout.simple_list_item_2,
                     writableAccountList) {
 
             @Override
@@ -117,8 +118,9 @@
                 final TextView text2 =
                         (TextView)convertView.findViewById(android.R.id.text2);
 
-                final Account account = this.getItem(position);
-                final AccountType accountType = accountTypes.getAccountType(account.type);
+                final AccountWithDataSet account = this.getItem(position);
+                final AccountType accountType = accountTypes.getAccountType(
+                        account.type, account.dataSet);
                 final Context context = getContext();
 
                 text1.setText(account.name);
@@ -147,7 +149,7 @@
             .create();
     }
 
-    public static void doImport(Context context, int resId, Account account) {
+    public static void doImport(Context context, int resId, AccountWithDataSet account) {
         switch (resId) {
             case R.string.import_from_sim: {
                 doImportFromSim(context, account);
@@ -160,23 +162,25 @@
         }
     }
 
-    public static void doImportFromSim(Context context, Account account) {
+    public static void doImportFromSim(Context context, AccountWithDataSet account) {
         Intent importIntent = new Intent(Intent.ACTION_VIEW);
         importIntent.setType("vnd.android.cursor.item/sim-contact");
         if (account != null) {
             importIntent.putExtra("account_name", account.name);
             importIntent.putExtra("account_type", account.type);
+            importIntent.putExtra("data_set", account.dataSet);
         }
         importIntent.setClassName("com.android.phone", "com.android.phone.SimContacts");
         context.startActivity(importIntent);
     }
 
-    public static void doImportFromSdCard(Context context, Account account) {
+    public static void doImportFromSdCard(Context context, AccountWithDataSet account) {
         Intent importIntent = new Intent(context,
                 com.android.contacts.vcard.ImportVCardActivity.class);
         if (account != null) {
             importIntent.putExtra("account_name", account.name);
             importIntent.putExtra("account_type", account.type);
+            importIntent.putExtra("data_set", account.dataSet);
         }
 
         if (mVCardShare) {
diff --git a/src/com/android/contacts/util/AccountsListAdapter.java b/src/com/android/contacts/util/AccountsListAdapter.java
index 5448d1d..d065255 100644
--- a/src/com/android/contacts/util/AccountsListAdapter.java
+++ b/src/com/android/contacts/util/AccountsListAdapter.java
@@ -19,8 +19,8 @@
 import com.android.contacts.R;
 import com.android.contacts.model.AccountType;
 import com.android.contacts.model.AccountTypeManager;
+import com.android.contacts.model.AccountWithDataSet;
 
-import android.accounts.Account;
 import android.content.Context;
 import android.text.TextUtils.TruncateAt;
 import android.view.LayoutInflater;
@@ -38,7 +38,7 @@
  */
 public final class AccountsListAdapter extends BaseAdapter {
     private final LayoutInflater mInflater;
-    private final List<Account> mAccounts;
+    private final List<AccountWithDataSet> mAccounts;
     private final AccountTypeManager mAccountTypes;
     private final Context mContext;
 
@@ -51,11 +51,11 @@
      * first in the list. Can be null.
      */
     public AccountsListAdapter(Context context, boolean writableOnly,
-            Account currentAccount) {
+            AccountWithDataSet currentAccount) {
         mContext = context;
         mAccountTypes = AccountTypeManager.getInstance(context);
         // We don't want possible side-effect toward AccountTypeManager
-        mAccounts = new ArrayList<Account>(mAccountTypes.getAccounts(writableOnly));
+        mAccounts = new ArrayList<AccountWithDataSet>(mAccountTypes.getAccounts(writableOnly));
         if (currentAccount != null
                 && !mAccounts.isEmpty()
                 && !mAccounts.get(0).equals(currentAccount)
@@ -74,8 +74,8 @@
         final TextView text2 = (TextView)resultView.findViewById(android.R.id.text2);
         final ImageView icon = (ImageView)resultView.findViewById(android.R.id.icon);
 
-        final Account account = mAccounts.get(position);
-        final AccountType accountType = mAccountTypes.getAccountType(account.type);
+        final AccountWithDataSet account = mAccounts.get(position);
+        final AccountType accountType = mAccountTypes.getAccountType(account.type, account.dataSet);
 
         text1.setText(account.name);
 
@@ -94,7 +94,7 @@
     }
 
     @Override
-    public Account getItem(int position) {
+    public AccountWithDataSet getItem(int position) {
         return mAccounts.get(position);
     }
 
diff --git a/src/com/android/contacts/util/Constants.java b/src/com/android/contacts/util/Constants.java
index 2457600..a8ba059 100644
--- a/src/com/android/contacts/util/Constants.java
+++ b/src/com/android/contacts/util/Constants.java
@@ -16,15 +16,7 @@
 
 package com.android.contacts.util;
 
-import android.provider.ContactsContract.CommonDataKinds.Phone;
-
 public class Constants {
-    /**
-     * Specific MIME-type for {@link Phone#CONTENT_ITEM_TYPE} entries that
-     * distinguishes actions that should initiate a text message.
-     */
-    public static final String MIME_TYPE_SMS_ADDRESS = "vnd.android.cursor.item/sms-address";
-
     public static final String MIME_TYPE_VIDEO_CHAT = "vnd.android.cursor.item/video-chat-address";
 
     public static final String SCHEME_TEL = "tel";
@@ -32,5 +24,4 @@
     public static final String SCHEME_MAILTO = "mailto";
     public static final String SCHEME_IMTO = "imto";
     public static final String SCHEME_SIP = "sip";
-
 }
diff --git a/src/com/android/contacts/vcard/ImportVCardActivity.java b/src/com/android/contacts/vcard/ImportVCardActivity.java
index 0b84440..28b8540 100644
--- a/src/com/android/contacts/vcard/ImportVCardActivity.java
+++ b/src/com/android/contacts/vcard/ImportVCardActivity.java
@@ -19,6 +19,7 @@
 import com.android.contacts.ContactsActivity;
 import com.android.contacts.R;
 import com.android.contacts.model.AccountTypeManager;
+import com.android.contacts.model.AccountWithDataSet;
 import com.android.contacts.util.AccountSelectionUtil;
 import com.android.vcard.VCardEntryCounter;
 import com.android.vcard.VCardParser;
@@ -29,7 +30,6 @@
 import com.android.vcard.exception.VCardNestedException;
 import com.android.vcard.exception.VCardVersionException;
 
-import android.accounts.Account;
 import android.app.Activity;
 import android.app.AlertDialog;
 import android.app.Dialog;
@@ -118,7 +118,7 @@
 
     private AccountSelectionUtil.AccountSelectedListener mAccountSelectionListener;
 
-    private Account mAccount;
+    private AccountWithDataSet mAccount;
 
     private ProgressDialog mProgressDialogForScanVCard;
     private ProgressDialog mProgressDialogForCachingVCard;
@@ -839,19 +839,21 @@
 
         String accountName = null;
         String accountType = null;
+        String dataSet = null;
         final Intent intent = getIntent();
         if (intent != null) {
             accountName = intent.getStringExtra(SelectAccountActivity.ACCOUNT_NAME);
             accountType = intent.getStringExtra(SelectAccountActivity.ACCOUNT_TYPE);
+            dataSet = intent.getStringExtra(SelectAccountActivity.DATA_SET);
         } else {
             Log.e(LOG_TAG, "intent does not exist");
         }
 
         if (!TextUtils.isEmpty(accountName) && !TextUtils.isEmpty(accountType)) {
-            mAccount = new Account(accountName, accountType);
+            mAccount = new AccountWithDataSet(accountName, accountType, dataSet);
         } else {
             final AccountTypeManager accountTypes = AccountTypeManager.getInstance(this);
-            final List<Account> accountList = accountTypes.getAccounts(true);
+            final List<AccountWithDataSet> accountList = accountTypes.getAccounts(true);
             if (accountList.size() == 0) {
                 mAccount = null;
             } else if (accountList.size() == 1) {
@@ -870,9 +872,10 @@
     public void onActivityResult(int requestCode, int resultCode, Intent intent) {
         if (requestCode == SELECT_ACCOUNT) {
             if (resultCode == RESULT_OK) {
-                mAccount = new Account(
+                mAccount = new AccountWithDataSet(
                         intent.getStringExtra(SelectAccountActivity.ACCOUNT_NAME),
-                        intent.getStringExtra(SelectAccountActivity.ACCOUNT_TYPE));
+                        intent.getStringExtra(SelectAccountActivity.ACCOUNT_TYPE),
+                        intent.getStringExtra(SelectAccountActivity.DATA_SET));
                 startImport();
             } else {
                 if (resultCode != RESULT_CANCELED) {
diff --git a/src/com/android/contacts/vcard/SelectAccountActivity.java b/src/com/android/contacts/vcard/SelectAccountActivity.java
index 5f8aa28..f27331e 100644
--- a/src/com/android/contacts/vcard/SelectAccountActivity.java
+++ b/src/com/android/contacts/vcard/SelectAccountActivity.java
@@ -18,9 +18,9 @@
 import com.android.contacts.ContactsActivity;
 import com.android.contacts.R;
 import com.android.contacts.model.AccountTypeManager;
+import com.android.contacts.model.AccountWithDataSet;
 import com.android.contacts.util.AccountSelectionUtil;
 
-import android.accounts.Account;
 import android.app.Dialog;
 import android.content.DialogInterface;
 import android.content.Intent;
@@ -34,6 +34,7 @@
 
     public static final String ACCOUNT_NAME = "account_name";
     public static final String ACCOUNT_TYPE = "account_type";
+    public static final String DATA_SET = "data_set";
 
     private class CancelListener
             implements DialogInterface.OnClickListener, DialogInterface.OnCancelListener {
@@ -57,16 +58,17 @@
         // - no account -> use phone-local storage without asking the user
         final int resId = R.string.import_from_sdcard;
         final AccountTypeManager accountTypes = AccountTypeManager.getInstance(this);
-        final List<Account> accountList = accountTypes.getAccounts(true);
+        final List<AccountWithDataSet> accountList = accountTypes.getAccounts(true);
         if (accountList.size() == 0) {
             Log.w(LOG_TAG, "Account does not exist");
             finish();
             return;
         } else if (accountList.size() == 1) {
-            final Account account = accountList.get(0);
+            final AccountWithDataSet account = accountList.get(0);
             final Intent intent = new Intent();
             intent.putExtra(ACCOUNT_NAME, account.name);
             intent.putExtra(ACCOUNT_TYPE, account.type);
+            intent.putExtra(DATA_SET, account.dataSet);
             setResult(RESULT_OK, intent);
             finish();
             return;
@@ -81,10 +83,11 @@
                     @Override
                     public void onClick(DialogInterface dialog, int which) {
                         dialog.dismiss();
-                        final Account account = mAccountList.get(which);
+                        final AccountWithDataSet account = mAccountList.get(which);
                         final Intent intent = new Intent();
                         intent.putExtra(ACCOUNT_NAME, account.name);
                         intent.putExtra(ACCOUNT_TYPE, account.type);
+                        intent.putExtra(DATA_SET, account.dataSet);
                         setResult(RESULT_OK, intent);
                         finish();
                     }
diff --git a/tests/res/layout/quick_contact_tests.xml b/tests/res/layout/quick_contact_tests.xml
index fb2d518..aa0648e 100644
--- a/tests/res/layout/quick_contact_tests.xml
+++ b/tests/res/layout/quick_contact_tests.xml
@@ -29,19 +29,19 @@
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             style="?android:attr/quickContactBadgeStyleWindowSmall"
-            android:layout_marginLeft="32dip" />
+            android:layout_marginLeft="4dip" />
         <QuickContactBadge
             android:id="@+id/medium_badge1"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             style="?android:attr/quickContactBadgeStyleWindowMedium"
-            android:layout_marginLeft="64dip" />
+            android:layout_marginLeft="4dip" />
         <QuickContactBadge
             android:id="@+id/large_badge1"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             style="?android:attr/quickContactBadgeStyleWindowLarge"
-            android:layout_marginLeft="64dip" />
+            android:layout_marginLeft="4dip" />
     </LinearLayout>
     <View
         android:layout_width="match_parent"
@@ -77,19 +77,19 @@
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             style="?android:attr/quickContactBadgeStyleSmallWindowSmall"
-            android:layout_marginLeft="32dip" />
+            android:layout_marginLeft="4dip" />
         <QuickContactBadge
             android:id="@+id/medium_badge2"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             style="?android:attr/quickContactBadgeStyleSmallWindowMedium"
-            android:layout_marginLeft="64dip" />
+            android:layout_marginLeft="4dip" />
         <QuickContactBadge
             android:id="@+id/large_badge2"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             style="?android:attr/quickContactBadgeStyleSmallWindowLarge"
-            android:layout_marginLeft="64dip" />
+            android:layout_marginLeft="4dip" />
     </LinearLayout>
 </LinearLayout>
 
diff --git a/tests/src/com/android/contacts/ContactLoaderTest.java b/tests/src/com/android/contacts/ContactLoaderTest.java
index 3d0ddb4..ac691bc 100644
--- a/tests/src/com/android/contacts/ContactLoaderTest.java
+++ b/tests/src/com/android/contacts/ContactLoaderTest.java
@@ -276,9 +276,10 @@
                         Contacts.Entity.CONTACT_ID,
                         Contacts.Entity.RAW_CONTACT_ID,
 
-                        RawContacts.ACCOUNT_NAME, RawContacts.ACCOUNT_TYPE, RawContacts.DIRTY,
-                        RawContacts.VERSION, RawContacts.SOURCE_ID, RawContacts.SYNC1,
-                        RawContacts.SYNC2, RawContacts.SYNC3, RawContacts.SYNC4,
+                        RawContacts.ACCOUNT_NAME, RawContacts.ACCOUNT_TYPE,
+                        RawContacts.DATA_SET, RawContacts.ACCOUNT_TYPE_AND_DATA_SET,
+                        RawContacts.DIRTY, RawContacts.VERSION, RawContacts.SOURCE_ID,
+                        RawContacts.SYNC1, RawContacts.SYNC2, RawContacts.SYNC3, RawContacts.SYNC4,
                         RawContacts.DELETED, RawContacts.NAME_VERIFIED,
 
                         Contacts.Entity.DATA_ID,
@@ -312,9 +313,9 @@
                         contactId,
                         rawContactId,
 
-                        "mockAccountName", "mockAccountType", 0,
-                        1, 0, "sync1",
-                        "sync2", "sync3", "sync4",
+                        "mockAccountName", "mockAccountType", null, "mockAccountType",
+                        0, 1, 0,
+                        "sync1", "sync2", "sync3", "sync4",
                         0, 0,
 
                         dataId,
diff --git a/tests/src/com/android/contacts/activities/PeopleActivityTest.java b/tests/src/com/android/contacts/activities/PeopleActivityTest.java
index 43158e5..8cef001 100644
--- a/tests/src/com/android/contacts/activities/PeopleActivityTest.java
+++ b/tests/src/com/android/contacts/activities/PeopleActivityTest.java
@@ -24,6 +24,7 @@
 import com.android.contacts.list.ContactBrowseListFragment;
 import com.android.contacts.model.AccountType;
 import com.android.contacts.model.AccountTypeManager;
+import com.android.contacts.model.AccountWithDataSet;
 import com.android.contacts.model.BaseAccountType;
 import com.android.contacts.test.InjectedServices;
 import com.android.contacts.tests.mocks.ContactsMockContext;
@@ -34,7 +35,6 @@
 import com.android.contacts.tests.mocks.MockSharedPreferences;
 import com.android.contacts.util.PhoneCapabilityTester;
 
-import android.accounts.Account;
 import android.content.ContentValues;
 import android.content.Intent;
 import android.content.Loader;
@@ -94,11 +94,11 @@
         AccountType accountType = new BaseAccountType();
         accountType.accountType = TEST_ACCOUNT_TYPE;
 
-        Account account = new Account(TEST_ACCOUNT, TEST_ACCOUNT_TYPE);
+        AccountWithDataSet account = new AccountWithDataSet(TEST_ACCOUNT, TEST_ACCOUNT_TYPE, null);
 
         services.setSystemService(AccountTypeManager.ACCOUNT_TYPE_SERVICE,
                 new MockAccountTypeManager(
-                        new AccountType[] { accountType }, new Account[] { account }));
+                        new AccountType[] { accountType }, new AccountWithDataSet[] { account }));
         ContactsApplication.injectServices(services);
     }
 
diff --git a/tests/src/com/android/contacts/interactions/ContactDeletionInteractionTest.java b/tests/src/com/android/contacts/interactions/ContactDeletionInteractionTest.java
index fc3545b..67bf725 100644
--- a/tests/src/com/android/contacts/interactions/ContactDeletionInteractionTest.java
+++ b/tests/src/com/android/contacts/interactions/ContactDeletionInteractionTest.java
@@ -130,7 +130,8 @@
 
     private Query expectQuery() {
         return mContactsProvider.expectQuery(ENTITY_URI).withProjection(
-                Entity.RAW_CONTACT_ID, Entity.ACCOUNT_TYPE, Entity.CONTACT_ID, Entity.LOOKUP_KEY);
+                Entity.RAW_CONTACT_ID, Entity.ACCOUNT_TYPE, Entity.DATA_SET, Entity.CONTACT_ID,
+                Entity.LOOKUP_KEY);
     }
 
     private void assertWithMessageId(int messageId) {
diff --git a/tests/src/com/android/contacts/interactions/PhoneNumberInteractionTest.java b/tests/src/com/android/contacts/interactions/PhoneNumberInteractionTest.java
index d0e50c4..d70cb44 100644
--- a/tests/src/com/android/contacts/interactions/PhoneNumberInteractionTest.java
+++ b/tests/src/com/android/contacts/interactions/PhoneNumberInteractionTest.java
@@ -222,6 +222,7 @@
                         Phone.NUMBER,
                         Phone.IS_SUPER_PRIMARY,
                         RawContacts.ACCOUNT_TYPE,
+                        RawContacts.DATA_SET,
                         Phone.TYPE,
                         Phone.LABEL)
                 .withSelection("mimetype='vnd.android.cursor.item/phone_v2' AND data1 NOT NULL");
diff --git a/tests/src/com/android/contacts/model/AccountTypeManagerTest.java b/tests/src/com/android/contacts/model/AccountTypeManagerTest.java
index e5cf080..27b3e90 100644
--- a/tests/src/com/android/contacts/model/AccountTypeManagerTest.java
+++ b/tests/src/com/android/contacts/model/AccountTypeManagerTest.java
@@ -19,13 +19,12 @@
 import com.google.android.collect.Lists;
 import com.google.android.collect.Maps;
 
-import android.accounts.Account;
 import android.content.Context;
 import android.test.AndroidTestCase;
 
-import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -45,10 +44,10 @@
         final AccountType typeD = new MockAccountType("typeD", "d");
 
         // Define users
-        final Account accountA1 = new Account("a1", typeA.accountType);
-        final Account accountC1 = new Account("c1", typeC.accountType);
-        final Account accountC2 = new Account("c2", typeC.accountType);
-        final Account accountD1 = new Account("d1", typeD.accountType);
+        final AccountWithDataSet accountA1 = new AccountWithDataSet("a1", typeA.accountType, null);
+        final AccountWithDataSet accountC1 = new AccountWithDataSet("c1", typeC.accountType, null);
+        final AccountWithDataSet accountC2 = new AccountWithDataSet("c2", typeC.accountType, null);
+        final AccountWithDataSet accountD1 = new AccountWithDataSet("d1", typeD.accountType, null);
 
         // empty - empty
         Map<String, AccountType> types = AccountTypeManagerImpl.findInvitableAccountTypes(c,
@@ -133,11 +132,11 @@
     }
 
     /**
-     * Array of {@link Account} -> {@link Collection}
+     * Array of {@link AccountWithDataSet} -> {@link Collection}
      */
-    private static Collection<Account> buildAccounts(Account... accounts) {
-        final ArrayList<Account> result = Lists.newArrayList();
-        for (Account account : accounts) {
+    private static Collection<AccountWithDataSet> buildAccounts(AccountWithDataSet... accounts) {
+        final List<AccountWithDataSet> result = Lists.newArrayList();
+        for (AccountWithDataSet account : accounts) {
             result.add(account);
         }
         return result;
@@ -147,13 +146,13 @@
      * Executes {@link AccountTypeManagerImpl#findInvitableAccountTypes} and verifies the
      * result.
      */
-    private void verifyAccountTypes(Collection<Account> accounts,
+    private void verifyAccountTypes(Collection<AccountWithDataSet> accounts,
             Map<String, AccountType> types, AccountType... expectedTypes) {
         Map<String, AccountType> result = AccountTypeManagerImpl.findInvitableAccountTypes(
                 getContext(), accounts, types);
         for (AccountType type : expectedTypes) {
-            if (!result.containsKey(type.accountType)) {
-                fail("Result doesn't contain type=" + type.accountType);
+            if (!result.containsKey(type.getAccountTypeAndDataSet())) {
+                fail("Result doesn't contain type=" + type.getAccountTypeAndDataSet());
             }
         }
     }
diff --git a/tests/src/com/android/contacts/tests/allintents/AllIntentsActivity.java b/tests/src/com/android/contacts/tests/allintents/AllIntentsActivity.java
index e5e6a1c..97816c2 100644
--- a/tests/src/com/android/contacts/tests/allintents/AllIntentsActivity.java
+++ b/tests/src/com/android/contacts/tests/allintents/AllIntentsActivity.java
@@ -16,10 +16,10 @@
 
 package com.android.contacts.tests.allintents;
 
+import com.android.contacts.model.AccountWithDataSet;
 import com.android.contacts.tests.R;
 import com.google.android.collect.Lists;
 
-import android.accounts.Account;
 import android.app.ListActivity;
 import android.app.SearchManager;
 import android.content.ComponentName;
@@ -625,11 +625,12 @@
     }
 
     @Override
-    public void onAccountChosen(Account account, int tag) {
+    public void onAccountChosen(AccountWithDataSet account, int tag) {
         switch (ContactsIntent.get(tag)) {
             case EDIT_NEW_CONTACT_FOR_ACCOUNT: {
                 final Intent intent = new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI);
                 intent.putExtra(Insert.ACCOUNT, account);
+                intent.putExtra(Insert.DATA_SET, account.dataSet);
                 startActivity(intent);
                 break;
             }
@@ -637,6 +638,7 @@
                 final Intent intent = new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI);
 
                 intent.putExtra(Insert.ACCOUNT, account);
+                intent.putExtra(Insert.DATA_SET, account.dataSet);
                 putDataExtra(intent);
 
                 startActivity(intent);
diff --git a/tests/src/com/android/contacts/tests/allintents/SelectAccountDialogFragment.java b/tests/src/com/android/contacts/tests/allintents/SelectAccountDialogFragment.java
index e074a0b..c261553 100644
--- a/tests/src/com/android/contacts/tests/allintents/SelectAccountDialogFragment.java
+++ b/tests/src/com/android/contacts/tests/allintents/SelectAccountDialogFragment.java
@@ -16,8 +16,9 @@
 
 package com.android.contacts.tests.allintents;
 
-import android.accounts.Account;
-import android.accounts.AccountManager;
+import com.android.contacts.model.AccountTypeManager;
+import com.android.contacts.model.AccountWithDataSet;
+
 import android.app.AlertDialog;
 import android.app.Dialog;
 import android.app.DialogFragment;
@@ -29,6 +30,8 @@
 import android.widget.ArrayAdapter;
 import android.widget.TextView;
 
+import java.util.List;
+
 /**
  * Shows a dialog asking the user which account to chose.
  * The result is passed back to the owning Activity
@@ -43,13 +46,15 @@
     public Dialog onCreateDialog(Bundle savedInstanceState) {
         final Bundle parameters = getArguments();
 
-        final Account[] accounts = AccountManager.get(getActivity()).getAccounts();
+        final List<AccountWithDataSet> accounts =
+                AccountTypeManager.getInstance(getActivity()).getAccounts(false);
 
         final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
         final LayoutInflater inflater = LayoutInflater.from(builder.getContext());
 
-        final ArrayAdapter<Account> accountAdapter = new ArrayAdapter<Account>(builder.getContext(),
-                android.R.layout.simple_list_item_2, accounts) {
+        final ArrayAdapter<AccountWithDataSet> accountAdapter =
+                new ArrayAdapter<AccountWithDataSet>(builder.getContext(),
+                        android.R.layout.simple_list_item_2, accounts) {
             @Override
             public View getView(int position, View convertView, ViewGroup parent) {
                 final View resultView = convertView == null
@@ -59,7 +64,7 @@
                 final TextView text1 = (TextView)resultView.findViewById(android.R.id.text1);
                 final TextView text2 = (TextView)resultView.findViewById(android.R.id.text2);
 
-                final Account account = getItem(position);
+                final AccountWithDataSet account = getItem(position);
 
                 text1.setText("Name: " + account.name);
                 text2.setText("Type: " + account.type);
@@ -92,6 +97,6 @@
     }
 
     public interface Listener {
-        void onAccountChosen(Account account, int tag);
+        void onAccountChosen(AccountWithDataSet account, int tag);
     }
 }
diff --git a/tests/src/com/android/contacts/tests/mocks/MockAccountTypeManager.java b/tests/src/com/android/contacts/tests/mocks/MockAccountTypeManager.java
index acfa7f5..e60391e 100644
--- a/tests/src/com/android/contacts/tests/mocks/MockAccountTypeManager.java
+++ b/tests/src/com/android/contacts/tests/mocks/MockAccountTypeManager.java
@@ -17,13 +17,11 @@
 
 import com.android.contacts.model.AccountType;
 import com.android.contacts.model.AccountTypeManager;
+import com.android.contacts.model.AccountWithDataSet;
 import com.google.android.collect.Maps;
 
-import android.accounts.Account;
-
-import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -32,15 +30,15 @@
 public class MockAccountTypeManager extends AccountTypeManager {
 
     private final AccountType[] mTypes;
-    private Account[] mAccounts;
+    private AccountWithDataSet[] mAccounts;
 
-    public MockAccountTypeManager(AccountType[] types, Account[] accounts) {
+    public MockAccountTypeManager(AccountType[] types, AccountWithDataSet[] accounts) {
         this.mTypes = types;
         this.mAccounts = accounts;
     }
 
     @Override
-    public AccountType getAccountType(String accountType) {
+    public AccountType getAccountType(String accountType, String dataSet) {
         for (AccountType type : mTypes) {
             if (accountType.equals(type.accountType)) {
                 return type;
@@ -50,8 +48,8 @@
     }
 
     @Override
-    public ArrayList<Account> getAccounts(boolean writableOnly) {
-        return new ArrayList<Account>(Arrays.asList(mAccounts));
+    public List<AccountWithDataSet> getAccounts(boolean writableOnly) {
+        return Arrays.asList(mAccounts);
     }
 
     @Override
diff --git a/tests/src/com/android/contacts/tests/streamitems/StreamItemPopulatorActivity.java b/tests/src/com/android/contacts/tests/streamitems/StreamItemPopulatorActivity.java
index 5613bc3..c984418 100644
--- a/tests/src/com/android/contacts/tests/streamitems/StreamItemPopulatorActivity.java
+++ b/tests/src/com/android/contacts/tests/streamitems/StreamItemPopulatorActivity.java
@@ -36,7 +36,6 @@
 import android.widget.Button;
 import android.widget.Toast;
 
-import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
@@ -76,6 +75,14 @@
             "the middle of nowhere"
     };
 
+    private String[] commentStrings = new String[]{
+            "3 retweets",
+            "5 shares",
+            "4 likes",
+            "4 +1s",
+            "<i>24567</i> <font color='blue' size='+1'><b>likes</b></font>"
+    };
+
     // Photos to randomly select from.
     private Integer[] imageIds = new Integer[]{
             R.drawable.android,
@@ -87,6 +94,14 @@
             R.drawable.whiskey
     };
 
+    // Only some photos have actions.
+    private String[] imageStrings = new String[]{
+            "android",
+            "goldengate",
+            "iceland",
+            "japan",
+    };
+
     // The contact ID that was picked.
     private long mContactId = -1;
 
@@ -139,6 +154,7 @@
             long rawContactId = -1;
             String accountType = null;
             String accountName = null;
+            String dataSet = null;
 
             // Lookup the com.google raw contact for the contact.
             Cursor c = getContentResolver().query(RawContacts.CONTENT_URI,
@@ -226,28 +242,53 @@
     }
 
     private ContentValues buildStreamItemValues(String accountType, String accountName) {
+        boolean includeComments = randInt(100) < 30;
+        boolean includeAction = randInt(100) < 30;
         ContentValues values = new ContentValues();
+        String place = pickRandom(placeNames);
         values.put(StreamItems.TEXT,
-                String.format(pickRandom(snippetStrings), pickRandom(placeNames)));
-        values.put(StreamItems.COMMENTS, "");
+                String.format(pickRandom(snippetStrings) , place)
+                + (includeComments ? " [c]" : "")
+                + (includeAction ? " [a]" : ""));
+        if (includeComments) {
+            values.put(StreamItems.COMMENTS, pickRandom(commentStrings));
+        } else {
+            values.put(StreamItems.COMMENTS, "");
+        }
         // Set the timestamp to some point in the past.
         values.put(StreamItems.TIMESTAMP,
                 System.currentTimeMillis() - randInt(360000000));
         values.put(RawContacts.ACCOUNT_TYPE, accountType);
         values.put(RawContacts.ACCOUNT_NAME, accountName);
+        if (includeAction) {
+            values.put(StreamItems.ACTION, Intent.ACTION_VIEW);
+            values.put(StreamItems.ACTION_URI, getGoogleSearchUri(place));
+        }
         return values;
     }
 
     private ContentValues buildStreamItemPhotoValues(int index, String accountType,
             String accountName) {
+        Integer imageIndex = pickRandom(imageIds);
         ContentValues values = new ContentValues();
         values.put(StreamItemPhotos.SORT_INDEX, index);
-        values.put(StreamItemPhotos.PHOTO, loadPhotoFromResource(pickRandom(imageIds)));
+        values.put(StreamItemPhotos.PHOTO, loadPhotoFromResource(imageIndex));
         values.put(RawContacts.ACCOUNT_TYPE, accountType);
         values.put(RawContacts.ACCOUNT_NAME, accountName);
+        if (imageIndex < imageStrings.length) {
+            values.put(StreamItemPhotos.ACTION, Intent.ACTION_VIEW);
+            String queryTerm = imageStrings[imageIndex];
+            values.put(StreamItemPhotos.ACTION_URI, getGoogleSearchUri(queryTerm));
+
+        }
         return values;
     }
 
+    /** Returns the URI of the Google search results page for the given query. */
+    private String getGoogleSearchUri(String query) {
+        return "http://www.google.com/search?q=" + query.replace(" ", "+");
+    }
+
     private <T> T pickRandom(T[] from) {
         return from[randInt(from.length)];
     }
