diff --git a/proguard.flags b/proguard.flags
index 39784b1..3991a14 100644
--- a/proguard.flags
+++ b/proguard.flags
@@ -10,10 +10,10 @@
 }
 
 # Any class or method annotated with NeededForTesting or NeededForReflection.
--keep @com.android.contacts.test.NeededForTesting class *
+-keep @com.android.contacts.common.test.NeededForTesting class *
 -keep @com.android.contacts.test.NeededForReflection class *
 -keepclassmembers class * {
-@com.android.contacts.test.NeededForTesting *;
+@com.android.contacts.common.test.NeededForTesting *;
 @com.android.contacts.test.NeededForReflection *;
 }
 
diff --git a/res/drawable-hdpi/ic_menu_remove_field_holo_light.png b/res/drawable-hdpi/ic_menu_remove_field_holo_light.png
deleted file mode 100644
index 03fd2fb..0000000
--- a/res/drawable-hdpi/ic_menu_remove_field_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_text_holo_light.png b/res/drawable-hdpi/ic_text_holo_light.png
deleted file mode 100644
index 01af189..0000000
--- a/res/drawable-hdpi/ic_text_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_menu_remove_field_holo_light.png b/res/drawable-mdpi/ic_menu_remove_field_holo_light.png
deleted file mode 100644
index 8c44e70..0000000
--- a/res/drawable-mdpi/ic_menu_remove_field_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_text_holo_light.png b/res/drawable-mdpi/ic_text_holo_light.png
deleted file mode 100644
index 76dae05..0000000
--- a/res/drawable-mdpi/ic_text_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_menu_remove_field_holo_light.png b/res/drawable-xhdpi/ic_menu_remove_field_holo_light.png
deleted file mode 100644
index 65a6b7b..0000000
--- a/res/drawable-xhdpi/ic_menu_remove_field_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_text_holo_light.png b/res/drawable-xhdpi/ic_text_holo_light.png
deleted file mode 100644
index 6fb8e92..0000000
--- a/res/drawable-xhdpi/ic_text_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/layout-sw580dp/text_fields_editor_view.xml b/res/layout-sw580dp/text_fields_editor_view.xml
deleted file mode 100644
index 89970c6..0000000
--- a/res/layout-sw580dp/text_fields_editor_view.xml
+++ /dev/null
@@ -1,53 +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.
--->
-
-<com.android.contacts.editor.TextFieldsEditorView
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:orientation="vertical">
-
-    <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_weight="1"
-        android:orientation="horizontal"
-        android:gravity="center_vertical"
-        android:focusable="true"
-        android:clickable="true">
-
-        <include
-            android:id="@+id/editors"
-            layout="@layout/edit_field_list" />
-
-        <include
-            android:id="@+id/expansion_view_container"
-            layout="@layout/edit_expansion_view"
-            android:visibility="gone" />
-
-        <include
-            android:id="@+id/spinner"
-            layout="@layout/edit_spinner"
-            android:visibility="gone" />
-
-        <include
-            android:id="@+id/delete_button_container"
-            layout="@layout/edit_delete_button"
-            android:visibility="gone" />
-
-    </LinearLayout>
-
-</com.android.contacts.editor.TextFieldsEditorView>
diff --git a/res/layout/edit_date_picker.xml b/res/layout/edit_date_picker.xml
deleted file mode 100644
index 1d0d0b6..0000000
--- a/res/layout/edit_date_picker.xml
+++ /dev/null
@@ -1,30 +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.
--->
-
-<!-- Button to select a date in the contact editor. -->
-
-<Button
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/date_view"
-    style="?android:attr/spinnerStyle"
-    android:layout_width="0dip"
-    android:layout_height="@dimen/editor_min_line_item_height"
-    android:layout_weight="1"
-    android:gravity="center_vertical"
-    android:layout_marginLeft="@dimen/editor_field_left_padding"
-    android:layout_marginRight="@dimen/editor_field_right_padding"
-    android:textAppearance="?android:attr/textAppearanceMedium"
-    android:paddingLeft="12dip" />
\ No newline at end of file
diff --git a/res/layout/edit_delete_button.xml b/res/layout/edit_delete_button.xml
deleted file mode 100644
index 9a9a377..0000000
--- a/res/layout/edit_delete_button.xml
+++ /dev/null
@@ -1,38 +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.
--->
-
-<!-- "Delete field" button in the contact editor. -->
-
-<FrameLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="wrap_content"
-    android:layout_height="@dimen/editor_min_line_item_height"
-    android:layout_marginRight="2dip"
-    android:layout_gravity="bottom">
-    <ImageView
-        android:id="@+id/delete_button"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_gravity="center"
-        android:duplicateParentState="true"
-        android:background="?android:attr/selectableItemBackground"
-        android:src="@drawable/ic_menu_remove_field_holo_light"
-        android:paddingLeft="@dimen/editor_round_button_padding_left"
-        android:paddingRight="@dimen/editor_round_button_padding_right"
-        android:paddingTop="@dimen/editor_round_button_padding_top"
-        android:paddingBottom="@dimen/editor_round_button_padding_bottom"
-        android:contentDescription="@string/description_minus_button" />
-</FrameLayout>
\ No newline at end of file
diff --git a/res/layout/edit_expansion_view.xml b/res/layout/edit_expansion_view.xml
deleted file mode 100644
index 06d809c..0000000
--- a/res/layout/edit_expansion_view.xml
+++ /dev/null
@@ -1,35 +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.
--->
-
-<!-- "More" or "less" expansion button in the contact editor. -->
-
-<FrameLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="wrap_content"
-    android:layout_height="@dimen/editor_min_line_item_height"
-    android:layout_gravity="top">
-    <ImageView
-        android:id="@+id/expansion_view"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_gravity="center"
-        android:duplicateParentState="true"
-        android:background="?android:attr/selectableItemBackground"
-        android:paddingLeft="@dimen/editor_round_button_padding_left"
-        android:paddingRight="@dimen/editor_round_button_padding_right"
-        android:paddingTop="@dimen/editor_round_button_padding_top"
-        android:paddingBottom="@dimen/editor_round_button_padding_bottom" />
-</FrameLayout>
\ No newline at end of file
diff --git a/res/layout/edit_field_list.xml b/res/layout/edit_field_list.xml
deleted file mode 100644
index d46828b..0000000
--- a/res/layout/edit_field_list.xml
+++ /dev/null
@@ -1,26 +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.
--->
-
-<!-- Layout to contain a list of fields in the contact editor. -->
-
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/editors"
-    android:layout_width="0dip"
-    android:layout_weight="1"
-    android:layout_height="wrap_content"
-    android:paddingLeft="@dimen/editor_field_left_padding"
-    android:orientation="vertical" />
diff --git a/res/layout/edit_field_list_with_anchor_view.xml b/res/layout/edit_field_list_with_anchor_view.xml
deleted file mode 100644
index fa69a5c..0000000
--- a/res/layout/edit_field_list_with_anchor_view.xml
+++ /dev/null
@@ -1,35 +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.
--->
-
-<!-- Layout that behaves similarly to edit_field_list.xml,
-     but also has an anchor view for ListPopupWindow -->
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="0dip"
-    android:layout_height="wrap_content"
-    android:layout_weight="1"
-    android:paddingLeft="@dimen/editor_field_left_padding"
-    android:orientation="vertical">
-    <LinearLayout
-         android:id="@+id/editors"
-         android:layout_width="match_parent"
-         android:layout_height="wrap_content"
-         android:orientation="vertical" />
-    <View
-         android:id="@+id/anchor_view"
-         android:layout_width="match_parent"
-         android:layout_height="0px" />
-</LinearLayout>
diff --git a/res/layout/edit_spinner.xml b/res/layout/edit_spinner.xml
deleted file mode 100644
index 99764da..0000000
--- a/res/layout/edit_spinner.xml
+++ /dev/null
@@ -1,27 +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.
--->
-
-<!-- Spinner for a field in the contact editor. -->
-
-<!-- Note: explicitly override the default left and right padding on spinner -->
-<Spinner
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/spinner"
-    android:layout_gravity="bottom"
-    android:layout_width="@dimen/editor_type_label_width"
-    android:layout_height="@dimen/editor_min_line_item_height"
-    android:paddingLeft="0dip"
-    android:paddingRight="10dip"/>
\ No newline at end of file
diff --git a/res/layout/event_field_editor_view.xml b/res/layout/event_field_editor_view.xml
deleted file mode 100644
index 560b9e1..0000000
--- a/res/layout/event_field_editor_view.xml
+++ /dev/null
@@ -1,54 +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.
--->
-
-<!-- Editor for a single event entry in the contact editor -->
-
-<com.android.contacts.editor.EventFieldEditorView
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="@dimen/editor_min_line_item_height"
-    android:orientation="vertical">
-
-    <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_weight="1"
-        android:orientation="horizontal"
-        android:gravity="center_vertical"
-        android:focusable="true"
-        android:clickable="true">
-
-        <include
-            android:id="@+id/date_view"
-            layout="@layout/edit_date_picker" />
-
-        <Spinner
-            android:id="@+id/spinner"
-            android:layout_width="@dimen/editor_type_label_width"
-            android:layout_height="match_parent"
-            android:layout_gravity="bottom"
-            android:paddingLeft="0dip"
-            android:paddingRight="10dip"
-            android:visibility="gone"/>
-
-        <include
-            android:id="@+id/delete_button_container"
-            layout="@layout/edit_delete_button"
-            android:visibility="gone" />
-
-    </LinearLayout>
-
-</com.android.contacts.editor.EventFieldEditorView>
diff --git a/res/layout/name_edit_expansion_view.xml b/res/layout/name_edit_expansion_view.xml
deleted file mode 100644
index 17ae263..0000000
--- a/res/layout/name_edit_expansion_view.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2012 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.
--->
-
-<!-- "More" or "less" expansion button in the contact editor. -->
-
-<FrameLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="wrap_content"
-    android:layout_height="@dimen/editor_min_line_item_height"
-    android:layout_gravity="top"
-    android:contentDescription="@string/expand_collapse_name_fields_description"
-    android:importantForAccessibility="yes">
-    <ImageView
-        android:id="@+id/expansion_view"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_gravity="center"
-        android:duplicateParentState="true"
-        android:background="?android:attr/selectableItemBackground"
-        android:paddingLeft="@dimen/editor_round_button_padding_left"
-        android:paddingRight="@dimen/editor_round_button_padding_right"
-        android:paddingTop="@dimen/editor_round_button_padding_top"
-        android:paddingBottom="@dimen/editor_round_button_padding_bottom" />
-</FrameLayout>
diff --git a/res/layout/phonetic_name_editor_view.xml b/res/layout/phonetic_name_editor_view.xml
deleted file mode 100644
index 3b7562b..0000000
--- a/res/layout/phonetic_name_editor_view.xml
+++ /dev/null
@@ -1,53 +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.
--->
-
-<com.android.contacts.editor.PhoneticNameEditorView
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:minHeight="@dimen/editor_min_line_item_height"
-    android:orientation="vertical">
-
-    <include
-        android:id="@+id/spinner"
-        layout="@layout/edit_spinner"
-        android:visibility="gone" />
-
-    <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:orientation="horizontal"
-        android:gravity="center_vertical"
-        android:focusable="true"
-        android:clickable="true">
-
-        <include
-            android:id="@+id/editors"
-            layout="@layout/edit_field_list" />
-
-        <include
-            android:id="@+id/expansion_view_container"
-            layout="@layout/name_edit_expansion_view"
-            android:visibility="gone" />
-
-        <include
-            android:id="@+id/delete_button_container"
-            layout="@layout/edit_delete_button"
-            android:visibility="gone" />
-
-    </LinearLayout>
-
-</com.android.contacts.editor.PhoneticNameEditorView>
diff --git a/res/layout/structured_name_editor_view.xml b/res/layout/structured_name_editor_view.xml
deleted file mode 100644
index d1eace8..0000000
--- a/res/layout/structured_name_editor_view.xml
+++ /dev/null
@@ -1,51 +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.
--->
-
-<com.android.contacts.editor.StructuredNameEditorView
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:minHeight="@dimen/editor_min_line_item_height"
-    android:orientation="vertical">
-
-    <include
-        android:id="@+id/spinner"
-        layout="@layout/edit_spinner"
-        android:visibility="gone" />
-
-    <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:orientation="horizontal"
-        android:focusable="true"
-        android:clickable="true">
-
-        <include
-            layout="@layout/edit_field_list_with_anchor_view" />
-
-        <include
-            android:id="@+id/expansion_view_container"
-            layout="@layout/name_edit_expansion_view"
-            android:visibility="gone" />
-
-        <include
-            android:id="@+id/delete_button_container"
-            layout="@layout/edit_delete_button"
-            android:visibility="gone" />
-
-    </LinearLayout>
-
-</com.android.contacts.editor.StructuredNameEditorView>
diff --git a/res/layout/text_fields_editor_view.xml b/res/layout/text_fields_editor_view.xml
deleted file mode 100644
index f446c24..0000000
--- a/res/layout/text_fields_editor_view.xml
+++ /dev/null
@@ -1,52 +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.
--->
-
-<com.android.contacts.editor.TextFieldsEditorView
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:orientation="vertical">
-
-    <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_weight="1"
-        android:orientation="horizontal"
-        android:gravity="center_vertical"
-        android:focusable="true"
-        android:clickable="true">
-
-        <include
-            layout="@layout/edit_field_list_with_anchor_view" />
-
-        <include
-            android:id="@+id/expansion_view_container"
-            layout="@layout/edit_expansion_view"
-            android:visibility="gone" />
-
-        <include
-            android:id="@+id/spinner"
-            layout="@layout/edit_spinner"
-            android:visibility="gone" />
-
-        <include
-            android:id="@+id/delete_button_container"
-            layout="@layout/edit_delete_button"
-            android:visibility="gone" />
-
-    </LinearLayout>
-
-</com.android.contacts.editor.TextFieldsEditorView>
diff --git a/res/mipmap-hdpi/ic_launcher_contacts.png b/res/mipmap-hdpi/ic_launcher_contacts.png
deleted file mode 100644
index e0136f6..0000000
--- a/res/mipmap-hdpi/ic_launcher_contacts.png
+++ /dev/null
Binary files differ
diff --git a/res/mipmap-mdpi/ic_launcher_contacts.png b/res/mipmap-mdpi/ic_launcher_contacts.png
deleted file mode 100644
index 3d490c3..0000000
--- a/res/mipmap-mdpi/ic_launcher_contacts.png
+++ /dev/null
Binary files differ
diff --git a/res/mipmap-xhdpi/ic_launcher_contacts.png b/res/mipmap-xhdpi/ic_launcher_contacts.png
deleted file mode 100644
index dde3cbb..0000000
--- a/res/mipmap-xhdpi/ic_launcher_contacts.png
+++ /dev/null
Binary files differ
diff --git a/res/mipmap-xxhdpi/ic_launcher_contacts.png b/res/mipmap-xxhdpi/ic_launcher_contacts.png
deleted file mode 100644
index 99b403b..0000000
--- a/res/mipmap-xxhdpi/ic_launcher_contacts.png
+++ /dev/null
Binary files differ
diff --git a/res/values-land/dimens.xml b/res/values-land/dimens.xml
index e72a0ee..4a4cea9 100644
--- a/res/values-land/dimens.xml
+++ b/res/values-land/dimens.xml
@@ -19,5 +19,4 @@
     <dimen name="dialpad_digits_margin_bottom">50dip</dimen>
     <!-- Center vertically -->
     <dimen name="quick_contact_top_position">-1px</dimen>
-    <dimen name="editor_type_label_width">120dip</dimen>
 </resources>
diff --git a/res/values-sw580dp/dimens.xml b/res/values-sw580dp/dimens.xml
index e089c5d..d3a9bea 100644
--- a/res/values-sw580dp/dimens.xml
+++ b/res/values-sw580dp/dimens.xml
@@ -15,9 +15,7 @@
 -->
 <resources>
     <dimen name="editor_padding_top">32dip</dimen>
-    <dimen name="editor_type_label_width">122dip</dimen>
-    <dimen name="editor_round_button_padding_left">16dip</dimen>
-    <dimen name="editor_round_button_padding_right">16dip</dimen>
+
     <dimen name="editor_add_field_label_left_padding">16dip</dimen>
     <dimen name="detail_item_vertical_margin">16dip</dimen>
     <dimen name="detail_item_icon_margin">8dip</dimen>
diff --git a/res/values-sw680dp/dimens.xml b/res/values-sw680dp/dimens.xml
index 495526d..6353786 100644
--- a/res/values-sw680dp/dimens.xml
+++ b/res/values-sw680dp/dimens.xml
@@ -14,9 +14,6 @@
      limitations under the License.
 -->
 <resources>
-    <dimen name="editor_type_label_width">180dip</dimen>
-    <dimen name="editor_round_button_padding_left">8dip</dimen>
-    <dimen name="editor_round_button_padding_right">8dip</dimen>
     <dimen name="group_editor_side_padding">16dip</dimen>
     <dimen name="quick_contact_photo_container_height">360dip</dimen>
     <dimen name="contact_picker_contact_list_min_height">650dip</dimen>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 021770b..d22bf64 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -23,27 +23,9 @@
     <!-- Top padding of the entire contact editor  -->
     <dimen name="editor_padding_top">0dip</dimen>
 
-    <!-- Padding of the rounded plus/minus/expand/collapse buttons in the editor  -->
-    <dimen name="editor_round_button_padding_left">8dip</dimen>
-    <dimen name="editor_round_button_padding_right">8dip</dimen>
-    <dimen name="editor_round_button_padding_top">8dip</dimen>
-    <dimen name="editor_round_button_padding_bottom">8dip</dimen>
-
     <!-- Left padding of the label in the add field button for the contact editor -->
     <dimen name="editor_add_field_label_left_padding">16dip</dimen>
 
-    <!-- Width of the Type-Label in the Editor -->
-    <dimen name="editor_type_label_width">100dip</dimen>
-
-    <!-- Left padding of a field in the Editor -->
-    <dimen name="editor_field_left_padding">4dip</dimen>
-
-    <!-- Right padding of a field in the Editor -->
-    <dimen name="editor_field_right_padding">4dip</dimen>
-
-    <!-- Minimum height of a row in the Editor -->
-    <dimen name="editor_min_line_item_height">48dip</dimen>
-
     <!-- Height of the shadow asset under the photo on the contact detail page -->
     <dimen name="detail_contact_photo_shadow_height">10dip</dimen>
 
diff --git a/res/values/donottranslate_config.xml b/res/values/donottranslate_config.xml
index ea1b103..03fb0dc 100644
--- a/res/values/donottranslate_config.xml
+++ b/res/values/donottranslate_config.xml
@@ -69,9 +69,6 @@
      Without this configuration, 00002.vcf becomes the candidate.-->
     <string name="config_export_extensions_to_consider" translatable="false"></string>
 
-    <!-- If true, the order of name fields in the editor is primary (i.e. given name first) -->
-    <bool name="config_editor_field_order_primary">true</bool>
-
     <!-- If true, phonetic name is included in the contact editor by default -->
     <bool name="config_editor_include_phonetic_name">false</bool>
 
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 978d02d..ed0c799 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -193,18 +193,6 @@
     <!-- Menu item to indicate you want to stop editing a contact and NOT save the changes you've made [CHAR LIMIT=12] -->
     <string name="menu_discard">Discard</string>
 
-    <!-- The label describing the Notes field of a contact. This field allows free form text entry about a contact -->
-    <string name="label_notes">Notes</string>
-
-    <!-- The label describing the SIP address field of a contact. [CHAR LIMIT=20] -->
-    <string name="label_sip_address">Internet call</string>
-
-    <!-- Hint text for the organization name when editing -->
-    <string name="ghostData_company">Company</string>
-
-    <!-- Hint text for the organization title when editing -->
-    <string name="ghostData_title">Title</string>
-
     <!-- Message displayed in a toast when you try to view the details of a contact that
          for some reason doesn't exist anymore. [CHAR LIMIT=NONE]-->
     <string name="invalidContactMessage">The contact doesn\'t exist.</string>
@@ -221,18 +209,6 @@
          [CHAR LIMIT=30] -->
     <string name="pickerNewContactText">Create new contact</string>
 
-    <!-- Header that expands to list all of the types of phone numbers when editing or creating a phone number for a contact [CHAR LIMIT=20] -->
-    <string name="phoneLabelsGroup">Phone</string>
-
-    <!-- Header that expands to list all of the types of email addresses when editing or creating an email address for a contact [CHAR LIMIT=20] -->
-    <string name="emailLabelsGroup">Email</string>
-
-    <!-- Header that expands to list all of the types of IM account when editing or creating an IM account for a contact [CHAR LIMIT=20] -->
-    <string name="imLabelsGroup">IM</string>
-
-    <!-- Header that expands to list all of the types of postal addresses when editing or creating an postal address for a contact [CHAR LIMIT=20] -->
-    <string name="postalLabelsGroup">Address</string>
-
     <!-- The order of the items below is important, don't reorder without changing EditContactActivity.java -->
     <skip/>
     <!-- The labels that are under the otherLabelsGroup when editing a contact. [CHAR LIMIT=20] -->
@@ -652,14 +628,6 @@
     -->
     <string name="description_contact_photo">contact photo</string>
 
-    <!-- String describing the Contact Editor Minus button
-
-         Used by AccessibilityService to announce the purpose of the button.
-
-         [CHAR LIMIT=NONE]
-    -->
-    <string name="description_minus_button">delete</string>
-
     <!-- String describing the Contact Editor Plus button
 
          Used by AccessibilityService to announce the purpose of the button.
@@ -944,21 +912,6 @@
     <!-- Toast indicating that sharing a contact has failed. [CHAR LIMIT=NONE]  -->
     <string name="share_error">This contact can\'t be shared.</string>
 
-    <!-- Header that expands to list all name types when editing a structured name of a contact [CHAR LIMIT=20] -->
-    <string name="nameLabelsGroup">Name</string>
-    <!-- Header that expands to list all nickname types when editing a nickname of a contact [CHAR LIMIT=20] -->
-    <string name="nicknameLabelsGroup">Nickname</string>
-    <!-- Header that expands to list all organization types when editing an organization of a contact [CHAR LIMIT=20] -->
-    <string name="organizationLabelsGroup">Organization</string>
-    <!-- Header that expands to list all website types when editing a website of a contact [CHAR LIMIT=20] -->
-    <string name="websiteLabelsGroup">Website</string>
-    <!-- Header that expands to list all event types when editing an event of a contact [CHAR LIMIT=20] -->
-    <string name="eventLabelsGroup">Events</string>
-    <!-- Header for the list of all relationships for a contact [CHAR LIMIT=20] -->
-    <string name="relationLabelsGroup">Relationship</string>
-    <!-- Header for the list of all groups for a contact [CHAR LIMIT=20] -->
-    <string name="groupsLabel">Groups</string>
-
     <string name="dialog_new_contact_account">Create contact under account</string>
 
     <!-- Title for the disambiguation dialog that requests the user choose an account for the new group to be created under [CHAR LIMIT=NONE] -->
@@ -979,103 +932,11 @@
          group that would also cause all ungrouped contacts to stop syncing.  [CHAR LIMIT=NONE] -->
     <string name="display_warn_remove_ungrouped">Removing \"<xliff:g id="group" example="Starred">%s</xliff:g>\" from sync will also remove any ungrouped contacts from sync.</string>
 
-    <!-- Title for data source when creating or editing a contact that doesn't
-         belong to a specific account.  This contact will only exist on the phone
-         and will not be synced. -->
-    <string name="account_phone" product="tablet">Tablet-only, unsynced</string>
-    <!-- Title for data source when creating or editing a contact that doesn't
-         belong to a specific account.  This contact will only exist on the phone
-         and will not be synced. -->
-    <string name="account_phone" product="default">Phone-only, unsynced</string>
-
-    <!-- Generic action string for text messaging a contact. Used by AccessibilityService to announce the purpose of the view. [CHAR LIMIT=NONE] -->
-    <string name="sms">Text message</string>
-
-    <!-- Action string for sending an email to a home email address -->
-    <string name="email_home">Email home</string>
-    <!-- Action string for sending an email to a mobile email address -->
-    <string name="email_mobile">Email mobile</string>
-    <!-- Action string for sending an email to a work email address -->
-    <string name="email_work">Email work</string>
-    <!-- Action string for sending an email to an other email address -->
-    <string name="email_other">Email</string>
-    <!-- Action string for sending an email to a custom email address -->
-    <string name="email_custom">Email <xliff:g id="custom">%s</xliff:g></string>
-
-    <!-- Generic action string for sending an email -->
-    <string name="email">Email</string>
-
-    <!-- Action string for viewing a home postal address -->
-    <string name="map_home">View home address</string>
-    <!-- Action string for viewing a work postal address -->
-    <string name="map_work">View work address</string>
-    <!-- Action string for viewing an other postal address -->
-    <string name="map_other">View address</string>
-    <!-- Action string for viewing a custom postal address -->
-    <string name="map_custom">View <xliff:g id="custom">%s</xliff:g> address</string>
-
-    <!-- Action string for starting an IM chat with the AIM protocol -->
-    <string name="chat_aim">Chat using AIM</string>
-    <!-- Action string for starting an IM chat with the MSN or Windows Live protocol -->
-    <string name="chat_msn">Chat using Windows Live</string>
-    <!-- Action string for starting an IM chat with the Yahoo protocol -->
-    <string name="chat_yahoo">Chat using Yahoo</string>
-    <!-- Action string for starting an IM chat with the Skype protocol -->
-    <string name="chat_skype">Chat using Skype</string>
-    <!-- Action string for starting an IM chat with the QQ protocol -->
-    <string name="chat_qq">Chat using QQ</string>
-    <!-- Action string for starting an IM chat with the Google Talk protocol -->
-    <string name="chat_gtalk">Chat using Google Talk</string>
-    <!-- Action string for starting an IM chat with the ICQ protocol -->
-    <string name="chat_icq">Chat using ICQ</string>
-    <!-- Action string for starting an IM chat with the Jabber protocol -->
-    <string name="chat_jabber">Chat using Jabber</string>
-
-    <!-- Generic action string for starting an IM chat -->
-    <string name="chat">Chat</string>
     <!-- Generic action string for starting an audio chat. Used by AccessibilityService to announce the purpose of the view. [CHAR LIMIT=NONE] -->
     <string name="audio_chat">Voice chat</string>
     <!-- Generic action string for starting a video chat. Used by AccessibilityService to announce the purpose of the view. [CHAR LIMIT=NONE] -->
     <string name="video_chat">Video chat</string>
 
-    <!-- Field title for the full postal address of a contact [CHAR LIMIT=64]-->
-    <string name="postal_address">Address</string>
-    <!-- Field title for the street of a structured postal address of a contact -->
-    <string name="postal_street">Street</string>
-    <!-- Field title for the PO box of a structured postal address of a contact -->
-    <string name="postal_pobox">PO box</string>
-    <!-- Field title for the neighborhood of a structured postal address of a contact -->
-    <string name="postal_neighborhood">Neighborhood</string>
-    <!-- Field title for the city of a structured postal address of a contact -->
-    <string name="postal_city">City</string>
-    <!-- Field title for the region, or state, of a structured postal address of a contact -->
-    <string name="postal_region">State</string>
-    <!-- Field title for the postal code of a structured postal address of a contact -->
-    <string name="postal_postcode">ZIP code</string>
-    <!-- Field title for the country of a structured postal address of a contact -->
-    <string name="postal_country">Country</string>
-
-    <!-- Field title for the full name of a contact [CHAR LIMIT=64]-->
-    <string name="full_name">Name</string>
-    <!-- Field title for the given name of a contact -->
-    <string name="name_given">Given name</string>
-    <!-- Field title for the family name of a contact -->
-    <string name="name_family">Family name</string>
-    <!-- Field title for the prefix name of a contact -->
-    <string name="name_prefix">Name prefix</string>
-    <!-- Field title for the middle name of a contact -->
-    <string name="name_middle">Middle name</string>
-    <!-- Field title for the suffix name of a contact -->
-    <string name="name_suffix">Name suffix</string>
-    <!-- Field title for the phonetic given name of a contact -->
-    <string name="name_phonetic_given">Phonetic given name</string>
-    <!-- Field title for the phonetic middle name of a contact -->
-    <string name="name_phonetic_middle">Phonetic middle name</string>
-    <!-- Field title for the phonetic family name of a contact -->
-    <string name="name_phonetic_family">Phonetic family name</string>
-    <!-- Field title for the phonetic name of a contact [CHAR LIMIT=64]-->
-    <string name="name_phonetic">Phonetic name</string>
-
     <!-- Title for the list of all contact details that come from third-party sources (including a corporate directory) [CHAR LIMIT=20] -->
     <string name="connections">Connections</string>
 
@@ -1375,9 +1236,6 @@
     <!-- Label to instruct the user to type in a contact's name to add the contact as a member of the current group. [CHAR LIMIT=64] -->
     <string name="enter_contact_name">Type person\'s name</string>
 
-    <!-- Button to view the updates from the current group on the group detail page [CHAR LIMIT=25] -->
-    <string name="view_updates_from_group">View updates</string>
-
     <!-- Hint text in the group name box in the edit group view. [CHAR LIMIT=20]-->
     <string name="group_name_hint">Group\'s name</string>
 
@@ -1551,11 +1409,4 @@
          [CHAR LIMIT=NONE] -->
     <string name="action_menu_overflow_description" msgid="2295659037509008453">More options</string>
 
-    <!-- Content description for the expand or collapse name fields button.
-         Clicking this button causes the name editor to toggle between showing
-         a single field where the entire name is edited at once, or multiple
-         fields corresponding to each part of the name (Name Prefix, First Name,
-         Middle Name, Last Name, Name Suffix).
-         [CHAR LIMIT=NONE] -->
-    <string name="expand_collapse_name_fields_description">Expand or collapse name fields</string>
 </resources>
diff --git a/src/com/android/contacts/ContactSaveService.java b/src/com/android/contacts/ContactSaveService.java
index f1a5a72..64d5531 100644
--- a/src/com/android/contacts/ContactSaveService.java
+++ b/src/com/android/contacts/ContactSaveService.java
@@ -51,7 +51,7 @@
 import com.android.contacts.model.RawContactDelta;
 import com.android.contacts.model.RawContactDeltaList;
 import com.android.contacts.model.RawContactModifier;
-import com.android.contacts.model.account.AccountWithDataSet;
+import com.android.contacts.common.model.account.AccountWithDataSet;
 import com.android.contacts.util.CallerInfoCacheUtils;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
diff --git a/src/com/android/contacts/ContactsUtils.java b/src/com/android/contacts/ContactsUtils.java
index 3575b80..a53a423 100644
--- a/src/com/android/contacts/ContactsUtils.java
+++ b/src/com/android/contacts/ContactsUtils.java
@@ -27,9 +27,9 @@
 import android.text.TextUtils;
 
 import com.android.contacts.model.AccountTypeManager;
-import com.android.contacts.model.account.AccountType;
-import com.android.contacts.model.account.AccountWithDataSet;
-import com.android.contacts.test.NeededForTesting;
+import com.android.contacts.common.model.account.AccountType;
+import com.android.contacts.common.model.account.AccountWithDataSet;
+import com.android.contacts.common.test.NeededForTesting;
 
 import java.util.List;
 
diff --git a/src/com/android/contacts/SplitAggregateView.java b/src/com/android/contacts/SplitAggregateView.java
index 1b42ca3..fabd58b 100644
--- a/src/com/android/contacts/SplitAggregateView.java
+++ b/src/com/android/contacts/SplitAggregateView.java
@@ -36,7 +36,7 @@
 import android.widget.TextView;
 
 import com.android.contacts.model.AccountTypeManager;
-import com.android.contacts.model.account.AccountType;
+import com.android.contacts.common.model.account.AccountType;
 
 import java.util.ArrayList;
 import java.util.Collections;
diff --git a/src/com/android/contacts/activities/AttachPhotoActivity.java b/src/com/android/contacts/activities/AttachPhotoActivity.java
index b6d7c2d..54f2de8 100644
--- a/src/com/android/contacts/activities/AttachPhotoActivity.java
+++ b/src/com/android/contacts/activities/AttachPhotoActivity.java
@@ -38,7 +38,7 @@
 import com.android.contacts.model.RawContactDelta;
 import com.android.contacts.model.RawContactDeltaList;
 import com.android.contacts.model.RawContactModifier;
-import com.android.contacts.model.account.AccountType;
+import com.android.contacts.common.model.account.AccountType;
 import com.android.contacts.util.ContactPhotoUtils;
 
 import java.io.File;
diff --git a/src/com/android/contacts/activities/ConfirmAddDetailActivity.java b/src/com/android/contacts/activities/ConfirmAddDetailActivity.java
index 84206f8..9bd4f45 100644
--- a/src/com/android/contacts/activities/ConfirmAddDetailActivity.java
+++ b/src/com/android/contacts/activities/ConfirmAddDetailActivity.java
@@ -67,9 +67,9 @@
 import com.android.contacts.model.RawContactDelta.ValuesDelta;
 import com.android.contacts.model.RawContactDeltaList;
 import com.android.contacts.model.RawContactModifier;
-import com.android.contacts.model.account.AccountType;
-import com.android.contacts.model.account.AccountWithDataSet;
-import com.android.contacts.model.dataitem.DataKind;
+import com.android.contacts.common.model.account.AccountType;
+import com.android.contacts.common.model.account.AccountWithDataSet;
+import com.android.contacts.common.model.dataitem.DataKind;
 import com.android.contacts.util.DialogManager;
 import com.android.contacts.util.EmptyService;
 
diff --git a/src/com/android/contacts/activities/ContactDetailActivity.java b/src/com/android/contacts/activities/ContactDetailActivity.java
index b03a976..3cbc39d 100644
--- a/src/com/android/contacts/activities/ContactDetailActivity.java
+++ b/src/com/android/contacts/activities/ContactDetailActivity.java
@@ -47,7 +47,7 @@
 import com.android.contacts.detail.ContactLoaderFragment.ContactLoaderFragmentListener;
 import com.android.contacts.interactions.ContactDeletionInteraction;
 import com.android.contacts.model.Contact;
-import com.android.contacts.model.account.AccountWithDataSet;
+import com.android.contacts.common.model.account.AccountWithDataSet;
 import com.android.contacts.util.PhoneCapabilityTester;
 
 import java.util.ArrayList;
diff --git a/src/com/android/contacts/activities/ContactEditorAccountsChangedActivity.java b/src/com/android/contacts/activities/ContactEditorAccountsChangedActivity.java
index f5852e5..13c49e1 100644
--- a/src/com/android/contacts/activities/ContactEditorAccountsChangedActivity.java
+++ b/src/com/android/contacts/activities/ContactEditorAccountsChangedActivity.java
@@ -31,7 +31,7 @@
 import com.android.contacts.R;
 import com.android.contacts.editor.ContactEditorUtils;
 import com.android.contacts.model.AccountTypeManager;
-import com.android.contacts.model.account.AccountWithDataSet;
+import com.android.contacts.common.model.account.AccountWithDataSet;
 import com.android.contacts.util.AccountsListAdapter;
 import com.android.contacts.util.AccountsListAdapter.AccountListFilter;
 
@@ -189,4 +189,4 @@
         setResult(RESULT_OK, intent);
         finish();
     }
-}
\ No newline at end of file
+}
diff --git a/src/com/android/contacts/activities/ContactEditorActivity.java b/src/com/android/contacts/activities/ContactEditorActivity.java
index 77ed857..efdf7da 100644
--- a/src/com/android/contacts/activities/ContactEditorActivity.java
+++ b/src/com/android/contacts/activities/ContactEditorActivity.java
@@ -37,8 +37,8 @@
 import com.android.contacts.editor.ContactEditorFragment;
 import com.android.contacts.editor.ContactEditorFragment.SaveMode;
 import com.android.contacts.model.AccountTypeManager;
-import com.android.contacts.model.account.AccountType;
-import com.android.contacts.model.account.AccountWithDataSet;
+import com.android.contacts.common.model.account.AccountType;
+import com.android.contacts.common.model.account.AccountWithDataSet;
 import com.android.contacts.util.DialogManager;
 
 import java.util.ArrayList;
diff --git a/src/com/android/contacts/activities/GroupDetailActivity.java b/src/com/android/contacts/activities/GroupDetailActivity.java
index 492a2ff..c2764c3 100644
--- a/src/com/android/contacts/activities/GroupDetailActivity.java
+++ b/src/com/android/contacts/activities/GroupDetailActivity.java
@@ -34,7 +34,7 @@
 import com.android.contacts.group.GroupDetailDisplayUtils;
 import com.android.contacts.group.GroupDetailFragment;
 import com.android.contacts.model.AccountTypeManager;
-import com.android.contacts.model.account.AccountType;
+import com.android.contacts.common.model.account.AccountType;
 
 public class GroupDetailActivity extends ContactsActivity {
 
diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java
index 66b3ca3..53ffca9 100644
--- a/src/com/android/contacts/activities/PeopleActivity.java
+++ b/src/com/android/contacts/activities/PeopleActivity.java
@@ -80,7 +80,7 @@
 import com.android.contacts.list.ProviderStatusWatcher;
 import com.android.contacts.list.ProviderStatusWatcher.ProviderStatusListener;
 import com.android.contacts.model.Contact;
-import com.android.contacts.model.account.AccountWithDataSet;
+import com.android.contacts.common.model.account.AccountWithDataSet;
 import com.android.contacts.preference.ContactsPreferenceActivity;
 import com.android.contacts.preference.DisplayOptionsPreferenceFragment;
 import com.android.contacts.util.AccountFilterUtil;
diff --git a/src/com/android/contacts/detail/ContactDetailFragment.java b/src/com/android/contacts/detail/ContactDetailFragment.java
index 7cc95b9..cf1595d 100644
--- a/src/com/android/contacts/detail/ContactDetailFragment.java
+++ b/src/com/android/contacts/detail/ContactDetailFragment.java
@@ -89,11 +89,11 @@
 import com.android.contacts.model.RawContactDelta.ValuesDelta;
 import com.android.contacts.model.RawContactDeltaList;
 import com.android.contacts.model.RawContactModifier;
-import com.android.contacts.model.account.AccountType;
-import com.android.contacts.model.account.AccountType.EditType;
-import com.android.contacts.model.account.AccountWithDataSet;
+import com.android.contacts.common.model.account.AccountType;
+import com.android.contacts.common.model.account.AccountType.EditType;
+import com.android.contacts.common.model.account.AccountWithDataSet;
 import com.android.contacts.model.dataitem.DataItem;
-import com.android.contacts.model.dataitem.DataKind;
+import com.android.contacts.common.model.dataitem.DataKind;
 import com.android.contacts.model.dataitem.EmailDataItem;
 import com.android.contacts.model.dataitem.EventDataItem;
 import com.android.contacts.model.dataitem.GroupMembershipDataItem;
diff --git a/src/com/android/contacts/detail/ContactDetailUpdatesFragment.java b/src/com/android/contacts/detail/ContactDetailUpdatesFragment.java
index 88c30c2..46e4dad 100644
--- a/src/com/android/contacts/detail/ContactDetailUpdatesFragment.java
+++ b/src/com/android/contacts/detail/ContactDetailUpdatesFragment.java
@@ -33,7 +33,7 @@
 import com.android.contacts.detail.ContactDetailDisplayUtils.StreamPhotoTag;
 import com.android.contacts.model.AccountTypeManager;
 import com.android.contacts.model.Contact;
-import com.android.contacts.model.account.AccountType;
+import com.android.contacts.common.model.account.AccountType;
 import com.android.contacts.util.StreamItemEntry;
 
 public class ContactDetailUpdatesFragment extends ListFragment implements FragmentKeyListener {
diff --git a/src/com/android/contacts/detail/PhotoSelectionHandler.java b/src/com/android/contacts/detail/PhotoSelectionHandler.java
index b5e406a..d544b30 100644
--- a/src/com/android/contacts/detail/PhotoSelectionHandler.java
+++ b/src/com/android/contacts/detail/PhotoSelectionHandler.java
@@ -43,7 +43,7 @@
 import com.android.contacts.model.RawContactModifier;
 import com.android.contacts.model.RawContactDelta;
 import com.android.contacts.model.RawContactDelta.ValuesDelta;
-import com.android.contacts.model.account.AccountType;
+import com.android.contacts.common.model.account.AccountType;
 import com.android.contacts.model.RawContactDeltaList;
 import com.android.contacts.util.ContactPhotoUtils;
 
diff --git a/src/com/android/contacts/detail/StreamItemAdapter.java b/src/com/android/contacts/detail/StreamItemAdapter.java
index 15219cd..398ac69 100644
--- a/src/com/android/contacts/detail/StreamItemAdapter.java
+++ b/src/com/android/contacts/detail/StreamItemAdapter.java
@@ -24,7 +24,7 @@
 
 import com.android.contacts.R;
 import com.android.contacts.model.AccountTypeManager;
-import com.android.contacts.model.account.AccountType;
+import com.android.contacts.common.model.account.AccountType;
 import com.android.contacts.util.StreamItemEntry;
 import com.google.common.collect.Lists;
 
diff --git a/src/com/android/contacts/editor/AggregationSuggestionView.java b/src/com/android/contacts/editor/AggregationSuggestionView.java
index 7327a4c..19481fe 100644
--- a/src/com/android/contacts/editor/AggregationSuggestionView.java
+++ b/src/com/android/contacts/editor/AggregationSuggestionView.java
@@ -29,7 +29,7 @@
 import com.android.contacts.editor.AggregationSuggestionEngine.RawContact;
 import com.android.contacts.editor.AggregationSuggestionEngine.Suggestion;
 import com.android.contacts.model.AccountTypeManager;
-import com.android.contacts.model.account.AccountType;
+import com.android.contacts.common.model.account.AccountType;
 import com.google.common.collect.Lists;
 
 import java.util.ArrayList;
diff --git a/src/com/android/contacts/editor/BaseRawContactEditorView.java b/src/com/android/contacts/editor/BaseRawContactEditorView.java
index 66fc864..1ff9ac2 100644
--- a/src/com/android/contacts/editor/BaseRawContactEditorView.java
+++ b/src/com/android/contacts/editor/BaseRawContactEditorView.java
@@ -31,8 +31,8 @@
 import com.android.contacts.model.RawContactDelta;
 import com.android.contacts.model.RawContactDelta.ValuesDelta;
 import com.android.contacts.model.RawContactModifier;
-import com.android.contacts.model.account.AccountType;
-import com.android.contacts.model.account.AccountType.EditType;
+import com.android.contacts.common.model.account.AccountType;
+import com.android.contacts.common.model.account.AccountType.EditType;
 
 /**
  * Base view that provides common code for the editor interaction for a specific
diff --git a/src/com/android/contacts/editor/ContactEditorFragment.java b/src/com/android/contacts/editor/ContactEditorFragment.java
index f840bb5..17b6e50 100644
--- a/src/com/android/contacts/editor/ContactEditorFragment.java
+++ b/src/com/android/contacts/editor/ContactEditorFragment.java
@@ -78,9 +78,9 @@
 import com.android.contacts.model.RawContactDelta.ValuesDelta;
 import com.android.contacts.model.RawContactDeltaList;
 import com.android.contacts.model.RawContactModifier;
-import com.android.contacts.model.account.AccountType;
-import com.android.contacts.model.account.AccountWithDataSet;
-import com.android.contacts.model.account.GoogleAccountType;
+import com.android.contacts.common.model.account.AccountType;
+import com.android.contacts.common.model.account.AccountWithDataSet;
+import com.android.contacts.common.model.account.GoogleAccountType;
 import com.android.contacts.util.AccountsListAdapter;
 import com.android.contacts.util.AccountsListAdapter.AccountListFilter;
 import com.android.contacts.util.ContactPhotoUtils;
diff --git a/src/com/android/contacts/editor/ContactEditorUtils.java b/src/com/android/contacts/editor/ContactEditorUtils.java
index 2791c2d..735f8be 100644
--- a/src/com/android/contacts/editor/ContactEditorUtils.java
+++ b/src/com/android/contacts/editor/ContactEditorUtils.java
@@ -26,10 +26,10 @@
 import android.text.TextUtils;
 import android.util.Log;
 
+import com.android.contacts.common.test.NeededForTesting;
 import com.android.contacts.model.AccountTypeManager;
-import com.android.contacts.model.account.AccountType;
-import com.android.contacts.model.account.AccountWithDataSet;
-import com.android.contacts.test.NeededForTesting;
+import com.android.contacts.common.model.account.AccountType;
+import com.android.contacts.common.model.account.AccountWithDataSet;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Sets;
diff --git a/src/com/android/contacts/editor/Editor.java b/src/com/android/contacts/editor/Editor.java
index 05336f2..ec816f7 100644
--- a/src/com/android/contacts/editor/Editor.java
+++ b/src/com/android/contacts/editor/Editor.java
@@ -20,7 +20,7 @@
 
 import com.android.contacts.model.RawContactDelta;
 import com.android.contacts.model.RawContactDelta.ValuesDelta;
-import com.android.contacts.model.dataitem.DataKind;
+import com.android.contacts.common.model.dataitem.DataKind;
 
 /**
  * Generic definition of something that edits a {@link Data} row through an
diff --git a/src/com/android/contacts/editor/EventFieldEditorView.java b/src/com/android/contacts/editor/EventFieldEditorView.java
index 77f2010..1f6cd43 100644
--- a/src/com/android/contacts/editor/EventFieldEditorView.java
+++ b/src/com/android/contacts/editor/EventFieldEditorView.java
@@ -31,9 +31,9 @@
 import com.android.contacts.datepicker.DatePickerDialog.OnDateSetListener;
 import com.android.contacts.model.RawContactDelta;
 import com.android.contacts.model.RawContactDelta.ValuesDelta;
-import com.android.contacts.model.account.AccountType.EditField;
-import com.android.contacts.model.account.AccountType.EventEditType;
-import com.android.contacts.model.dataitem.DataKind;
+import com.android.contacts.common.model.account.AccountType.EditField;
+import com.android.contacts.common.model.account.AccountType.EventEditType;
+import com.android.contacts.common.model.dataitem.DataKind;
 import com.android.contacts.util.DateUtils;
 
 import java.text.ParsePosition;
diff --git a/src/com/android/contacts/editor/GroupMembershipView.java b/src/com/android/contacts/editor/GroupMembershipView.java
index b84e22b..8f9b65a 100644
--- a/src/com/android/contacts/editor/GroupMembershipView.java
+++ b/src/com/android/contacts/editor/GroupMembershipView.java
@@ -42,7 +42,7 @@
 import com.android.contacts.model.RawContactModifier;
 import com.android.contacts.model.RawContactDelta;
 import com.android.contacts.model.RawContactDelta.ValuesDelta;
-import com.android.contacts.model.dataitem.DataKind;
+import com.android.contacts.common.model.dataitem.DataKind;
 import com.android.internal.util.Objects;
 
 import java.util.ArrayList;
diff --git a/src/com/android/contacts/editor/KindSectionView.java b/src/com/android/contacts/editor/KindSectionView.java
index 9cfe0a3..4f70cd4 100644
--- a/src/com/android/contacts/editor/KindSectionView.java
+++ b/src/com/android/contacts/editor/KindSectionView.java
@@ -31,7 +31,7 @@
 import com.android.contacts.model.RawContactModifier;
 import com.android.contacts.model.RawContactDelta;
 import com.android.contacts.model.RawContactDelta.ValuesDelta;
-import com.android.contacts.model.dataitem.DataKind;
+import com.android.contacts.common.model.dataitem.DataKind;
 
 import java.util.ArrayList;
 import java.util.List;
diff --git a/src/com/android/contacts/editor/LabeledEditorView.java b/src/com/android/contacts/editor/LabeledEditorView.java
index 789f425..91339ae 100644
--- a/src/com/android/contacts/editor/LabeledEditorView.java
+++ b/src/com/android/contacts/editor/LabeledEditorView.java
@@ -49,8 +49,8 @@
 import com.android.contacts.model.RawContactDelta;
 import com.android.contacts.model.RawContactDelta.ValuesDelta;
 import com.android.contacts.model.RawContactModifier;
-import com.android.contacts.model.account.AccountType.EditType;
-import com.android.contacts.model.dataitem.DataKind;
+import com.android.contacts.common.model.account.AccountType.EditType;
+import com.android.contacts.common.model.dataitem.DataKind;
 import com.android.contacts.util.DialogManager;
 import com.android.contacts.util.DialogManager.DialogShowingView;
 
diff --git a/src/com/android/contacts/editor/PhoneticNameEditorView.java b/src/com/android/contacts/editor/PhoneticNameEditorView.java
index 8cbb921..1ee7e21 100644
--- a/src/com/android/contacts/editor/PhoneticNameEditorView.java
+++ b/src/com/android/contacts/editor/PhoneticNameEditorView.java
@@ -23,7 +23,7 @@
 
 import com.android.contacts.model.RawContactDelta;
 import com.android.contacts.model.RawContactDelta.ValuesDelta;
-import com.android.contacts.model.dataitem.DataKind;
+import com.android.contacts.common.model.dataitem.DataKind;
 import com.android.contacts.model.dataitem.StructuredNameDataItem;
 
 /**
diff --git a/src/com/android/contacts/editor/PhotoEditorView.java b/src/com/android/contacts/editor/PhotoEditorView.java
index 30c3bb4..e106eac 100644
--- a/src/com/android/contacts/editor/PhotoEditorView.java
+++ b/src/com/android/contacts/editor/PhotoEditorView.java
@@ -29,7 +29,7 @@
 import com.android.contacts.R;
 import com.android.contacts.model.RawContactDelta;
 import com.android.contacts.model.RawContactDelta.ValuesDelta;
-import com.android.contacts.model.dataitem.DataKind;
+import com.android.contacts.common.model.dataitem.DataKind;
 import com.android.contacts.util.ContactPhotoUtils;
 
 /**
diff --git a/src/com/android/contacts/editor/RawContactEditorView.java b/src/com/android/contacts/editor/RawContactEditorView.java
index daccdd8..2f53155 100644
--- a/src/com/android/contacts/editor/RawContactEditorView.java
+++ b/src/com/android/contacts/editor/RawContactEditorView.java
@@ -41,9 +41,9 @@
 import com.android.contacts.model.RawContactDelta;
 import com.android.contacts.model.RawContactDelta.ValuesDelta;
 import com.android.contacts.model.RawContactModifier;
-import com.android.contacts.model.account.AccountType;
-import com.android.contacts.model.account.AccountType.EditType;
-import com.android.contacts.model.dataitem.DataKind;
+import com.android.contacts.common.model.account.AccountType;
+import com.android.contacts.common.model.account.AccountType.EditType;
+import com.android.contacts.common.model.dataitem.DataKind;
 import com.android.internal.util.Objects;
 
 import java.util.ArrayList;
diff --git a/src/com/android/contacts/editor/RawContactReadOnlyEditorView.java b/src/com/android/contacts/editor/RawContactReadOnlyEditorView.java
index e963d48..8f9dcb9 100644
--- a/src/com/android/contacts/editor/RawContactReadOnlyEditorView.java
+++ b/src/com/android/contacts/editor/RawContactReadOnlyEditorView.java
@@ -42,9 +42,9 @@
 import com.android.contacts.model.RawContactModifier;
 import com.android.contacts.model.RawContactDelta;
 import com.android.contacts.model.RawContactDelta.ValuesDelta;
-import com.android.contacts.model.account.AccountType;
-import com.android.contacts.model.account.AccountWithDataSet;
-import com.android.contacts.model.dataitem.DataKind;
+import com.android.contacts.common.model.account.AccountType;
+import com.android.contacts.common.model.account.AccountWithDataSet;
+import com.android.contacts.common.model.dataitem.DataKind;
 
 import java.util.ArrayList;
 
diff --git a/src/com/android/contacts/editor/SelectAccountDialogFragment.java b/src/com/android/contacts/editor/SelectAccountDialogFragment.java
index 3e7ad0e..a575074 100644
--- a/src/com/android/contacts/editor/SelectAccountDialogFragment.java
+++ b/src/com/android/contacts/editor/SelectAccountDialogFragment.java
@@ -24,7 +24,7 @@
 import android.content.DialogInterface;
 import android.os.Bundle;
 
-import com.android.contacts.model.account.AccountWithDataSet;
+import com.android.contacts.common.model.account.AccountWithDataSet;
 import com.android.contacts.util.AccountsListAdapter;
 import com.android.contacts.util.AccountsListAdapter.AccountListFilter;
 
diff --git a/src/com/android/contacts/editor/StructuredNameEditorView.java b/src/com/android/contacts/editor/StructuredNameEditorView.java
index bac3b79..fcafe75 100644
--- a/src/com/android/contacts/editor/StructuredNameEditorView.java
+++ b/src/com/android/contacts/editor/StructuredNameEditorView.java
@@ -28,7 +28,7 @@
 import com.android.contacts.model.RawContactDelta;
 import com.android.contacts.model.RawContactDelta.ValuesDelta;
 import com.android.contacts.model.dataitem.DataItem;
-import com.android.contacts.model.dataitem.DataKind;
+import com.android.contacts.common.model.dataitem.DataKind;
 import com.android.contacts.model.dataitem.StructuredNameDataItem;
 import com.android.contacts.util.NameConverter;
 
diff --git a/src/com/android/contacts/editor/TextFieldsEditorView.java b/src/com/android/contacts/editor/TextFieldsEditorView.java
index e48ba51..970bbbf 100644
--- a/src/com/android/contacts/editor/TextFieldsEditorView.java
+++ b/src/com/android/contacts/editor/TextFieldsEditorView.java
@@ -39,8 +39,8 @@
 import com.android.contacts.R;
 import com.android.contacts.model.RawContactDelta;
 import com.android.contacts.model.RawContactDelta.ValuesDelta;
-import com.android.contacts.model.account.AccountType.EditField;
-import com.android.contacts.model.dataitem.DataKind;
+import com.android.contacts.common.model.account.AccountType.EditField;
+import com.android.contacts.common.model.dataitem.DataKind;
 import com.android.contacts.common.util.PhoneNumberFormatter;
 
 /**
diff --git a/src/com/android/contacts/editor/ViewIdGenerator.java b/src/com/android/contacts/editor/ViewIdGenerator.java
index 55a42a7..9f41623 100644
--- a/src/com/android/contacts/editor/ViewIdGenerator.java
+++ b/src/com/android/contacts/editor/ViewIdGenerator.java
@@ -22,7 +22,7 @@
 
 import com.android.contacts.model.RawContactDelta;
 import com.android.contacts.model.RawContactDelta.ValuesDelta;
-import com.android.contacts.model.dataitem.DataKind;
+import com.android.contacts.common.model.dataitem.DataKind;
 
 /**
  * A class that provides unique view ids for {@link ContentEditorView}, {@link KindSectionView},
diff --git a/src/com/android/contacts/group/GroupBrowseListAdapter.java b/src/com/android/contacts/group/GroupBrowseListAdapter.java
index acea625..88756e1 100644
--- a/src/com/android/contacts/group/GroupBrowseListAdapter.java
+++ b/src/com/android/contacts/group/GroupBrowseListAdapter.java
@@ -30,7 +30,7 @@
 import com.android.contacts.GroupListLoader;
 import com.android.contacts.R;
 import com.android.contacts.model.AccountTypeManager;
-import com.android.contacts.model.account.AccountType;
+import com.android.contacts.common.model.account.AccountType;
 import com.android.internal.util.Objects;
 
 /**
diff --git a/src/com/android/contacts/group/GroupDetailDisplayUtils.java b/src/com/android/contacts/group/GroupDetailDisplayUtils.java
index d4e43a0..1cf7831 100644
--- a/src/com/android/contacts/group/GroupDetailDisplayUtils.java
+++ b/src/com/android/contacts/group/GroupDetailDisplayUtils.java
@@ -24,7 +24,7 @@
 
 import com.android.contacts.R;
 import com.android.contacts.model.AccountTypeManager;
-import com.android.contacts.model.account.AccountType;
+import com.android.contacts.common.model.account.AccountType;
 
 public class GroupDetailDisplayUtils {
 
diff --git a/src/com/android/contacts/group/GroupDetailFragment.java b/src/com/android/contacts/group/GroupDetailFragment.java
index 020e30a..89cb63c 100644
--- a/src/com/android/contacts/group/GroupDetailFragment.java
+++ b/src/com/android/contacts/group/GroupDetailFragment.java
@@ -54,7 +54,7 @@
 import com.android.contacts.common.list.ContactTileView;
 import com.android.contacts.list.GroupMemberTileAdapter;
 import com.android.contacts.model.AccountTypeManager;
-import com.android.contacts.model.account.AccountType;
+import com.android.contacts.common.model.account.AccountType;
 
 /**
  * Displays the details of a group and shows a list of actions possible for the group.
diff --git a/src/com/android/contacts/group/GroupEditorFragment.java b/src/com/android/contacts/group/GroupEditorFragment.java
index 355cca7..7089fc6 100644
--- a/src/com/android/contacts/group/GroupEditorFragment.java
+++ b/src/com/android/contacts/group/GroupEditorFragment.java
@@ -67,8 +67,8 @@
 import com.android.contacts.editor.SelectAccountDialogFragment;
 import com.android.contacts.group.SuggestedMemberListAdapter.SuggestedMember;
 import com.android.contacts.model.AccountTypeManager;
-import com.android.contacts.model.account.AccountType;
-import com.android.contacts.model.account.AccountWithDataSet;
+import com.android.contacts.common.model.account.AccountType;
+import com.android.contacts.common.model.account.AccountWithDataSet;
 import com.android.contacts.util.AccountsListAdapter.AccountListFilter;
 import com.android.contacts.util.ViewUtil;
 import com.android.internal.util.Objects;
diff --git a/src/com/android/contacts/interactions/ContactDeletionInteraction.java b/src/com/android/contacts/interactions/ContactDeletionInteraction.java
index ea6e6dc..c4387f3 100644
--- a/src/com/android/contacts/interactions/ContactDeletionInteraction.java
+++ b/src/com/android/contacts/interactions/ContactDeletionInteraction.java
@@ -36,7 +36,7 @@
 import com.android.contacts.ContactSaveService;
 import com.android.contacts.R;
 import com.android.contacts.model.AccountTypeManager;
-import com.android.contacts.model.account.AccountType;
+import com.android.contacts.common.model.account.AccountType;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.Sets;
 
diff --git a/src/com/android/contacts/interactions/GroupCreationDialogFragment.java b/src/com/android/contacts/interactions/GroupCreationDialogFragment.java
index 5731bc1..b2860ea 100644
--- a/src/com/android/contacts/interactions/GroupCreationDialogFragment.java
+++ b/src/com/android/contacts/interactions/GroupCreationDialogFragment.java
@@ -23,7 +23,7 @@
 
 import com.android.contacts.ContactSaveService;
 import com.android.contacts.R;
-import com.android.contacts.model.account.AccountWithDataSet;
+import com.android.contacts.common.model.account.AccountWithDataSet;
 
 /**
  * A dialog for creating a new group.
diff --git a/src/com/android/contacts/interactions/ImportExportDialogFragment.java b/src/com/android/contacts/interactions/ImportExportDialogFragment.java
index f63f84c..3f409cb 100644
--- a/src/com/android/contacts/interactions/ImportExportDialogFragment.java
+++ b/src/com/android/contacts/interactions/ImportExportDialogFragment.java
@@ -40,7 +40,7 @@
 import com.android.contacts.R;
 import com.android.contacts.editor.SelectAccountDialogFragment;
 import com.android.contacts.model.AccountTypeManager;
-import com.android.contacts.model.account.AccountWithDataSet;
+import com.android.contacts.common.model.account.AccountWithDataSet;
 import com.android.contacts.util.AccountSelectionUtil;
 import com.android.contacts.util.AccountsListAdapter.AccountListFilter;
 import com.android.contacts.vcard.ExportVCardActivity;
diff --git a/src/com/android/contacts/list/AccountFilterActivity.java b/src/com/android/contacts/list/AccountFilterActivity.java
index 18d703f..cc986ad 100644
--- a/src/com/android/contacts/list/AccountFilterActivity.java
+++ b/src/com/android/contacts/list/AccountFilterActivity.java
@@ -38,8 +38,8 @@
 import com.android.contacts.R;
 import com.android.contacts.common.list.ContactListFilter;
 import com.android.contacts.model.AccountTypeManager;
-import com.android.contacts.model.account.AccountType;
-import com.android.contacts.model.account.AccountWithDataSet;
+import com.android.contacts.common.model.account.AccountType;
+import com.android.contacts.common.model.account.AccountWithDataSet;
 import com.google.common.collect.Lists;
 
 import java.util.ArrayList;
diff --git a/src/com/android/contacts/list/ContactListFilterController.java b/src/com/android/contacts/list/ContactListFilterController.java
index b8086b0..569dd5d 100644
--- a/src/com/android/contacts/list/ContactListFilterController.java
+++ b/src/com/android/contacts/list/ContactListFilterController.java
@@ -21,7 +21,7 @@
 
 import com.android.contacts.common.list.ContactListFilter;
 import com.android.contacts.model.AccountTypeManager;
-import com.android.contacts.model.account.AccountWithDataSet;
+import com.android.contacts.common.model.account.AccountWithDataSet;
 
 import java.util.ArrayList;
 import java.util.List;
diff --git a/src/com/android/contacts/list/ContactListFilterView.java b/src/com/android/contacts/list/ContactListFilterView.java
index a71809b..8102f65 100644
--- a/src/com/android/contacts/list/ContactListFilterView.java
+++ b/src/com/android/contacts/list/ContactListFilterView.java
@@ -28,7 +28,7 @@
 import com.android.contacts.R;
 import com.android.contacts.common.list.ContactListFilter;
 import com.android.contacts.model.AccountTypeManager;
-import com.android.contacts.model.account.AccountType;
+import com.android.contacts.common.model.account.AccountType;
 
 /**
  * Contact list filter parameters.
diff --git a/src/com/android/contacts/list/CustomContactListFilterActivity.java b/src/com/android/contacts/list/CustomContactListFilterActivity.java
index c62b389..532bbee 100644
--- a/src/com/android/contacts/list/CustomContactListFilterActivity.java
+++ b/src/com/android/contacts/list/CustomContactListFilterActivity.java
@@ -57,9 +57,9 @@
 import com.android.contacts.R;
 import com.android.contacts.model.AccountTypeManager;
 import com.android.contacts.model.RawContactDelta.ValuesDelta;
-import com.android.contacts.model.account.AccountType;
-import com.android.contacts.model.account.AccountWithDataSet;
-import com.android.contacts.model.account.GoogleAccountType;
+import com.android.contacts.common.model.account.AccountType;
+import com.android.contacts.common.model.account.AccountWithDataSet;
+import com.android.contacts.common.model.account.GoogleAccountType;
 import com.android.contacts.util.EmptyService;
 import com.android.contacts.util.LocalizedNameResolver;
 import com.android.contacts.util.WeakAsyncTask;
diff --git a/src/com/android/contacts/model/AccountTypeManager.java b/src/com/android/contacts/model/AccountTypeManager.java
index 5205ee0..75e50f8 100644
--- a/src/com/android/contacts/model/AccountTypeManager.java
+++ b/src/com/android/contacts/model/AccountTypeManager.java
@@ -45,15 +45,15 @@
 
 import com.android.contacts.ContactsUtils;
 import com.android.contacts.list.ContactListFilterController;
-import com.android.contacts.model.account.AccountType;
-import com.android.contacts.model.account.AccountTypeWithDataSet;
-import com.android.contacts.model.account.AccountWithDataSet;
-import com.android.contacts.model.account.ExchangeAccountType;
-import com.android.contacts.model.account.ExternalAccountType;
-import com.android.contacts.model.account.FallbackAccountType;
-import com.android.contacts.model.account.GoogleAccountType;
-import com.android.contacts.model.dataitem.DataKind;
-import com.android.contacts.test.NeededForTesting;
+import com.android.contacts.common.model.account.AccountType;
+import com.android.contacts.common.model.account.AccountTypeWithDataSet;
+import com.android.contacts.common.model.account.AccountWithDataSet;
+import com.android.contacts.common.model.account.ExchangeAccountType;
+import com.android.contacts.common.model.account.ExternalAccountType;
+import com.android.contacts.common.model.account.FallbackAccountType;
+import com.android.contacts.common.model.account.GoogleAccountType;
+import com.android.contacts.common.model.dataitem.DataKind;
+import com.android.contacts.common.test.NeededForTesting;
 import com.android.contacts.util.Constants;
 import com.android.internal.util.Objects;
 import com.google.common.annotations.VisibleForTesting;
diff --git a/src/com/android/contacts/model/Contact.java b/src/com/android/contacts/model/Contact.java
index a097a25..0314c3c 100644
--- a/src/com/android/contacts/model/Contact.java
+++ b/src/com/android/contacts/model/Contact.java
@@ -25,7 +25,7 @@
 import android.provider.ContactsContract.DisplayNameSources;
 
 import com.android.contacts.GroupMetaData;
-import com.android.contacts.model.account.AccountType;
+import com.android.contacts.common.model.account.AccountType;
 import com.android.contacts.util.DataStatus;
 import com.android.contacts.util.StreamItemEntry;
 import com.google.common.annotations.VisibleForTesting;
diff --git a/src/com/android/contacts/model/ContactLoader.java b/src/com/android/contacts/model/ContactLoader.java
index bbab0f5..6259800 100644
--- a/src/com/android/contacts/model/ContactLoader.java
+++ b/src/com/android/contacts/model/ContactLoader.java
@@ -43,8 +43,8 @@
 
 import com.android.contacts.GroupMetaData;
 import com.android.contacts.common.GeoUtil;
-import com.android.contacts.model.account.AccountType;
-import com.android.contacts.model.account.AccountTypeWithDataSet;
+import com.android.contacts.common.model.account.AccountType;
+import com.android.contacts.common.model.account.AccountTypeWithDataSet;
 import com.android.contacts.model.dataitem.DataItem;
 import com.android.contacts.model.dataitem.PhoneDataItem;
 import com.android.contacts.model.dataitem.PhotoDataItem;
diff --git a/src/com/android/contacts/model/RawContact.java b/src/com/android/contacts/model/RawContact.java
index 823a853..c4e5f3e 100644
--- a/src/com/android/contacts/model/RawContact.java
+++ b/src/com/android/contacts/model/RawContact.java
@@ -26,8 +26,8 @@
 import android.provider.ContactsContract.Data;
 import android.provider.ContactsContract.RawContacts;
 
-import com.android.contacts.model.account.AccountType;
-import com.android.contacts.model.account.AccountWithDataSet;
+import com.android.contacts.common.model.account.AccountType;
+import com.android.contacts.common.model.account.AccountWithDataSet;
 import com.android.contacts.model.dataitem.DataItem;
 import com.google.common.base.Objects;
 import com.google.common.collect.Lists;
diff --git a/src/com/android/contacts/model/RawContactDelta.java b/src/com/android/contacts/model/RawContactDelta.java
index b381174..f7ddcc9 100644
--- a/src/com/android/contacts/model/RawContactDelta.java
+++ b/src/com/android/contacts/model/RawContactDelta.java
@@ -34,8 +34,8 @@
 import android.provider.ContactsContract.RawContacts;
 import android.util.Log;
 
-import com.android.contacts.model.account.AccountType;
-import com.android.contacts.test.NeededForTesting;
+import com.android.contacts.common.model.account.AccountType;
+import com.android.contacts.common.test.NeededForTesting;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
diff --git a/src/com/android/contacts/model/RawContactModifier.java b/src/com/android/contacts/model/RawContactModifier.java
index 0c12c94..1b8d0fe 100644
--- a/src/com/android/contacts/model/RawContactModifier.java
+++ b/src/com/android/contacts/model/RawContactModifier.java
@@ -47,15 +47,16 @@
 import android.util.SparseIntArray;
 
 import com.android.contacts.ContactsUtils;
+import com.android.contacts.common.util.CommonDateUtils;
 import com.android.contacts.editor.EventFieldEditorView;
 import com.android.contacts.editor.PhoneticNameEditorView;
 import com.android.contacts.model.RawContactDelta.ValuesDelta;
-import com.android.contacts.model.account.AccountType;
-import com.android.contacts.model.account.AccountType.EditField;
-import com.android.contacts.model.account.AccountType.EditType;
-import com.android.contacts.model.account.AccountType.EventEditType;
-import com.android.contacts.model.account.GoogleAccountType;
-import com.android.contacts.model.dataitem.DataKind;
+import com.android.contacts.common.model.account.AccountType;
+import com.android.contacts.common.model.account.AccountType.EditField;
+import com.android.contacts.common.model.account.AccountType.EditType;
+import com.android.contacts.common.model.account.AccountType.EventEditType;
+import com.android.contacts.common.model.account.GoogleAccountType;
+import com.android.contacts.common.model.dataitem.DataKind;
 import com.android.contacts.model.dataitem.StructuredNameDataItem;
 import com.android.contacts.util.DateUtils;
 import com.android.contacts.util.NameConverter;
@@ -1263,10 +1264,10 @@
 
                 final ParsePosition position = new ParsePosition(0);
                 boolean yearOptional = false;
-                Date date = DateUtils.DATE_AND_TIME_FORMAT.parse(dateString, position);
+                Date date = CommonDateUtils.DATE_AND_TIME_FORMAT.parse(dateString, position);
                 if (date == null) {
                     yearOptional = true;
-                    date = DateUtils.NO_YEAR_DATE_FORMAT.parse(dateString, position);
+                    date = CommonDateUtils.NO_YEAR_DATE_FORMAT.parse(dateString, position);
                 }
                 if (date != null) {
                     if (yearOptional && !suitableType.isYearOptional()) {
@@ -1283,7 +1284,7 @@
                         calendar.set(defaultYear, month, day,
                                 EventFieldEditorView.getDefaultHourForBirthday(), 0, 0);
                         values.put(Event.START_DATE,
-                                DateUtils.FULL_DATE_FORMAT.format(calendar.getTime()));
+                                CommonDateUtils.FULL_DATE_FORMAT.format(calendar.getTime()));
                     }
                 }
                 newState.addEntry(ValuesDelta.fromAfter(values));
diff --git a/src/com/android/contacts/model/account/AccountType.java b/src/com/android/contacts/model/account/AccountType.java
deleted file mode 100644
index ca3dc68..0000000
--- a/src/com/android/contacts/model/account/AccountType.java
+++ /dev/null
@@ -1,531 +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.model.account;
-
-import android.content.ContentValues;
-import android.content.Context;
-import android.content.pm.PackageManager;
-import android.graphics.drawable.Drawable;
-import android.provider.ContactsContract.CommonDataKinds.Phone;
-import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
-import android.provider.ContactsContract.Contacts;
-import android.provider.ContactsContract.RawContacts;
-import android.view.inputmethod.EditorInfo;
-import android.widget.EditText;
-
-import com.android.contacts.R;
-import com.android.contacts.model.dataitem.DataKind;
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-
-import java.text.Collator;
-import java.util.ArrayList;
-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
- * source, such as the various data types they support, including details on how
- * those types should be rendered and edited.
- * <p>
- * In the future this may be inflated from XML defined by a data source.
- */
-public abstract class AccountType {
-    private static final String TAG = "AccountType";
-
-    /**
-     * 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.  Will be null for embedded types, in which
-     * case resources are stored in this package itself.
-     *
-     * TODO Clean up {@link #resourcePackageName}, {@link #syncAdapterPackageName} and
-     * {@link #getViewContactNotifyServicePackageName()}.
-     *
-     * There's the following invariants:
-     * - {@link #syncAdapterPackageName} is always set to the actual sync adapter package name.
-     * - {@link #resourcePackageName} too is set to the same value, unless {@link #isEmbedded()},
-     *   in which case it'll be null.
-     * There's an unfortunate exception of {@link FallbackAccountType}.  Even though it
-     * {@link #isEmbedded()}, but we set non-null to {@link #resourcePackageName} for unit tests.
-     */
-    public String resourcePackageName;
-    /**
-     * The package name for the authenticator (for the embedded types, i.e. Google and Exchange)
-     * or the sync adapter (for external type, including extensions).
-     */
-    public String syncAdapterPackageName;
-
-    public int titleRes;
-    public int iconRes;
-
-    /**
-     * Set of {@link DataKind} supported by this source.
-     */
-    private ArrayList<DataKind> mKinds = Lists.newArrayList();
-
-    /**
-     * Lookup map of {@link #mKinds} on {@link DataKind#mimeType}.
-     */
-    private HashMap<String, DataKind> mMimeKinds = Maps.newHashMap();
-
-    protected boolean mIsInitialized;
-
-    protected static class DefinitionException extends Exception {
-        public DefinitionException(String message) {
-            super(message);
-        }
-
-        public DefinitionException(String message, Exception inner) {
-            super(message, inner);
-        }
-    }
-
-    /**
-     * Whether this account type was able to be fully initialized.  This may be false if
-     * (for example) the package name associated with the account type could not be found.
-     */
-    public final boolean isInitialized() {
-        return mIsInitialized;
-    }
-
-    /**
-     * @return Whether this type is an "embedded" type.  i.e. any of {@link FallbackAccountType},
-     * {@link GoogleAccountType} or {@link ExternalAccountType}.
-     *
-     * If an embedded type cannot be initialized (i.e. if {@link #isInitialized()} returns
-     * {@code false}) it's considered critical, and the application will crash.  On the other
-     * hand if it's not an embedded type, we just skip loading the type.
-     */
-    public boolean isEmbedded() {
-        return true;
-    }
-
-    public boolean isExtension() {
-        return false;
-    }
-
-    /**
-     * @return True if contacts can be created and edited using this app. If false,
-     * there could still be an external editor as provided by
-     * {@link #getEditContactActivityClassName()} or {@link #getCreateContactActivityClassName()}
-     */
-    public abstract boolean areContactsWritable();
-
-    /**
-     * Returns an optional custom edit activity.
-     *
-     * Only makes sense for non-embedded account types.
-     * The activity class should reside in the sync adapter package as determined by
-     * {@link #syncAdapterPackageName}.
-     */
-    public String getEditContactActivityClassName() {
-        return null;
-    }
-
-    /**
-     * Returns an optional custom new contact activity.
-     *
-     * Only makes sense for non-embedded account types.
-     * The activity class should reside in the sync adapter package as determined by
-     * {@link #syncAdapterPackageName}.
-     */
-    public String getCreateContactActivityClassName() {
-        return null;
-    }
-
-    /**
-     * Returns an optional custom invite contact activity.
-     *
-     * Only makes sense for non-embedded account types.
-     * The activity class should reside in the sync adapter package as determined by
-     * {@link #syncAdapterPackageName}.
-     */
-    public String getInviteContactActivityClassName() {
-        return null;
-    }
-
-    /**
-     * Returns an optional service that can be launched whenever a contact is being looked at.
-     * This allows the sync adapter to provide more up-to-date information.
-     *
-     * The service class should reside in the sync adapter package as determined by
-     * {@link #getViewContactNotifyServicePackageName()}.
-     */
-    public String getViewContactNotifyServiceClassName() {
-        return null;
-    }
-
-    /**
-     * TODO This is way too hacky should be removed.
-     *
-     * This is introduced for {@link GoogleAccountType} where {@link #syncAdapterPackageName}
-     * is the authenticator package name but the notification service is in the sync adapter
-     * package.  See {@link #resourcePackageName} -- we should clean up those.
-     */
-    public String getViewContactNotifyServicePackageName() {
-        return syncAdapterPackageName;
-    }
-
-    /** Returns an optional Activity string that can be used to view the group. */
-    public String getViewGroupActivity() {
-        return null;
-    }
-
-    /** Returns an optional Activity string that can be used to view the stream item. */
-    public String getViewStreamItemActivity() {
-        return null;
-    }
-
-    /** Returns an optional Activity string that can be used to view the stream item photo. */
-    public String getViewStreamItemPhotoActivity() {
-        return null;
-    }
-
-    public CharSequence getDisplayLabel(Context context) {
-        // Note this resource is defined in the sync adapter package, not resourcePackageName.
-        return getResourceText(context, syncAdapterPackageName, titleRes, accountType);
-    }
-
-    /**
-     * @return resource ID for the "invite contact" action label, or -1 if not defined.
-     */
-    protected int getInviteContactActionResId() {
-        return -1;
-    }
-
-    /**
-     * @return resource ID for the "view group" label, or -1 if not defined.
-     */
-    protected int getViewGroupLabelResId() {
-        return -1;
-    }
-
-    /**
-     * Returns {@link AccountTypeWithDataSet} for this type.
-     */
-    public AccountTypeWithDataSet getAccountTypeAndDataSet() {
-        return AccountTypeWithDataSet.get(accountType, 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.)
-     */
-    public CharSequence getInviteContactActionLabel(Context context) {
-        // Note this resource is defined in the sync adapter package, not resourcePackageName.
-        return getResourceText(context, syncAdapterPackageName, getInviteContactActionResId(), "");
-    }
-
-    /**
-     * Returns a label for the "view group" action. If not defined, this falls back to our
-     * own "View Updates" string
-     */
-    public CharSequence getViewGroupLabel(Context context) {
-        // Note this resource is defined in the sync adapter package, not resourcePackageName.
-        final CharSequence customTitle =
-                getResourceText(context, syncAdapterPackageName, getViewGroupLabelResId(), null);
-
-        return customTitle == null
-                ? context.getText(R.string.view_updates_from_group)
-                : customTitle;
-    }
-
-    /**
-     * Return a string resource loaded from the given package (or the current package
-     * if {@code packageName} is null), unless {@code resId} is -1, in which case it returns
-     * {@code defaultValue}.
-     *
-     * (The behavior is undefined if the resource or package doesn't exist.)
-     */
-    @VisibleForTesting
-    static CharSequence getResourceText(Context context, String packageName, int resId,
-            String defaultValue) {
-        if (resId != -1 && packageName != null) {
-            final PackageManager pm = context.getPackageManager();
-            return pm.getText(packageName, resId, null);
-        } else if (resId != -1) {
-            return context.getText(resId);
-        } else {
-            return defaultValue;
-        }
-    }
-
-    public Drawable getDisplayIcon(Context context) {
-        if (this.titleRes != -1 && this.syncAdapterPackageName != null) {
-            final PackageManager pm = context.getPackageManager();
-            return pm.getDrawable(this.syncAdapterPackageName, this.iconRes, null);
-        } else if (this.titleRes != -1) {
-            return context.getResources().getDrawable(this.iconRes);
-        } else {
-            return null;
-        }
-    }
-
-    /**
-     * Whether or not groups created under this account type have editable membership lists.
-     */
-    abstract public boolean isGroupMembershipEditable();
-
-    /**
-     * {@link Comparator} to sort by {@link DataKind#weight}.
-     */
-    private static Comparator<DataKind> sWeightComparator = new Comparator<DataKind>() {
-        @Override
-        public int compare(DataKind object1, DataKind object2) {
-            return object1.weight - object2.weight;
-        }
-    };
-
-    /**
-     * Return list of {@link DataKind} supported, sorted by
-     * {@link DataKind#weight}.
-     */
-    public ArrayList<DataKind> getSortedDataKinds() {
-        // TODO: optimize by marking if already sorted
-        Collections.sort(mKinds, sWeightComparator);
-        return mKinds;
-    }
-
-    /**
-     * Find the {@link DataKind} for a specific MIME-type, if it's handled by
-     * this data source.
-     */
-    public DataKind getKindForMimetype(String mimeType) {
-        return this.mMimeKinds.get(mimeType);
-    }
-
-    /**
-     * Add given {@link DataKind} to list of those provided by this source.
-     */
-    public DataKind addKind(DataKind kind) throws DefinitionException {
-        if (kind.mimeType == null) {
-            throw new DefinitionException("null is not a valid mime type");
-        }
-        if (mMimeKinds.get(kind.mimeType) != null) {
-            throw new DefinitionException(
-                    "mime type '" + kind.mimeType + "' is already registered");
-        }
-
-        kind.resourcePackageName = this.resourcePackageName;
-        this.mKinds.add(kind);
-        this.mMimeKinds.put(kind.mimeType, kind);
-        return kind;
-    }
-
-    /**
-     * Description of a specific "type" or "label" of a {@link DataKind} row,
-     * such as {@link Phone#TYPE_WORK}. Includes constraints on total number of
-     * rows a {@link Contacts} may have of this type, and details on how
-     * user-defined labels are stored.
-     */
-    public static class EditType {
-        public int rawValue;
-        public int labelRes;
-        public boolean secondary;
-        /**
-         * The number of entries allowed for the type. -1 if not specified.
-         * @see DataKind#typeOverallMax
-         */
-        public int specificMax;
-        public String customColumn;
-
-        public EditType(int rawValue, int labelRes) {
-            this.rawValue = rawValue;
-            this.labelRes = labelRes;
-            this.specificMax = -1;
-        }
-
-        public EditType setSecondary(boolean secondary) {
-            this.secondary = secondary;
-            return this;
-        }
-
-        public EditType setSpecificMax(int specificMax) {
-            this.specificMax = specificMax;
-            return this;
-        }
-
-        public EditType setCustomColumn(String customColumn) {
-            this.customColumn = customColumn;
-            return this;
-        }
-
-        @Override
-        public boolean equals(Object object) {
-            if (object instanceof EditType) {
-                final EditType other = (EditType)object;
-                return other.rawValue == rawValue;
-            }
-            return false;
-        }
-
-        @Override
-        public int hashCode() {
-            return rawValue;
-        }
-
-        @Override
-        public String toString() {
-            return this.getClass().getSimpleName()
-                    + " rawValue=" + rawValue
-                    + " labelRes=" + labelRes
-                    + " secondary=" + secondary
-                    + " specificMax=" + specificMax
-                    + " customColumn=" + customColumn;
-        }
-    }
-
-    public static class EventEditType extends EditType {
-        private boolean mYearOptional;
-
-        public EventEditType(int rawValue, int labelRes) {
-            super(rawValue, labelRes);
-        }
-
-        public boolean isYearOptional() {
-            return mYearOptional;
-        }
-
-        public EventEditType setYearOptional(boolean yearOptional) {
-            mYearOptional = yearOptional;
-            return this;
-        }
-
-        @Override
-        public String toString() {
-            return super.toString() + " mYearOptional=" + mYearOptional;
-        }
-    }
-
-    /**
-     * Description of a user-editable field on a {@link DataKind} row, such as
-     * {@link Phone#NUMBER}. Includes flags to apply to an {@link EditText}, and
-     * the column where this field is stored.
-     */
-    public static final class EditField {
-        public String column;
-        public int titleRes;
-        public int inputType;
-        public int minLines;
-        public boolean optional;
-        public boolean shortForm;
-        public boolean longForm;
-
-        public EditField(String column, int titleRes) {
-            this.column = column;
-            this.titleRes = titleRes;
-        }
-
-        public EditField(String column, int titleRes, int inputType) {
-            this(column, titleRes);
-            this.inputType = inputType;
-        }
-
-        public EditField setOptional(boolean optional) {
-            this.optional = optional;
-            return this;
-        }
-
-        public EditField setShortForm(boolean shortForm) {
-            this.shortForm = shortForm;
-            return this;
-        }
-
-        public EditField setLongForm(boolean longForm) {
-            this.longForm = longForm;
-            return this;
-        }
-
-        public EditField setMinLines(int minLines) {
-            this.minLines = minLines;
-            return this;
-        }
-
-        public boolean isMultiLine() {
-            return (inputType & EditorInfo.TYPE_TEXT_FLAG_MULTI_LINE) != 0;
-        }
-
-
-        @Override
-        public String toString() {
-            return this.getClass().getSimpleName() + ":"
-                    + " column=" + column
-                    + " titleRes=" + titleRes
-                    + " inputType=" + inputType
-                    + " minLines=" + minLines
-                    + " optional=" + optional
-                    + " shortForm=" + shortForm
-                    + " longForm=" + longForm;
-        }
-    }
-
-    /**
-     * Generic method of inflating a given {@link ContentValues} into a user-readable
-     * {@link CharSequence}. For example, an inflater could combine the multiple
-     * columns of {@link StructuredPostal} together using a string resource
-     * before presenting to the user.
-     */
-    public interface StringInflater {
-        public CharSequence inflateUsing(Context context, ContentValues values);
-    }
-
-    /**
-     * Compare two {@link AccountType} by their {@link AccountType#getDisplayLabel} with the
-     * current locale.
-     */
-    public static class DisplayLabelComparator implements Comparator<AccountType> {
-        private final Context mContext;
-        /** {@link Comparator} for the current locale. */
-        private final Collator mCollator = Collator.getInstance();
-
-        public DisplayLabelComparator(Context context) {
-            mContext = context;
-        }
-
-        private String getDisplayLabel(AccountType type) {
-            CharSequence label = type.getDisplayLabel(mContext);
-            return (label == null) ? "" : label.toString();
-        }
-
-        @Override
-        public int compare(AccountType lhs, AccountType rhs) {
-            return mCollator.compare(getDisplayLabel(lhs), getDisplayLabel(rhs));
-        }
-    }
-}
diff --git a/src/com/android/contacts/model/account/AccountTypeWithDataSet.java b/src/com/android/contacts/model/account/AccountTypeWithDataSet.java
deleted file mode 100644
index ab0a891..0000000
--- a/src/com/android/contacts/model/account/AccountTypeWithDataSet.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * 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.account;
-
-import android.content.Context;
-import android.database.Cursor;
-import android.net.Uri;
-import android.provider.BaseColumns;
-import android.provider.ContactsContract;
-import android.provider.ContactsContract.RawContacts;
-import android.text.TextUtils;
-
-import com.google.common.base.Objects;
-
-
-/**
- * Encapsulates an "account type" string and a "data set" string.
- */
-public class AccountTypeWithDataSet {
-
-    private static final String[] ID_PROJECTION = new String[] {BaseColumns._ID};
-    private static final Uri RAW_CONTACTS_URI_LIMIT_1 = RawContacts.CONTENT_URI.buildUpon()
-            .appendQueryParameter(ContactsContract.LIMIT_PARAM_KEY, "1").build();
-
-    /** account type.  Can be null for fallback type. */
-    public final String accountType;
-
-    /** dataSet may be null, but never be "". */
-    public final String dataSet;
-
-    private AccountTypeWithDataSet(String accountType, String dataSet) {
-        this.accountType = TextUtils.isEmpty(accountType) ? null : accountType;
-        this.dataSet = TextUtils.isEmpty(dataSet) ? null : dataSet;
-    }
-
-    public static AccountTypeWithDataSet get(String accountType, String dataSet) {
-        return new AccountTypeWithDataSet(accountType, dataSet);
-    }
-
-    /**
-     * Return true if there are any contacts in the database with this account type and data set.
-     * Touches DB. Don't use in the UI thread.
-     */
-    public boolean hasData(Context context) {
-        final String BASE_SELECTION = RawContacts.ACCOUNT_TYPE + " = ?";
-        final String selection;
-        final String[] args;
-        if (TextUtils.isEmpty(dataSet)) {
-            selection = BASE_SELECTION + " AND " + RawContacts.DATA_SET + " IS NULL";
-            args = new String[] {accountType};
-        } else {
-            selection = BASE_SELECTION + " AND " + RawContacts.DATA_SET + " = ?";
-            args = new String[] {accountType, dataSet};
-        }
-
-        final Cursor c = context.getContentResolver().query(RAW_CONTACTS_URI_LIMIT_1,
-                ID_PROJECTION, selection, args, null);
-        if (c == null) return false;
-        try {
-            return c.moveToFirst();
-        } finally {
-            c.close();
-        }
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (!(o instanceof AccountTypeWithDataSet)) return false;
-
-        AccountTypeWithDataSet other = (AccountTypeWithDataSet) o;
-        return Objects.equal(accountType, other.accountType)
-                && Objects.equal(dataSet, other.dataSet);
-    }
-
-    @Override
-    public int hashCode() {
-        return (accountType == null ? 0 : accountType.hashCode())
-                ^ (dataSet == null ? 0 : dataSet.hashCode());
-    }
-
-    @Override
-    public String toString() {
-        return "[" + accountType + "/" + dataSet + "]";
-    }
-}
diff --git a/src/com/android/contacts/model/account/AccountWithDataSet.java b/src/com/android/contacts/model/account/AccountWithDataSet.java
deleted file mode 100644
index 03fcc02..0000000
--- a/src/com/android/contacts/model/account/AccountWithDataSet.java
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- * 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.account;
-
-import android.accounts.Account;
-import android.content.Context;
-import android.database.Cursor;
-import android.net.Uri;
-import android.os.Parcel;
-import android.provider.BaseColumns;
-import android.provider.ContactsContract;
-import android.provider.ContactsContract.RawContacts;
-import android.text.TextUtils;
-
-import com.android.internal.util.Objects;
-import com.google.common.collect.Lists;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.regex.Pattern;
-
-/**
- * Wrapper for an account that includes a data set (which may be null).
- */
-public class AccountWithDataSet extends Account {
-    private static final String STRINGIFY_SEPARATOR = "\u0001";
-    private static final String ARRAY_STRINGIFY_SEPARATOR = "\u0002";
-
-    private static final Pattern STRINGIFY_SEPARATOR_PAT =
-            Pattern.compile(Pattern.quote(STRINGIFY_SEPARATOR));
-    private static final Pattern ARRAY_STRINGIFY_SEPARATOR_PAT =
-            Pattern.compile(Pattern.quote(ARRAY_STRINGIFY_SEPARATOR));
-
-    public final String dataSet;
-    private final AccountTypeWithDataSet mAccountTypeWithDataSet;
-
-    private static final String[] ID_PROJECTION = new String[] {BaseColumns._ID};
-    private static final Uri RAW_CONTACTS_URI_LIMIT_1 = RawContacts.CONTENT_URI.buildUpon()
-            .appendQueryParameter(ContactsContract.LIMIT_PARAM_KEY, "1").build();
-
-
-    public AccountWithDataSet(String name, String type, String dataSet) {
-        super(name, type);
-        this.dataSet = dataSet;
-        mAccountTypeWithDataSet = AccountTypeWithDataSet.get(type, dataSet);
-    }
-
-    public AccountWithDataSet(Parcel in) {
-        super(in);
-        this.dataSet = in.readString();
-        mAccountTypeWithDataSet = AccountTypeWithDataSet.get(type, dataSet);
-    }
-
-    @Override
-    public void writeToParcel(Parcel dest, int flags) {
-        super.writeToParcel(dest, flags);
-        dest.writeString(dataSet);
-    }
-
-    // For Parcelable
-    public static final Creator<AccountWithDataSet> CREATOR = new Creator<AccountWithDataSet>() {
-        public AccountWithDataSet createFromParcel(Parcel source) {
-            return new AccountWithDataSet(source);
-        }
-
-        public AccountWithDataSet[] newArray(int size) {
-            return new AccountWithDataSet[size];
-        }
-    };
-
-    public AccountTypeWithDataSet getAccountTypeWithDataSet() {
-        return mAccountTypeWithDataSet;
-    }
-
-    /**
-     * Return {@code true} if this account has any contacts in the database.
-     * Touches DB.  Don't use in the UI thread.
-     */
-    public boolean hasData(Context context) {
-        final String BASE_SELECTION =
-                RawContacts.ACCOUNT_TYPE + " = ?" + " AND " + RawContacts.ACCOUNT_NAME + " = ?";
-        final String selection;
-        final String[] args;
-        if (TextUtils.isEmpty(dataSet)) {
-            selection = BASE_SELECTION + " AND " + RawContacts.DATA_SET + " IS NULL";
-            args = new String[] {type, name};
-        } else {
-            selection = BASE_SELECTION + " AND " + RawContacts.DATA_SET + " = ?";
-            args = new String[] {type, name, dataSet};
-        }
-
-        final Cursor c = context.getContentResolver().query(RAW_CONTACTS_URI_LIMIT_1,
-                ID_PROJECTION, selection, args, null);
-        if (c == null) return false;
-        try {
-            return c.moveToFirst();
-        } finally {
-            c.close();
-        }
-    }
-
-    @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 + "}";
-    }
-
-    private static StringBuilder addStringified(StringBuilder sb, AccountWithDataSet account) {
-        sb.append(account.name);
-        sb.append(STRINGIFY_SEPARATOR);
-        sb.append(account.type);
-        sb.append(STRINGIFY_SEPARATOR);
-        if (!TextUtils.isEmpty(account.dataSet)) sb.append(account.dataSet);
-
-        return sb;
-    }
-
-    /**
-     * Pack the instance into a string.
-     */
-    public String stringify() {
-        return addStringified(new StringBuilder(), this).toString();
-    }
-
-    /**
-     * Unpack a string created by {@link #stringify}.
-     *
-     * @throws IllegalArgumentException if it's an invalid string.
-     */
-    public static AccountWithDataSet unstringify(String s) {
-        final String[] array = STRINGIFY_SEPARATOR_PAT.split(s, 3);
-        if (array.length < 3) {
-            throw new IllegalArgumentException("Invalid string " + s);
-        }
-        return new AccountWithDataSet(array[0], array[1],
-                TextUtils.isEmpty(array[2]) ? null : array[2]);
-    }
-
-    /**
-     * Pack a list of {@link AccountWithDataSet} into a string.
-     */
-    public static String stringifyList(List<AccountWithDataSet> accounts) {
-        final StringBuilder sb = new StringBuilder();
-
-        for (AccountWithDataSet account : accounts) {
-            if (sb.length() > 0) {
-                sb.append(ARRAY_STRINGIFY_SEPARATOR);
-            }
-            addStringified(sb, account);
-        }
-
-        return sb.toString();
-    }
-
-    /**
-     * Unpack a list of {@link AccountWithDataSet} into a string.
-     *
-     * @throws IllegalArgumentException if it's an invalid string.
-     */
-    public static List<AccountWithDataSet> unstringifyList(String s) {
-        final ArrayList<AccountWithDataSet> ret = Lists.newArrayList();
-        if (TextUtils.isEmpty(s)) {
-            return ret;
-        }
-
-        final String[] array = ARRAY_STRINGIFY_SEPARATOR_PAT.split(s);
-
-        for (int i = 0; i < array.length; i++) {
-            ret.add(unstringify(array[i]));
-        }
-
-        return ret;
-    }
-}
diff --git a/src/com/android/contacts/model/account/BaseAccountType.java b/src/com/android/contacts/model/account/BaseAccountType.java
deleted file mode 100644
index 6b4d623..0000000
--- a/src/com/android/contacts/model/account/BaseAccountType.java
+++ /dev/null
@@ -1,1482 +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.model.account;
-
-import android.content.ContentValues;
-import android.content.Context;
-import android.content.res.Resources;
-import android.provider.ContactsContract.CommonDataKinds.BaseTypes;
-import android.provider.ContactsContract.CommonDataKinds.Email;
-import android.provider.ContactsContract.CommonDataKinds.Event;
-import android.provider.ContactsContract.CommonDataKinds.GroupMembership;
-import android.provider.ContactsContract.CommonDataKinds.Im;
-import android.provider.ContactsContract.CommonDataKinds.Nickname;
-import android.provider.ContactsContract.CommonDataKinds.Note;
-import android.provider.ContactsContract.CommonDataKinds.Organization;
-import android.provider.ContactsContract.CommonDataKinds.Phone;
-import android.provider.ContactsContract.CommonDataKinds.Photo;
-import android.provider.ContactsContract.CommonDataKinds.Relation;
-import android.provider.ContactsContract.CommonDataKinds.SipAddress;
-import android.provider.ContactsContract.CommonDataKinds.StructuredName;
-import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
-import android.provider.ContactsContract.CommonDataKinds.Website;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.view.inputmethod.EditorInfo;
-
-import com.android.contacts.R;
-import com.android.contacts.common.util.ContactDisplayUtils;
-import com.android.contacts.model.dataitem.DataKind;
-import com.android.contacts.test.NeededForTesting;
-import com.android.contacts.util.DateUtils;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
-import java.io.IOException;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-
-public abstract class BaseAccountType extends AccountType {
-    private static final String TAG = "BaseAccountType";
-
-    protected static final int FLAGS_PHONE = EditorInfo.TYPE_CLASS_PHONE;
-    protected static final int FLAGS_EMAIL = EditorInfo.TYPE_CLASS_TEXT
-            | EditorInfo.TYPE_TEXT_VARIATION_EMAIL_ADDRESS;
-    protected static final int FLAGS_PERSON_NAME = EditorInfo.TYPE_CLASS_TEXT
-            | EditorInfo.TYPE_TEXT_FLAG_CAP_WORDS | EditorInfo.TYPE_TEXT_VARIATION_PERSON_NAME;
-    protected static final int FLAGS_PHONETIC = EditorInfo.TYPE_CLASS_TEXT
-            | EditorInfo.TYPE_TEXT_VARIATION_PHONETIC;
-    protected static final int FLAGS_GENERIC_NAME = EditorInfo.TYPE_CLASS_TEXT
-            | EditorInfo.TYPE_TEXT_FLAG_CAP_WORDS;
-    protected static final int FLAGS_NOTE = EditorInfo.TYPE_CLASS_TEXT
-            | EditorInfo.TYPE_TEXT_FLAG_CAP_SENTENCES | EditorInfo.TYPE_TEXT_FLAG_MULTI_LINE;
-    protected static final int FLAGS_EVENT = EditorInfo.TYPE_CLASS_TEXT;
-    protected static final int FLAGS_WEBSITE = EditorInfo.TYPE_CLASS_TEXT
-            | EditorInfo.TYPE_TEXT_VARIATION_URI;
-    protected static final int FLAGS_POSTAL = EditorInfo.TYPE_CLASS_TEXT
-            | EditorInfo.TYPE_TEXT_VARIATION_POSTAL_ADDRESS | EditorInfo.TYPE_TEXT_FLAG_CAP_WORDS
-            | EditorInfo.TYPE_TEXT_FLAG_MULTI_LINE;
-    protected static final int FLAGS_SIP_ADDRESS = EditorInfo.TYPE_CLASS_TEXT
-            | EditorInfo.TYPE_TEXT_VARIATION_EMAIL_ADDRESS;  // since SIP addresses have the same
-                                                             // basic format as email addresses
-    protected static final int FLAGS_RELATION = EditorInfo.TYPE_CLASS_TEXT
-            | EditorInfo.TYPE_TEXT_FLAG_CAP_WORDS | EditorInfo.TYPE_TEXT_VARIATION_PERSON_NAME;
-
-    // Specify the maximum number of lines that can be used to display various field types.  If no
-    // value is specified for a particular type, we use the default value from {@link DataKind}.
-    protected static final int MAX_LINES_FOR_POSTAL_ADDRESS = 10;
-    protected static final int MAX_LINES_FOR_GROUP = 10;
-    protected static final int MAX_LINES_FOR_NOTE = 100;
-
-    private interface Tag {
-        static final String DATA_KIND = "DataKind";
-        static final String TYPE = "Type";
-    }
-
-    private interface Attr {
-        static final String MAX_OCCURRENCE = "maxOccurs";
-        static final String DATE_WITH_TIME = "dateWithTime";
-        static final String YEAR_OPTIONAL = "yearOptional";
-        static final String KIND = "kind";
-        static final String TYPE = "type";
-    }
-
-    private interface Weight {
-        static final int NONE = -1;
-        static final int ORGANIZATION = 5;
-        static final int PHONE = 10;
-        static final int EMAIL = 15;
-        static final int IM = 20;
-        static final int STRUCTURED_POSTAL = 25;
-        static final int NOTE = 110;
-        static final int NICKNAME = 115;
-        static final int WEBSITE = 120;
-        static final int SIP_ADDRESS = 130;
-        static final int EVENT = 150;
-        static final int RELATIONSHIP = 160;
-        static final int GROUP_MEMBERSHIP = 999;
-    }
-
-    public BaseAccountType() {
-        this.accountType = null;
-        this.dataSet = null;
-        this.titleRes = R.string.account_phone;
-        this.iconRes = R.mipmap.ic_launcher_contacts;
-    }
-
-    protected static EditType buildPhoneType(int type) {
-        return new EditType(type, Phone.getTypeLabelResource(type));
-    }
-
-    protected static EditType buildEmailType(int type) {
-        return new EditType(type, Email.getTypeLabelResource(type));
-    }
-
-    protected static EditType buildPostalType(int type) {
-        return new EditType(type, StructuredPostal.getTypeLabelResource(type));
-    }
-
-    protected static EditType buildImType(int type) {
-        return new EditType(type, Im.getProtocolLabelResource(type));
-    }
-
-    protected static EditType buildEventType(int type, boolean yearOptional) {
-        return new EventEditType(type, Event.getTypeResource(type)).setYearOptional(yearOptional);
-    }
-
-    protected static EditType buildRelationType(int type) {
-        return new EditType(type, Relation.getTypeLabelResource(type));
-    }
-
-    protected DataKind addDataKindStructuredName(Context context) throws DefinitionException {
-        DataKind kind = addKind(new DataKind(StructuredName.CONTENT_ITEM_TYPE,
-                R.string.nameLabelsGroup, -1, true, R.layout.structured_name_editor_view));
-        kind.actionHeader = new SimpleInflater(R.string.nameLabelsGroup);
-        kind.actionBody = new SimpleInflater(Nickname.NAME);
-        kind.typeOverallMax = 1;
-
-        kind.fieldList = Lists.newArrayList();
-        kind.fieldList.add(new EditField(StructuredName.DISPLAY_NAME,
-                R.string.full_name, FLAGS_PERSON_NAME));
-        kind.fieldList.add(new EditField(StructuredName.PREFIX, R.string.name_prefix,
-                FLAGS_PERSON_NAME).setLongForm(true));
-        kind.fieldList.add(new EditField(StructuredName.FAMILY_NAME, R.string.name_family,
-                FLAGS_PERSON_NAME).setLongForm(true));
-        kind.fieldList.add(new EditField(StructuredName.MIDDLE_NAME, R.string.name_middle,
-                FLAGS_PERSON_NAME).setLongForm(true));
-        kind.fieldList.add(new EditField(StructuredName.GIVEN_NAME, R.string.name_given,
-                FLAGS_PERSON_NAME).setLongForm(true));
-        kind.fieldList.add(new EditField(StructuredName.SUFFIX, R.string.name_suffix,
-                FLAGS_PERSON_NAME).setLongForm(true));
-        kind.fieldList.add(new EditField(StructuredName.PHONETIC_FAMILY_NAME,
-                R.string.name_phonetic_family, FLAGS_PHONETIC));
-        kind.fieldList.add(new EditField(StructuredName.PHONETIC_MIDDLE_NAME,
-                R.string.name_phonetic_middle, FLAGS_PHONETIC));
-        kind.fieldList.add(new EditField(StructuredName.PHONETIC_GIVEN_NAME,
-                R.string.name_phonetic_given, FLAGS_PHONETIC));
-
-        return kind;
-    }
-
-    protected DataKind addDataKindDisplayName(Context context) throws DefinitionException {
-        DataKind kind = addKind(new DataKind(DataKind.PSEUDO_MIME_TYPE_DISPLAY_NAME,
-                R.string.nameLabelsGroup, -1, true, R.layout.text_fields_editor_view));
-        kind.actionHeader = new SimpleInflater(R.string.nameLabelsGroup);
-        kind.actionBody = new SimpleInflater(Nickname.NAME);
-        kind.typeOverallMax = 1;
-
-        kind.fieldList = Lists.newArrayList();
-        kind.fieldList.add(new EditField(StructuredName.DISPLAY_NAME,
-                R.string.full_name, FLAGS_PERSON_NAME).setShortForm(true));
-
-        boolean displayOrderPrimary =
-                context.getResources().getBoolean(R.bool.config_editor_field_order_primary);
-
-        if (!displayOrderPrimary) {
-            kind.fieldList.add(new EditField(StructuredName.PREFIX, R.string.name_prefix,
-                    FLAGS_PERSON_NAME).setLongForm(true));
-            kind.fieldList.add(new EditField(StructuredName.FAMILY_NAME, R.string.name_family,
-                    FLAGS_PERSON_NAME).setLongForm(true));
-            kind.fieldList.add(new EditField(StructuredName.MIDDLE_NAME, R.string.name_middle,
-                    FLAGS_PERSON_NAME).setLongForm(true));
-            kind.fieldList.add(new EditField(StructuredName.GIVEN_NAME, R.string.name_given,
-                    FLAGS_PERSON_NAME).setLongForm(true));
-            kind.fieldList.add(new EditField(StructuredName.SUFFIX, R.string.name_suffix,
-                    FLAGS_PERSON_NAME).setLongForm(true));
-        } else {
-            kind.fieldList.add(new EditField(StructuredName.PREFIX, R.string.name_prefix,
-                    FLAGS_PERSON_NAME).setLongForm(true));
-            kind.fieldList.add(new EditField(StructuredName.GIVEN_NAME, R.string.name_given,
-                    FLAGS_PERSON_NAME).setLongForm(true));
-            kind.fieldList.add(new EditField(StructuredName.MIDDLE_NAME, R.string.name_middle,
-                    FLAGS_PERSON_NAME).setLongForm(true));
-            kind.fieldList.add(new EditField(StructuredName.FAMILY_NAME, R.string.name_family,
-                    FLAGS_PERSON_NAME).setLongForm(true));
-            kind.fieldList.add(new EditField(StructuredName.SUFFIX, R.string.name_suffix,
-                    FLAGS_PERSON_NAME).setLongForm(true));
-        }
-
-        return kind;
-    }
-
-    protected DataKind addDataKindPhoneticName(Context context) throws DefinitionException {
-        DataKind kind = addKind(new DataKind(DataKind.PSEUDO_MIME_TYPE_PHONETIC_NAME,
-                R.string.name_phonetic, -1, true, R.layout.phonetic_name_editor_view));
-        kind.actionHeader = new SimpleInflater(R.string.nameLabelsGroup);
-        kind.actionBody = new SimpleInflater(Nickname.NAME);
-        kind.typeOverallMax = 1;
-
-        kind.fieldList = Lists.newArrayList();
-        kind.fieldList.add(new EditField(DataKind.PSEUDO_COLUMN_PHONETIC_NAME,
-                R.string.name_phonetic, FLAGS_PHONETIC).setShortForm(true));
-        kind.fieldList.add(new EditField(StructuredName.PHONETIC_FAMILY_NAME,
-                R.string.name_phonetic_family, FLAGS_PHONETIC).setLongForm(true));
-        kind.fieldList.add(new EditField(StructuredName.PHONETIC_MIDDLE_NAME,
-                R.string.name_phonetic_middle, FLAGS_PHONETIC).setLongForm(true));
-        kind.fieldList.add(new EditField(StructuredName.PHONETIC_GIVEN_NAME,
-                R.string.name_phonetic_given, FLAGS_PHONETIC).setLongForm(true));
-
-        return kind;
-    }
-
-    protected DataKind addDataKindNickname(Context context) throws DefinitionException {
-        DataKind kind = addKind(new DataKind(Nickname.CONTENT_ITEM_TYPE,
-                    R.string.nicknameLabelsGroup, 115, true, R.layout.text_fields_editor_view));
-        kind.typeOverallMax = 1;
-        kind.actionHeader = new SimpleInflater(R.string.nicknameLabelsGroup);
-        kind.actionBody = new SimpleInflater(Nickname.NAME);
-        kind.defaultValues = new ContentValues();
-        kind.defaultValues.put(Nickname.TYPE, Nickname.TYPE_DEFAULT);
-
-        kind.fieldList = Lists.newArrayList();
-        kind.fieldList.add(new EditField(Nickname.NAME, R.string.nicknameLabelsGroup,
-                FLAGS_PERSON_NAME));
-
-        return kind;
-    }
-
-    protected DataKind addDataKindPhone(Context context) throws DefinitionException {
-        DataKind kind = addKind(new DataKind(Phone.CONTENT_ITEM_TYPE, R.string.phoneLabelsGroup,
-                10, true, R.layout.text_fields_editor_view));
-        kind.iconAltRes = R.drawable.ic_text_holo_light;
-        kind.iconAltDescriptionRes = R.string.sms;
-        kind.actionHeader = new PhoneActionInflater();
-        kind.actionAltHeader = new PhoneActionAltInflater();
-        kind.actionBody = new SimpleInflater(Phone.NUMBER);
-        kind.typeColumn = Phone.TYPE;
-        kind.typeList = Lists.newArrayList();
-        kind.typeList.add(buildPhoneType(Phone.TYPE_MOBILE));
-        kind.typeList.add(buildPhoneType(Phone.TYPE_HOME));
-        kind.typeList.add(buildPhoneType(Phone.TYPE_WORK));
-        kind.typeList.add(buildPhoneType(Phone.TYPE_FAX_WORK).setSecondary(true));
-        kind.typeList.add(buildPhoneType(Phone.TYPE_FAX_HOME).setSecondary(true));
-        kind.typeList.add(buildPhoneType(Phone.TYPE_PAGER).setSecondary(true));
-        kind.typeList.add(buildPhoneType(Phone.TYPE_OTHER));
-        kind.typeList.add(
-                buildPhoneType(Phone.TYPE_CUSTOM).setSecondary(true).setCustomColumn(Phone.LABEL));
-        kind.typeList.add(buildPhoneType(Phone.TYPE_CALLBACK).setSecondary(true));
-        kind.typeList.add(buildPhoneType(Phone.TYPE_CAR).setSecondary(true));
-        kind.typeList.add(buildPhoneType(Phone.TYPE_COMPANY_MAIN).setSecondary(true));
-        kind.typeList.add(buildPhoneType(Phone.TYPE_ISDN).setSecondary(true));
-        kind.typeList.add(buildPhoneType(Phone.TYPE_MAIN).setSecondary(true));
-        kind.typeList.add(buildPhoneType(Phone.TYPE_OTHER_FAX).setSecondary(true));
-        kind.typeList.add(buildPhoneType(Phone.TYPE_RADIO).setSecondary(true));
-        kind.typeList.add(buildPhoneType(Phone.TYPE_TELEX).setSecondary(true));
-        kind.typeList.add(buildPhoneType(Phone.TYPE_TTY_TDD).setSecondary(true));
-        kind.typeList.add(buildPhoneType(Phone.TYPE_WORK_MOBILE).setSecondary(true));
-        kind.typeList.add(buildPhoneType(Phone.TYPE_WORK_PAGER).setSecondary(true));
-        kind.typeList.add(buildPhoneType(Phone.TYPE_ASSISTANT).setSecondary(true));
-        kind.typeList.add(buildPhoneType(Phone.TYPE_MMS).setSecondary(true));
-
-        kind.fieldList = Lists.newArrayList();
-        kind.fieldList.add(new EditField(Phone.NUMBER, R.string.phoneLabelsGroup, FLAGS_PHONE));
-
-        return kind;
-    }
-
-    protected DataKind addDataKindEmail(Context context) throws DefinitionException {
-        DataKind kind = addKind(new DataKind(Email.CONTENT_ITEM_TYPE, R.string.emailLabelsGroup,
-                15, true, R.layout.text_fields_editor_view));
-        kind.actionHeader = new EmailActionInflater();
-        kind.actionBody = new SimpleInflater(Email.DATA);
-        kind.typeColumn = Email.TYPE;
-        kind.typeList = Lists.newArrayList();
-        kind.typeList.add(buildEmailType(Email.TYPE_HOME));
-        kind.typeList.add(buildEmailType(Email.TYPE_WORK));
-        kind.typeList.add(buildEmailType(Email.TYPE_OTHER));
-        kind.typeList.add(buildEmailType(Email.TYPE_MOBILE));
-        kind.typeList.add(
-                buildEmailType(Email.TYPE_CUSTOM).setSecondary(true).setCustomColumn(Email.LABEL));
-
-        kind.fieldList = Lists.newArrayList();
-        kind.fieldList.add(new EditField(Email.DATA, R.string.emailLabelsGroup, FLAGS_EMAIL));
-
-        return kind;
-    }
-
-    protected DataKind addDataKindStructuredPostal(Context context) throws DefinitionException {
-        DataKind kind = addKind(new DataKind(StructuredPostal.CONTENT_ITEM_TYPE,
-                R.string.postalLabelsGroup, 25, true, R.layout.text_fields_editor_view));
-        kind.actionHeader = new PostalActionInflater();
-        kind.actionBody = new SimpleInflater(StructuredPostal.FORMATTED_ADDRESS);
-        kind.typeColumn = StructuredPostal.TYPE;
-        kind.typeList = Lists.newArrayList();
-        kind.typeList.add(buildPostalType(StructuredPostal.TYPE_HOME));
-        kind.typeList.add(buildPostalType(StructuredPostal.TYPE_WORK));
-        kind.typeList.add(buildPostalType(StructuredPostal.TYPE_OTHER));
-        kind.typeList.add(buildPostalType(StructuredPostal.TYPE_CUSTOM).setSecondary(true)
-                .setCustomColumn(StructuredPostal.LABEL));
-
-        kind.fieldList = Lists.newArrayList();
-        kind.fieldList.add(
-                new EditField(StructuredPostal.FORMATTED_ADDRESS, R.string.postal_address,
-                        FLAGS_POSTAL));
-
-        kind.maxLinesForDisplay = MAX_LINES_FOR_POSTAL_ADDRESS;
-
-        return kind;
-    }
-
-    protected DataKind addDataKindIm(Context context) throws DefinitionException {
-        DataKind kind = addKind(new DataKind(Im.CONTENT_ITEM_TYPE, R.string.imLabelsGroup, 20, true,
-                    R.layout.text_fields_editor_view));
-        kind.actionHeader = new ImActionInflater();
-        kind.actionBody = new SimpleInflater(Im.DATA);
-
-        // NOTE: even though a traditional "type" exists, for editing
-        // purposes we're using the protocol to pick labels
-
-        kind.defaultValues = new ContentValues();
-        kind.defaultValues.put(Im.TYPE, Im.TYPE_OTHER);
-
-        kind.typeColumn = Im.PROTOCOL;
-        kind.typeList = Lists.newArrayList();
-        kind.typeList.add(buildImType(Im.PROTOCOL_AIM));
-        kind.typeList.add(buildImType(Im.PROTOCOL_MSN));
-        kind.typeList.add(buildImType(Im.PROTOCOL_YAHOO));
-        kind.typeList.add(buildImType(Im.PROTOCOL_SKYPE));
-        kind.typeList.add(buildImType(Im.PROTOCOL_QQ));
-        kind.typeList.add(buildImType(Im.PROTOCOL_GOOGLE_TALK));
-        kind.typeList.add(buildImType(Im.PROTOCOL_ICQ));
-        kind.typeList.add(buildImType(Im.PROTOCOL_JABBER));
-        kind.typeList.add(buildImType(Im.PROTOCOL_CUSTOM).setSecondary(true).setCustomColumn(
-                Im.CUSTOM_PROTOCOL));
-
-        kind.fieldList = Lists.newArrayList();
-        kind.fieldList.add(new EditField(Im.DATA, R.string.imLabelsGroup, FLAGS_EMAIL));
-
-        return kind;
-    }
-
-    protected DataKind addDataKindOrganization(Context context) throws DefinitionException {
-        DataKind kind = addKind(new DataKind(Organization.CONTENT_ITEM_TYPE,
-                    R.string.organizationLabelsGroup, 5, true,
-                    R.layout.text_fields_editor_view));
-        kind.actionHeader = new SimpleInflater(Organization.COMPANY);
-        kind.actionBody = new SimpleInflater(Organization.TITLE);
-        kind.typeOverallMax = 1;
-
-        kind.fieldList = Lists.newArrayList();
-        kind.fieldList.add(new EditField(Organization.COMPANY, R.string.ghostData_company,
-                FLAGS_GENERIC_NAME));
-        kind.fieldList.add(new EditField(Organization.TITLE, R.string.ghostData_title,
-                FLAGS_GENERIC_NAME));
-
-        return kind;
-    }
-
-    protected DataKind addDataKindPhoto(Context context) throws DefinitionException {
-        DataKind kind = addKind(new DataKind(Photo.CONTENT_ITEM_TYPE, -1, -1, true, -1));
-        kind.typeOverallMax = 1;
-        kind.fieldList = Lists.newArrayList();
-        kind.fieldList.add(new EditField(Photo.PHOTO, -1, -1));
-        return kind;
-    }
-
-    protected DataKind addDataKindNote(Context context) throws DefinitionException {
-        DataKind kind = addKind(new DataKind(Note.CONTENT_ITEM_TYPE,
-                    R.string.label_notes, 110, true, R.layout.text_fields_editor_view));
-        kind.typeOverallMax = 1;
-        kind.actionHeader = new SimpleInflater(R.string.label_notes);
-        kind.actionBody = new SimpleInflater(Note.NOTE);
-        kind.fieldList = Lists.newArrayList();
-        kind.fieldList.add(new EditField(Note.NOTE, R.string.label_notes, FLAGS_NOTE));
-
-        kind.maxLinesForDisplay = MAX_LINES_FOR_NOTE;
-
-        return kind;
-    }
-
-    protected DataKind addDataKindWebsite(Context context) throws DefinitionException {
-        DataKind kind = addKind(new DataKind(Website.CONTENT_ITEM_TYPE,
-                R.string.websiteLabelsGroup, 120, true, R.layout.text_fields_editor_view));
-        kind.actionHeader = new SimpleInflater(R.string.websiteLabelsGroup);
-        kind.actionBody = new SimpleInflater(Website.URL);
-        kind.defaultValues = new ContentValues();
-        kind.defaultValues.put(Website.TYPE, Website.TYPE_OTHER);
-
-        kind.fieldList = Lists.newArrayList();
-        kind.fieldList.add(new EditField(Website.URL, R.string.websiteLabelsGroup, FLAGS_WEBSITE));
-
-        return kind;
-    }
-
-    protected DataKind addDataKindSipAddress(Context context) throws DefinitionException {
-        DataKind kind = addKind(new DataKind(SipAddress.CONTENT_ITEM_TYPE,
-                    R.string.label_sip_address, 130, true, R.layout.text_fields_editor_view));
-
-        kind.typeOverallMax = 1;
-        kind.actionHeader = new SimpleInflater(R.string.label_sip_address);
-        kind.actionBody = new SimpleInflater(SipAddress.SIP_ADDRESS);
-        kind.fieldList = Lists.newArrayList();
-        kind.fieldList.add(new EditField(SipAddress.SIP_ADDRESS,
-                                         R.string.label_sip_address, FLAGS_SIP_ADDRESS));
-
-        return kind;
-    }
-
-    protected DataKind addDataKindGroupMembership(Context context) throws DefinitionException {
-        DataKind kind = addKind(new DataKind(GroupMembership.CONTENT_ITEM_TYPE,
-                R.string.groupsLabel, 999, true, -1));
-
-        kind.typeOverallMax = 1;
-        kind.fieldList = Lists.newArrayList();
-        kind.fieldList.add(new EditField(GroupMembership.GROUP_ROW_ID, -1, -1));
-
-        kind.maxLinesForDisplay = MAX_LINES_FOR_GROUP;
-
-        return kind;
-    }
-
-    /**
-     * Simple inflater that assumes a string resource has a "%s" that will be
-     * filled from the given column.
-     */
-    public static class SimpleInflater implements StringInflater {
-        private final int mStringRes;
-        private final String mColumnName;
-
-        public SimpleInflater(int stringRes) {
-            this(stringRes, null);
-        }
-
-        public SimpleInflater(String columnName) {
-            this(-1, columnName);
-        }
-
-        public SimpleInflater(int stringRes, String columnName) {
-            mStringRes = stringRes;
-            mColumnName = columnName;
-        }
-
-        @Override
-        public CharSequence inflateUsing(Context context, ContentValues values) {
-            final boolean validColumn = values.containsKey(mColumnName);
-            final boolean validString = mStringRes > 0;
-
-            final CharSequence stringValue = validString ? context.getText(mStringRes) : null;
-            final CharSequence columnValue = validColumn ? values.getAsString(mColumnName) : null;
-
-            if (validString && validColumn) {
-                return String.format(stringValue.toString(), columnValue);
-            } else if (validString) {
-                return stringValue;
-            } else if (validColumn) {
-                return columnValue;
-            } else {
-                return null;
-            }
-        }
-
-        @Override
-        public String toString() {
-            return this.getClass().getSimpleName()
-                    + " mStringRes=" + mStringRes
-                    + " mColumnName" + mColumnName;
-        }
-
-        @NeededForTesting
-        public String getColumnNameForTest() {
-            return mColumnName;
-        }
-    }
-
-    public static abstract class CommonInflater implements StringInflater {
-        protected abstract int getTypeLabelResource(Integer type);
-
-        protected boolean isCustom(Integer type) {
-            return type == BaseTypes.TYPE_CUSTOM;
-        }
-
-        protected String getTypeColumn() {
-            return Phone.TYPE;
-        }
-
-        protected String getLabelColumn() {
-            return Phone.LABEL;
-        }
-
-        protected CharSequence getTypeLabel(Resources res, Integer type, CharSequence label) {
-            final int labelRes = getTypeLabelResource(type);
-            if (type == null) {
-                return res.getText(labelRes);
-            } else if (isCustom(type)) {
-                return res.getString(labelRes, label == null ? "" : label);
-            } else {
-                return res.getText(labelRes);
-            }
-        }
-
-        @Override
-        public CharSequence inflateUsing(Context context, ContentValues values) {
-            final Integer type = values.getAsInteger(getTypeColumn());
-            final String label = values.getAsString(getLabelColumn());
-            return getTypeLabel(context.getResources(), type, label);
-        }
-
-        @Override
-        public String toString() {
-            return this.getClass().getSimpleName();
-        }
-    }
-
-    public static class PhoneActionInflater extends CommonInflater {
-        @Override
-        protected boolean isCustom(Integer type) {
-            return ContactDisplayUtils.isCustomPhoneType(type);
-        }
-
-        @Override
-        protected int getTypeLabelResource(Integer type) {
-            return ContactDisplayUtils.getPhoneLabelResourceId(type);
-        }
-    }
-
-    public static class PhoneActionAltInflater extends CommonInflater {
-        @Override
-        protected boolean isCustom(Integer type) {
-            return ContactDisplayUtils.isCustomPhoneType(type);
-        }
-
-        @Override
-        protected int getTypeLabelResource(Integer type) {
-            return ContactDisplayUtils.getSmsLabelResourceId(type);
-        }
-    }
-
-    public static class EmailActionInflater extends CommonInflater {
-        @Override
-        protected int getTypeLabelResource(Integer type) {
-            if (type == null) return R.string.email;
-            switch (type) {
-                case Email.TYPE_HOME: return R.string.email_home;
-                case Email.TYPE_WORK: return R.string.email_work;
-                case Email.TYPE_OTHER: return R.string.email_other;
-                case Email.TYPE_MOBILE: return R.string.email_mobile;
-                default: return R.string.email_custom;
-            }
-        }
-    }
-
-    public static class EventActionInflater extends CommonInflater {
-        @Override
-        protected int getTypeLabelResource(Integer type) {
-            return Event.getTypeResource(type);
-        }
-    }
-
-    public static class RelationActionInflater extends CommonInflater {
-        @Override
-        protected int getTypeLabelResource(Integer type) {
-            return Relation.getTypeLabelResource(type == null ? Relation.TYPE_CUSTOM : type);
-        }
-    }
-
-    public static class PostalActionInflater extends CommonInflater {
-        @Override
-        protected int getTypeLabelResource(Integer type) {
-            if (type == null) return R.string.map_other;
-            switch (type) {
-                case StructuredPostal.TYPE_HOME: return R.string.map_home;
-                case StructuredPostal.TYPE_WORK: return R.string.map_work;
-                case StructuredPostal.TYPE_OTHER: return R.string.map_other;
-                default: return R.string.map_custom;
-            }
-        }
-    }
-
-    public static class ImActionInflater extends CommonInflater {
-        @Override
-        protected String getTypeColumn() {
-            return Im.PROTOCOL;
-        }
-
-        @Override
-        protected String getLabelColumn() {
-            return Im.CUSTOM_PROTOCOL;
-        }
-
-        @Override
-        protected int getTypeLabelResource(Integer type) {
-            if (type == null) return R.string.chat;
-            switch (type) {
-                case Im.PROTOCOL_AIM: return R.string.chat_aim;
-                case Im.PROTOCOL_MSN: return R.string.chat_msn;
-                case Im.PROTOCOL_YAHOO: return R.string.chat_yahoo;
-                case Im.PROTOCOL_SKYPE: return R.string.chat_skype;
-                case Im.PROTOCOL_QQ: return R.string.chat_qq;
-                case Im.PROTOCOL_GOOGLE_TALK: return R.string.chat_gtalk;
-                case Im.PROTOCOL_ICQ: return R.string.chat_icq;
-                case Im.PROTOCOL_JABBER: return R.string.chat_jabber;
-                case Im.PROTOCOL_NETMEETING: return R.string.chat;
-                default: return R.string.chat;
-            }
-        }
-    }
-
-    @Override
-    public boolean isGroupMembershipEditable() {
-        return false;
-    }
-
-    /**
-     * Parses the content of the EditSchema tag in contacts.xml.
-     */
-    protected final void parseEditSchema(Context context, XmlPullParser parser, AttributeSet attrs)
-            throws XmlPullParserException, IOException, DefinitionException {
-
-        final int outerDepth = parser.getDepth();
-        int type;
-        while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
-                && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
-            final int depth = parser.getDepth();
-            if (type != XmlPullParser.START_TAG || depth != outerDepth + 1) {
-                continue; // Not direct child tag
-            }
-
-            final String tag = parser.getName();
-
-            if (Tag.DATA_KIND.equals(tag)) {
-                for (DataKind kind : KindParser.INSTANCE.parseDataKindTag(context, parser, attrs)) {
-                    addKind(kind);
-                }
-            } else {
-                Log.w(TAG, "Skipping unknown tag " + tag);
-            }
-        }
-    }
-
-    // Utility methods to keep code shorter.
-    private static boolean getAttr(AttributeSet attrs, String attribute, boolean defaultValue) {
-        return attrs.getAttributeBooleanValue(null, attribute, defaultValue);
-    }
-
-    private static int getAttr(AttributeSet attrs, String attribute, int defaultValue) {
-        return attrs.getAttributeIntValue(null, attribute, defaultValue);
-    }
-
-    private static String getAttr(AttributeSet attrs, String attribute) {
-        return attrs.getAttributeValue(null, attribute);
-    }
-
-    // TODO Extract it to its own class, and move all KindBuilders to it as well.
-    private static class KindParser {
-        public static final KindParser INSTANCE = new KindParser();
-
-        private final Map<String, KindBuilder> mBuilders = Maps.newHashMap();
-
-        private KindParser() {
-            addBuilder(new NameKindBuilder());
-            addBuilder(new NicknameKindBuilder());
-            addBuilder(new PhoneKindBuilder());
-            addBuilder(new EmailKindBuilder());
-            addBuilder(new StructuredPostalKindBuilder());
-            addBuilder(new ImKindBuilder());
-            addBuilder(new OrganizationKindBuilder());
-            addBuilder(new PhotoKindBuilder());
-            addBuilder(new NoteKindBuilder());
-            addBuilder(new WebsiteKindBuilder());
-            addBuilder(new SipAddressKindBuilder());
-            addBuilder(new GroupMembershipKindBuilder());
-            addBuilder(new EventKindBuilder());
-            addBuilder(new RelationshipKindBuilder());
-        }
-
-        private void addBuilder(KindBuilder builder) {
-            mBuilders.put(builder.getTagName(), builder);
-        }
-
-        /**
-         * Takes a {@link XmlPullParser} at the start of a DataKind tag, parses it and returns
-         * {@link DataKind}s.  (Usually just one, but there are three for the "name" kind.)
-         *
-         * This method returns a list, because we need to add 3 kinds for the name data kind.
-         * (structured, display and phonetic)
-         */
-        public List<DataKind> parseDataKindTag(Context context, XmlPullParser parser,
-                AttributeSet attrs)
-                throws DefinitionException, XmlPullParserException, IOException {
-            final String kind = getAttr(attrs, Attr.KIND);
-            final KindBuilder builder = mBuilders.get(kind);
-            if (builder != null) {
-                return builder.parseDataKind(context, parser, attrs);
-            } else {
-                throw new DefinitionException("Undefined data kind '" + kind + "'");
-            }
-        }
-    }
-
-    private static abstract class KindBuilder {
-
-        public abstract String getTagName();
-
-        /**
-         * DataKind tag parser specific to each kind.  Subclasses must implement it.
-         */
-        public abstract List<DataKind> parseDataKind(Context context, XmlPullParser parser,
-                AttributeSet attrs) throws DefinitionException, XmlPullParserException, IOException;
-
-        /**
-         * Creates a new {@link DataKind}, and also parses the child Type tags in the DataKind
-         * tag.
-         */
-        protected final DataKind newDataKind(Context context, XmlPullParser parser,
-                AttributeSet attrs, boolean isPseudo, String mimeType, String typeColumn,
-                int titleRes, int weight, int editorLayoutResourceId,
-                StringInflater actionHeader, StringInflater actionBody)
-                throws DefinitionException, XmlPullParserException, IOException {
-
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                Log.d(TAG, "Adding DataKind: " + mimeType);
-            }
-
-            final DataKind kind = new DataKind(mimeType, titleRes, weight, true,
-                    editorLayoutResourceId);
-            kind.typeColumn = typeColumn;
-            kind.actionHeader = actionHeader;
-            kind.actionBody = actionBody;
-            kind.fieldList = Lists.newArrayList();
-
-            // Get more information from the tag...
-            // A pseudo data kind doesn't have corresponding tag the XML, so we skip this.
-            if (!isPseudo) {
-                kind.typeOverallMax = getAttr(attrs, Attr.MAX_OCCURRENCE, -1);
-
-                // Process "Type" tags.
-                // If a kind has the type column, contacts.xml must have at least one type
-                // definition.  Otherwise, it mustn't have a type definition.
-                if (kind.typeColumn != null) {
-                    // Parse and add types.
-                    kind.typeList = Lists.newArrayList();
-                    parseTypes(context, parser, attrs, kind, true);
-                    if (kind.typeList.size() == 0) {
-                        throw new DefinitionException(
-                                "Kind " + kind.mimeType + " must have at least one type");
-                    }
-                } else {
-                    // Make sure it has no types.
-                    parseTypes(context, parser, attrs, kind, false /* can't have types */);
-                }
-            }
-
-            return kind;
-        }
-
-        /**
-         * Parses Type elements in a DataKind element, and if {@code canHaveTypes} is true adds
-         * them to the given {@link DataKind}. Otherwise the {@link DataKind} can't have a type,
-         * so throws {@link DefinitionException}.
-         */
-        private void parseTypes(Context context, XmlPullParser parser, AttributeSet attrs,
-                DataKind kind, boolean canHaveTypes)
-                throws DefinitionException, XmlPullParserException, IOException {
-            final int outerDepth = parser.getDepth();
-            int type;
-            while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
-                    && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
-                final int depth = parser.getDepth();
-                if (type != XmlPullParser.START_TAG || depth != outerDepth + 1) {
-                    continue; // Not direct child tag
-                }
-
-                final String tag = parser.getName();
-                if (Tag.TYPE.equals(tag)) {
-                    if (canHaveTypes) {
-                        kind.typeList.add(parseTypeTag(parser, attrs, kind));
-                    } else {
-                        throw new DefinitionException(
-                                "Kind " + kind.mimeType + " can't have types");
-                    }
-                } else {
-                    throw new DefinitionException("Unknown tag: " + tag);
-                }
-            }
-        }
-
-        /**
-         * Parses a single Type element and returns an {@link EditType} built from it.  Uses
-         * {@link #buildEditTypeForTypeTag} defined in subclasses to actually build an
-         * {@link EditType}.
-         */
-        private EditType parseTypeTag(XmlPullParser parser, AttributeSet attrs, DataKind kind)
-                throws DefinitionException {
-
-            final String typeName = getAttr(attrs, Attr.TYPE);
-
-            final EditType et = buildEditTypeForTypeTag(attrs, typeName);
-            if (et == null) {
-                throw new DefinitionException(
-                        "Undefined type '" + typeName + "' for data kind '" + kind.mimeType + "'");
-            }
-            et.specificMax = getAttr(attrs, Attr.MAX_OCCURRENCE, -1);
-
-            return et;
-        }
-
-        /**
-         * Returns an {@link EditType} for the given "type".  Subclasses may optionally use
-         * the attributes in the tag to set optional values.
-         * (e.g. "yearOptional" for the event kind)
-         */
-        protected EditType buildEditTypeForTypeTag(AttributeSet attrs, String type) {
-            return null;
-        }
-
-        protected final void throwIfList(DataKind kind) throws DefinitionException {
-            if (kind.typeOverallMax != 1) {
-                throw new DefinitionException(
-                        "Kind " + kind.mimeType + " must have 'overallMax=\"1\"'");
-            }
-        }
-    }
-
-    /**
-     * DataKind parser for Name. (structured, display, phonetic)
-     */
-    private static class NameKindBuilder extends KindBuilder {
-        @Override
-        public String getTagName() {
-            return "name";
-        }
-
-        private static void checkAttributeTrue(boolean value, String attrName)
-                throws DefinitionException {
-            if (!value) {
-                throw new DefinitionException(attrName + " must be true");
-            }
-        }
-
-        @Override
-        public List<DataKind> parseDataKind(Context context, XmlPullParser parser,
-                AttributeSet attrs) throws DefinitionException, XmlPullParserException,
-                IOException {
-
-            // Build 3 data kinds:
-            // - StructuredName.CONTENT_ITEM_TYPE
-            // - DataKind.PSEUDO_MIME_TYPE_DISPLAY_NAME
-            // - DataKind.PSEUDO_MIME_TYPE_PHONETIC_NAME
-
-            final boolean displayOrderPrimary =
-                    context.getResources().getBoolean(R.bool.config_editor_field_order_primary);
-
-            final boolean supportsDisplayName = getAttr(attrs, "supportsDisplayName", false);
-            final boolean supportsPrefix = getAttr(attrs, "supportsPrefix", false);
-            final boolean supportsMiddleName = getAttr(attrs, "supportsMiddleName", false);
-            final boolean supportsSuffix = getAttr(attrs, "supportsSuffix", false);
-            final boolean supportsPhoneticFamilyName =
-                    getAttr(attrs, "supportsPhoneticFamilyName", false);
-            final boolean supportsPhoneticMiddleName =
-                    getAttr(attrs, "supportsPhoneticMiddleName", false);
-            final boolean supportsPhoneticGivenName =
-                    getAttr(attrs, "supportsPhoneticGivenName", false);
-
-            // For now, every things must be supported.
-            checkAttributeTrue(supportsDisplayName, "supportsDisplayName");
-            checkAttributeTrue(supportsPrefix, "supportsPrefix");
-            checkAttributeTrue(supportsMiddleName, "supportsMiddleName");
-            checkAttributeTrue(supportsSuffix, "supportsSuffix");
-            checkAttributeTrue(supportsPhoneticFamilyName, "supportsPhoneticFamilyName");
-            checkAttributeTrue(supportsPhoneticMiddleName, "supportsPhoneticMiddleName");
-            checkAttributeTrue(supportsPhoneticGivenName, "supportsPhoneticGivenName");
-
-            final List<DataKind> kinds = Lists.newArrayList();
-
-            // Structured name
-            final DataKind ks = newDataKind(context, parser, attrs, false,
-                    StructuredName.CONTENT_ITEM_TYPE, null, R.string.nameLabelsGroup, Weight.NONE,
-                    R.layout.structured_name_editor_view,
-                    new SimpleInflater(R.string.nameLabelsGroup),
-                    new SimpleInflater(Nickname.NAME));
-
-            throwIfList(ks);
-            kinds.add(ks);
-
-            // Note about setLongForm/setShortForm below.
-            // We need to set this only when the type supports display name. (=supportsDisplayName)
-            // Otherwise (i.e. Exchange) we don't set these flags, but instead make some fields
-            // "optional".
-
-            ks.fieldList.add(new EditField(StructuredName.DISPLAY_NAME, R.string.full_name,
-                    FLAGS_PERSON_NAME));
-            ks.fieldList.add(new EditField(StructuredName.PREFIX, R.string.name_prefix,
-                    FLAGS_PERSON_NAME).setLongForm(true));
-            ks.fieldList.add(new EditField(StructuredName.FAMILY_NAME, R.string.name_family,
-                    FLAGS_PERSON_NAME).setLongForm(true));
-            ks.fieldList.add(new EditField(StructuredName.MIDDLE_NAME, R.string.name_middle,
-                    FLAGS_PERSON_NAME).setLongForm(true));
-            ks.fieldList.add(new EditField(StructuredName.GIVEN_NAME, R.string.name_given,
-                    FLAGS_PERSON_NAME).setLongForm(true));
-            ks.fieldList.add(new EditField(StructuredName.SUFFIX, R.string.name_suffix,
-                    FLAGS_PERSON_NAME).setLongForm(true));
-            ks.fieldList.add(new EditField(StructuredName.PHONETIC_FAMILY_NAME,
-                    R.string.name_phonetic_family, FLAGS_PHONETIC));
-            ks.fieldList.add(new EditField(StructuredName.PHONETIC_MIDDLE_NAME,
-                    R.string.name_phonetic_middle, FLAGS_PHONETIC));
-            ks.fieldList.add(new EditField(StructuredName.PHONETIC_GIVEN_NAME,
-                    R.string.name_phonetic_given, FLAGS_PHONETIC));
-
-            // Display name
-            final DataKind kd = newDataKind(context, parser, attrs, true,
-                    DataKind.PSEUDO_MIME_TYPE_DISPLAY_NAME, null,
-                    R.string.nameLabelsGroup, Weight.NONE, R.layout.text_fields_editor_view,
-                    new SimpleInflater(R.string.nameLabelsGroup),
-                    new SimpleInflater(Nickname.NAME));
-            kd.typeOverallMax = 1;
-            kinds.add(kd);
-
-            kd.fieldList.add(new EditField(StructuredName.DISPLAY_NAME,
-                    R.string.full_name, FLAGS_PERSON_NAME).setShortForm(true));
-
-            if (!displayOrderPrimary) {
-                kd.fieldList.add(new EditField(StructuredName.PREFIX, R.string.name_prefix,
-                        FLAGS_PERSON_NAME).setLongForm(true));
-                kd.fieldList.add(new EditField(StructuredName.FAMILY_NAME, R.string.name_family,
-                        FLAGS_PERSON_NAME).setLongForm(true));
-                kd.fieldList.add(new EditField(StructuredName.MIDDLE_NAME, R.string.name_middle,
-                        FLAGS_PERSON_NAME).setLongForm(true));
-                kd.fieldList.add(new EditField(StructuredName.GIVEN_NAME, R.string.name_given,
-                        FLAGS_PERSON_NAME).setLongForm(true));
-                kd.fieldList.add(new EditField(StructuredName.SUFFIX, R.string.name_suffix,
-                        FLAGS_PERSON_NAME).setLongForm(true));
-            } else {
-                kd.fieldList.add(new EditField(StructuredName.PREFIX, R.string.name_prefix,
-                        FLAGS_PERSON_NAME).setLongForm(true));
-                kd.fieldList.add(new EditField(StructuredName.GIVEN_NAME, R.string.name_given,
-                        FLAGS_PERSON_NAME).setLongForm(true));
-                kd.fieldList.add(new EditField(StructuredName.MIDDLE_NAME, R.string.name_middle,
-                        FLAGS_PERSON_NAME).setLongForm(true));
-                kd.fieldList.add(new EditField(StructuredName.FAMILY_NAME, R.string.name_family,
-                        FLAGS_PERSON_NAME).setLongForm(true));
-                kd.fieldList.add(new EditField(StructuredName.SUFFIX, R.string.name_suffix,
-                        FLAGS_PERSON_NAME).setLongForm(true));
-            }
-
-            // Phonetic name
-            final DataKind kp = newDataKind(context, parser, attrs, true,
-                    DataKind.PSEUDO_MIME_TYPE_PHONETIC_NAME, null,
-                    R.string.name_phonetic, Weight.NONE, R.layout.phonetic_name_editor_view,
-                    new SimpleInflater(R.string.nameLabelsGroup),
-                    new SimpleInflater(Nickname.NAME));
-            kp.typeOverallMax = 1;
-            kinds.add(kp);
-
-            // We may want to change the order depending on displayOrderPrimary too.
-            kp.fieldList.add(new EditField(DataKind.PSEUDO_COLUMN_PHONETIC_NAME,
-                    R.string.name_phonetic, FLAGS_PHONETIC).setShortForm(true));
-            kp.fieldList.add(new EditField(StructuredName.PHONETIC_FAMILY_NAME,
-                    R.string.name_phonetic_family, FLAGS_PHONETIC).setLongForm(true));
-            kp.fieldList.add(new EditField(StructuredName.PHONETIC_MIDDLE_NAME,
-                    R.string.name_phonetic_middle, FLAGS_PHONETIC).setLongForm(true));
-            kp.fieldList.add(new EditField(StructuredName.PHONETIC_GIVEN_NAME,
-                    R.string.name_phonetic_given, FLAGS_PHONETIC).setLongForm(true));
-            return kinds;
-        }
-    }
-
-    private static class NicknameKindBuilder extends KindBuilder {
-        @Override
-        public String getTagName() {
-            return "nickname";
-        }
-
-        @Override
-        public List<DataKind> parseDataKind(Context context, XmlPullParser parser,
-                AttributeSet attrs) throws DefinitionException, XmlPullParserException,
-                IOException {
-            final DataKind kind = newDataKind(context, parser, attrs, false,
-                    Nickname.CONTENT_ITEM_TYPE, null, R.string.nicknameLabelsGroup, Weight.NICKNAME,
-                    R.layout.text_fields_editor_view,
-                    new SimpleInflater(R.string.nicknameLabelsGroup),
-                    new SimpleInflater(Nickname.NAME));
-
-            kind.fieldList.add(new EditField(Nickname.NAME, R.string.nicknameLabelsGroup,
-                    FLAGS_PERSON_NAME));
-
-            kind.defaultValues = new ContentValues();
-            kind.defaultValues.put(Nickname.TYPE, Nickname.TYPE_DEFAULT);
-
-            throwIfList(kind);
-            return Lists.newArrayList(kind);
-        }
-    }
-
-    private static class PhoneKindBuilder extends KindBuilder {
-        @Override
-        public String getTagName() {
-            return "phone";
-        }
-
-        @Override
-        public List<DataKind> parseDataKind(Context context, XmlPullParser parser,
-                AttributeSet attrs) throws DefinitionException, XmlPullParserException,
-                IOException {
-            final DataKind kind = newDataKind(context, parser, attrs, false,
-                    Phone.CONTENT_ITEM_TYPE, Phone.TYPE, R.string.phoneLabelsGroup, Weight.PHONE,
-                    R.layout.text_fields_editor_view,
-                    new PhoneActionInflater(), new SimpleInflater(Phone.NUMBER));
-
-            kind.iconAltRes = R.drawable.ic_text_holo_light;
-            kind.iconAltDescriptionRes = R.string.sms;
-            kind.actionAltHeader = new PhoneActionAltInflater();
-
-            kind.fieldList.add(new EditField(Phone.NUMBER, R.string.phoneLabelsGroup, FLAGS_PHONE));
-
-            return Lists.newArrayList(kind);
-        }
-
-        /** Just to avoid line-wrapping... */
-        protected static EditType build(int type, boolean secondary) {
-            return new EditType(type, Phone.getTypeLabelResource(type)).setSecondary(secondary);
-        }
-
-        @Override
-        protected EditType buildEditTypeForTypeTag(AttributeSet attrs, String type) {
-            if ("home".equals(type)) return build(Phone.TYPE_HOME, false);
-            if ("mobile".equals(type)) return build(Phone.TYPE_MOBILE, false);
-            if ("work".equals(type)) return build(Phone.TYPE_WORK, false);
-            if ("fax_work".equals(type)) return build(Phone.TYPE_FAX_WORK, true);
-            if ("fax_home".equals(type)) return build(Phone.TYPE_FAX_HOME, true);
-            if ("pager".equals(type)) return build(Phone.TYPE_PAGER, true);
-            if ("other".equals(type)) return build(Phone.TYPE_OTHER, false);
-            if ("callback".equals(type)) return build(Phone.TYPE_CALLBACK, true);
-            if ("car".equals(type)) return build(Phone.TYPE_CAR, true);
-            if ("company_main".equals(type)) return build(Phone.TYPE_COMPANY_MAIN, true);
-            if ("isdn".equals(type)) return build(Phone.TYPE_ISDN, true);
-            if ("main".equals(type)) return build(Phone.TYPE_MAIN, true);
-            if ("other_fax".equals(type)) return build(Phone.TYPE_OTHER_FAX, true);
-            if ("radio".equals(type)) return build(Phone.TYPE_RADIO, true);
-            if ("telex".equals(type)) return build(Phone.TYPE_TELEX, true);
-            if ("tty_tdd".equals(type)) return build(Phone.TYPE_TTY_TDD, true);
-            if ("work_mobile".equals(type)) return build(Phone.TYPE_WORK_MOBILE, true);
-            if ("work_pager".equals(type)) return build(Phone.TYPE_WORK_PAGER, true);
-
-            // Note "assistant" used to be a custom column for the fallback type, but not anymore.
-            if ("assistant".equals(type)) return build(Phone.TYPE_ASSISTANT, true);
-            if ("mms".equals(type)) return build(Phone.TYPE_MMS, true);
-            if ("custom".equals(type)) {
-                return build(Phone.TYPE_CUSTOM, true).setCustomColumn(Phone.LABEL);
-            }
-            return null;
-        }
-    }
-
-    private static class EmailKindBuilder extends KindBuilder {
-        @Override
-        public String getTagName() {
-            return "email";
-        }
-
-        @Override
-        public List<DataKind> parseDataKind(Context context, XmlPullParser parser,
-                AttributeSet attrs) throws DefinitionException, XmlPullParserException,
-                IOException {
-            final DataKind kind = newDataKind(context, parser, attrs, false,
-                    Email.CONTENT_ITEM_TYPE, Email.TYPE, R.string.emailLabelsGroup, Weight.EMAIL,
-                    R.layout.text_fields_editor_view,
-                    new EmailActionInflater(), new SimpleInflater(Email.DATA));
-            kind.fieldList.add(new EditField(Email.DATA, R.string.emailLabelsGroup, FLAGS_EMAIL));
-
-            return Lists.newArrayList(kind);
-        }
-
-        @Override
-        protected EditType buildEditTypeForTypeTag(AttributeSet attrs, String type) {
-            // EditType is mutable, so we need to create a new instance every time.
-            if ("home".equals(type)) return buildEmailType(Email.TYPE_HOME);
-            if ("work".equals(type)) return buildEmailType(Email.TYPE_WORK);
-            if ("other".equals(type)) return buildEmailType(Email.TYPE_OTHER);
-            if ("mobile".equals(type)) return buildEmailType(Email.TYPE_MOBILE);
-            if ("custom".equals(type)) {
-                return buildEmailType(Email.TYPE_CUSTOM)
-                        .setSecondary(true).setCustomColumn(Email.LABEL);
-            }
-            return null;
-        }
-    }
-
-    private static class StructuredPostalKindBuilder extends KindBuilder {
-        @Override
-        public String getTagName() {
-            return "postal";
-        }
-
-        @Override
-        public List<DataKind> parseDataKind(Context context, XmlPullParser parser,
-                AttributeSet attrs) throws DefinitionException, XmlPullParserException,
-                IOException {
-            final DataKind kind = newDataKind(context, parser, attrs, false,
-                    StructuredPostal.CONTENT_ITEM_TYPE, StructuredPostal.TYPE,
-                    R.string.postalLabelsGroup, Weight.STRUCTURED_POSTAL,
-                    R.layout.text_fields_editor_view, new PostalActionInflater(),
-                    new SimpleInflater(StructuredPostal.FORMATTED_ADDRESS));
-
-            if (getAttr(attrs, "needsStructured", false)) {
-                if (Locale.JAPANESE.getLanguage().equals(Locale.getDefault().getLanguage())) {
-                    // Japanese order
-                    kind.fieldList.add(new EditField(StructuredPostal.COUNTRY,
-                            R.string.postal_country, FLAGS_POSTAL).setOptional(true));
-                    kind.fieldList.add(new EditField(StructuredPostal.POSTCODE,
-                            R.string.postal_postcode, FLAGS_POSTAL));
-                    kind.fieldList.add(new EditField(StructuredPostal.REGION,
-                            R.string.postal_region, FLAGS_POSTAL));
-                    kind.fieldList.add(new EditField(StructuredPostal.CITY,
-                            R.string.postal_city,FLAGS_POSTAL));
-                    kind.fieldList.add(new EditField(StructuredPostal.STREET,
-                            R.string.postal_street, FLAGS_POSTAL));
-                } else {
-                    // Generic order
-                    kind.fieldList.add(new EditField(StructuredPostal.STREET,
-                            R.string.postal_street, FLAGS_POSTAL));
-                    kind.fieldList.add(new EditField(StructuredPostal.CITY,
-                            R.string.postal_city,FLAGS_POSTAL));
-                    kind.fieldList.add(new EditField(StructuredPostal.REGION,
-                            R.string.postal_region, FLAGS_POSTAL));
-                    kind.fieldList.add(new EditField(StructuredPostal.POSTCODE,
-                            R.string.postal_postcode, FLAGS_POSTAL));
-                    kind.fieldList.add(new EditField(StructuredPostal.COUNTRY,
-                            R.string.postal_country, FLAGS_POSTAL).setOptional(true));
-                }
-            } else {
-                kind.maxLinesForDisplay= MAX_LINES_FOR_POSTAL_ADDRESS;
-                kind.fieldList.add(
-                        new EditField(StructuredPostal.FORMATTED_ADDRESS, R.string.postal_address,
-                                FLAGS_POSTAL));
-            }
-
-            return Lists.newArrayList(kind);
-        }
-
-        @Override
-        protected EditType buildEditTypeForTypeTag(AttributeSet attrs, String type) {
-            // EditType is mutable, so we need to create a new instance every time.
-            if ("home".equals(type)) return buildPostalType(StructuredPostal.TYPE_HOME);
-            if ("work".equals(type)) return buildPostalType(StructuredPostal.TYPE_WORK);
-            if ("other".equals(type)) return buildPostalType(StructuredPostal.TYPE_OTHER);
-            if ("custom".equals(type)) {
-                return buildPostalType(StructuredPostal.TYPE_CUSTOM)
-                        .setSecondary(true).setCustomColumn(Email.LABEL);
-            }
-            return null;
-        }
-    }
-
-    private static class ImKindBuilder extends KindBuilder {
-        @Override
-        public String getTagName() {
-            return "im";
-        }
-
-        @Override
-        public List<DataKind> parseDataKind(Context context, XmlPullParser parser,
-                AttributeSet attrs) throws DefinitionException, XmlPullParserException,
-                IOException {
-
-            // IM is special:
-            // - It uses "protocol" as the custom label field
-            // - Its TYPE is fixed to TYPE_OTHER
-
-            final DataKind kind = newDataKind(context, parser, attrs, false,
-                    Im.CONTENT_ITEM_TYPE, Im.PROTOCOL, R.string.imLabelsGroup, Weight.IM,
-                    R.layout.text_fields_editor_view,
-                    new ImActionInflater(), new SimpleInflater(Im.DATA) // header / action
-                    );
-            kind.fieldList.add(new EditField(Im.DATA, R.string.imLabelsGroup, FLAGS_EMAIL));
-
-            kind.defaultValues = new ContentValues();
-            kind.defaultValues.put(Im.TYPE, Im.TYPE_OTHER);
-
-            return Lists.newArrayList(kind);
-        }
-
-        @Override
-        protected EditType buildEditTypeForTypeTag(AttributeSet attrs, String type) {
-            if ("aim".equals(type)) return buildImType(Im.PROTOCOL_AIM);
-            if ("msn".equals(type)) return buildImType(Im.PROTOCOL_MSN);
-            if ("yahoo".equals(type)) return buildImType(Im.PROTOCOL_YAHOO);
-            if ("skype".equals(type)) return buildImType(Im.PROTOCOL_SKYPE);
-            if ("qq".equals(type)) return buildImType(Im.PROTOCOL_QQ);
-            if ("google_talk".equals(type)) return buildImType(Im.PROTOCOL_GOOGLE_TALK);
-            if ("icq".equals(type)) return buildImType(Im.PROTOCOL_ICQ);
-            if ("jabber".equals(type)) return buildImType(Im.PROTOCOL_JABBER);
-            if ("custom".equals(type)) {
-                return buildImType(Im.PROTOCOL_CUSTOM).setSecondary(true)
-                        .setCustomColumn(Im.CUSTOM_PROTOCOL);
-            }
-            return null;
-        }
-    }
-
-    private static class OrganizationKindBuilder extends KindBuilder {
-        @Override
-        public String getTagName() {
-            return "organization";
-        }
-
-        @Override
-        public List<DataKind> parseDataKind(Context context, XmlPullParser parser,
-                AttributeSet attrs) throws DefinitionException, XmlPullParserException,
-                IOException {
-            final DataKind kind = newDataKind(context, parser, attrs, false,
-                    Organization.CONTENT_ITEM_TYPE, null, R.string.organizationLabelsGroup,
-                    Weight.ORGANIZATION, R.layout.text_fields_editor_view ,
-                    new SimpleInflater(Organization.COMPANY),
-                    new SimpleInflater(Organization.TITLE));
-
-            kind.fieldList.add(new EditField(Organization.COMPANY, R.string.ghostData_company,
-                    FLAGS_GENERIC_NAME));
-            kind.fieldList.add(new EditField(Organization.TITLE, R.string.ghostData_title,
-                    FLAGS_GENERIC_NAME));
-
-            throwIfList(kind);
-
-            return Lists.newArrayList(kind);
-        }
-    }
-
-    private static class PhotoKindBuilder extends KindBuilder {
-        @Override
-        public String getTagName() {
-            return "photo";
-        }
-
-        @Override
-        public List<DataKind> parseDataKind(Context context, XmlPullParser parser,
-                AttributeSet attrs) throws DefinitionException, XmlPullParserException,
-                IOException {
-            final DataKind kind = newDataKind(context, parser, attrs, false,
-                    Photo.CONTENT_ITEM_TYPE, null /* no type */, -1, Weight.NONE, -1,
-                    null, null // no header, no body
-                    );
-
-            kind.fieldList.add(new EditField(Photo.PHOTO, -1, -1));
-
-            throwIfList(kind);
-
-            return Lists.newArrayList(kind);
-        }
-    }
-
-    private static class NoteKindBuilder extends KindBuilder {
-        @Override
-        public String getTagName() {
-            return "note";
-        }
-
-        @Override
-        public List<DataKind> parseDataKind(Context context, XmlPullParser parser,
-                AttributeSet attrs) throws DefinitionException, XmlPullParserException,
-                IOException {
-            final DataKind kind = newDataKind(context, parser, attrs, false,
-                    Note.CONTENT_ITEM_TYPE, null, R.string.label_notes, Weight.NOTE,
-                    R.layout.text_fields_editor_view,
-                    new SimpleInflater(R.string.label_notes), new SimpleInflater(Note.NOTE));
-
-            kind.fieldList.add(new EditField(Note.NOTE, R.string.label_notes, FLAGS_NOTE));
-            kind.maxLinesForDisplay = MAX_LINES_FOR_NOTE;
-
-            throwIfList(kind);
-
-            return Lists.newArrayList(kind);
-        }
-    }
-
-    private static class WebsiteKindBuilder extends KindBuilder {
-        @Override
-        public String getTagName() {
-            return "website";
-        }
-
-        @Override
-        public List<DataKind> parseDataKind(Context context, XmlPullParser parser,
-                AttributeSet attrs) throws DefinitionException, XmlPullParserException,
-                IOException {
-            final DataKind kind = newDataKind(context, parser, attrs, false,
-                    Website.CONTENT_ITEM_TYPE, null, R.string.websiteLabelsGroup, Weight.WEBSITE,
-                    R.layout.text_fields_editor_view,
-                    new SimpleInflater(R.string.websiteLabelsGroup),
-                    new SimpleInflater(Website.URL));
-
-            kind.fieldList.add(new EditField(Website.URL, R.string.websiteLabelsGroup,
-                    FLAGS_WEBSITE));
-
-            kind.defaultValues = new ContentValues();
-            kind.defaultValues.put(Website.TYPE, Website.TYPE_OTHER);
-
-            return Lists.newArrayList(kind);
-        }
-    }
-
-    private static class SipAddressKindBuilder extends KindBuilder {
-        @Override
-        public String getTagName() {
-            return "sip_address";
-        }
-
-        @Override
-        public List<DataKind> parseDataKind(Context context, XmlPullParser parser,
-                AttributeSet attrs) throws DefinitionException, XmlPullParserException,
-                IOException {
-            final DataKind kind = newDataKind(context, parser, attrs, false,
-                    SipAddress.CONTENT_ITEM_TYPE, null, R.string.label_sip_address,
-                    Weight.SIP_ADDRESS, R.layout.text_fields_editor_view,
-                    new SimpleInflater(R.string.label_sip_address),
-                    new SimpleInflater(SipAddress.SIP_ADDRESS));
-
-            kind.fieldList.add(new EditField(SipAddress.SIP_ADDRESS,
-                    R.string.label_sip_address, FLAGS_SIP_ADDRESS));
-
-            throwIfList(kind);
-
-            return Lists.newArrayList(kind);
-        }
-    }
-
-    private static class GroupMembershipKindBuilder extends KindBuilder {
-        @Override
-        public String getTagName() {
-            return "group_membership";
-        }
-
-        @Override
-        public List<DataKind> parseDataKind(Context context, XmlPullParser parser,
-                AttributeSet attrs) throws DefinitionException, XmlPullParserException,
-                IOException {
-            final DataKind kind = newDataKind(context, parser, attrs, false,
-                    GroupMembership.CONTENT_ITEM_TYPE, null,
-                    R.string.groupsLabel, Weight.GROUP_MEMBERSHIP, -1, null, null);
-
-            kind.fieldList.add(new EditField(GroupMembership.GROUP_ROW_ID, -1, -1));
-            kind.maxLinesForDisplay = MAX_LINES_FOR_GROUP;
-
-            throwIfList(kind);
-
-            return Lists.newArrayList(kind);
-        }
-    }
-
-    /**
-     * Event DataKind parser.
-     *
-     * Event DataKind is used only for Google/Exchange types, so this parser is not used for now.
-     */
-    private static class EventKindBuilder extends KindBuilder {
-        @Override
-        public String getTagName() {
-            return "event";
-        }
-
-        @Override
-        public List<DataKind> parseDataKind(Context context, XmlPullParser parser,
-                AttributeSet attrs) throws DefinitionException, XmlPullParserException,
-                IOException {
-            final DataKind kind = newDataKind(context, parser, attrs, false,
-                    Event.CONTENT_ITEM_TYPE, Event.TYPE, R.string.eventLabelsGroup, Weight.EVENT,
-                    R.layout.event_field_editor_view,
-                    new EventActionInflater(), new SimpleInflater(Event.START_DATE));
-
-            kind.fieldList.add(new EditField(Event.DATA, R.string.eventLabelsGroup, FLAGS_EVENT));
-
-            if (getAttr(attrs, Attr.DATE_WITH_TIME, false)) {
-                kind.dateFormatWithoutYear = DateUtils.NO_YEAR_DATE_AND_TIME_FORMAT;
-                kind.dateFormatWithYear = DateUtils.DATE_AND_TIME_FORMAT;
-            } else {
-                kind.dateFormatWithoutYear = DateUtils.NO_YEAR_DATE_FORMAT;
-                kind.dateFormatWithYear = DateUtils.FULL_DATE_FORMAT;
-            }
-
-            return Lists.newArrayList(kind);
-        }
-
-        @Override
-        protected EditType buildEditTypeForTypeTag(AttributeSet attrs, String type) {
-            final boolean yo = getAttr(attrs, Attr.YEAR_OPTIONAL, false);
-
-            if ("birthday".equals(type)) {
-                return buildEventType(Event.TYPE_BIRTHDAY, yo).setSpecificMax(1);
-            }
-            if ("anniversary".equals(type)) return buildEventType(Event.TYPE_ANNIVERSARY, yo);
-            if ("other".equals(type)) return buildEventType(Event.TYPE_OTHER, yo);
-            if ("custom".equals(type)) {
-                return buildEventType(Event.TYPE_CUSTOM, yo)
-                        .setSecondary(true).setCustomColumn(Event.LABEL);
-            }
-            return null;
-        }
-    }
-
-    /**
-     * Relationship DataKind parser.
-     *
-     * Relationship DataKind is used only for Google/Exchange types, so this parser is not used for
-     * now.
-     */
-    private static class RelationshipKindBuilder extends KindBuilder {
-        @Override
-        public String getTagName() {
-            return "relationship";
-        }
-
-        @Override
-        public List<DataKind> parseDataKind(Context context, XmlPullParser parser,
-                AttributeSet attrs) throws DefinitionException, XmlPullParserException,
-                IOException {
-            final DataKind kind = newDataKind(context, parser, attrs, false,
-                    Relation.CONTENT_ITEM_TYPE, Relation.TYPE,
-                    R.string.relationLabelsGroup, Weight.RELATIONSHIP,
-                    R.layout.text_fields_editor_view,
-                    new RelationActionInflater(), new SimpleInflater(Relation.NAME));
-
-            kind.fieldList.add(new EditField(Relation.DATA, R.string.relationLabelsGroup,
-                    FLAGS_RELATION));
-
-            kind.defaultValues = new ContentValues();
-            kind.defaultValues.put(Relation.TYPE, Relation.TYPE_SPOUSE);
-
-            return Lists.newArrayList(kind);
-        }
-
-        @Override
-        protected EditType buildEditTypeForTypeTag(AttributeSet attrs, String type) {
-            // EditType is mutable, so we need to create a new instance every time.
-            if ("assistant".equals(type)) return buildRelationType(Relation.TYPE_ASSISTANT);
-            if ("brother".equals(type)) return buildRelationType(Relation.TYPE_BROTHER);
-            if ("child".equals(type)) return buildRelationType(Relation.TYPE_CHILD);
-            if ("domestic_partner".equals(type)) {
-                    return buildRelationType(Relation.TYPE_DOMESTIC_PARTNER);
-            }
-            if ("father".equals(type)) return buildRelationType(Relation.TYPE_FATHER);
-            if ("friend".equals(type)) return buildRelationType(Relation.TYPE_FRIEND);
-            if ("manager".equals(type)) return buildRelationType(Relation.TYPE_MANAGER);
-            if ("mother".equals(type)) return buildRelationType(Relation.TYPE_MOTHER);
-            if ("parent".equals(type)) return buildRelationType(Relation.TYPE_PARENT);
-            if ("partner".equals(type)) return buildRelationType(Relation.TYPE_PARTNER);
-            if ("referred_by".equals(type)) return buildRelationType(Relation.TYPE_REFERRED_BY);
-            if ("relative".equals(type)) return buildRelationType(Relation.TYPE_RELATIVE);
-            if ("sister".equals(type)) return buildRelationType(Relation.TYPE_SISTER);
-            if ("spouse".equals(type)) return buildRelationType(Relation.TYPE_SPOUSE);
-            if ("custom".equals(type)) {
-                return buildRelationType(Relation.TYPE_CUSTOM).setSecondary(true)
-                        .setCustomColumn(Relation.LABEL);
-            }
-            return null;
-        }
-    }
-}
diff --git a/src/com/android/contacts/model/account/ExchangeAccountType.java b/src/com/android/contacts/model/account/ExchangeAccountType.java
deleted file mode 100644
index 28b1f5c..0000000
--- a/src/com/android/contacts/model/account/ExchangeAccountType.java
+++ /dev/null
@@ -1,348 +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.model.account;
-
-import android.content.ContentValues;
-import android.content.Context;
-import android.provider.ContactsContract.CommonDataKinds.Email;
-import android.provider.ContactsContract.CommonDataKinds.Event;
-import android.provider.ContactsContract.CommonDataKinds.Im;
-import android.provider.ContactsContract.CommonDataKinds.Nickname;
-import android.provider.ContactsContract.CommonDataKinds.Note;
-import android.provider.ContactsContract.CommonDataKinds.Organization;
-import android.provider.ContactsContract.CommonDataKinds.Phone;
-import android.provider.ContactsContract.CommonDataKinds.Photo;
-import android.provider.ContactsContract.CommonDataKinds.StructuredName;
-import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
-import android.provider.ContactsContract.CommonDataKinds.Website;
-import android.util.Log;
-
-import com.android.contacts.R;
-import com.android.contacts.model.dataitem.DataKind;
-import com.android.contacts.util.DateUtils;
-import com.google.common.collect.Lists;
-
-import java.util.Locale;
-
-public class ExchangeAccountType extends BaseAccountType {
-    private static final String TAG = "ExchangeAccountType";
-
-    public static final String ACCOUNT_TYPE_AOSP = "com.android.exchange";
-    public static final String ACCOUNT_TYPE_GOOGLE = "com.google.android.exchange";
-
-    public ExchangeAccountType(Context context, String authenticatorPackageName, String type) {
-        this.accountType = type;
-        this.resourcePackageName = null;
-        this.syncAdapterPackageName = authenticatorPackageName;
-
-        try {
-            addDataKindStructuredName(context);
-            addDataKindDisplayName(context);
-            addDataKindPhoneticName(context);
-            addDataKindNickname(context);
-            addDataKindPhone(context);
-            addDataKindEmail(context);
-            addDataKindStructuredPostal(context);
-            addDataKindIm(context);
-            addDataKindOrganization(context);
-            addDataKindPhoto(context);
-            addDataKindNote(context);
-            addDataKindEvent(context);
-            addDataKindWebsite(context);
-            addDataKindGroupMembership(context);
-
-            mIsInitialized = true;
-        } catch (DefinitionException e) {
-            Log.e(TAG, "Problem building account type", e);
-        }
-    }
-
-    public static boolean isExchangeType(String type) {
-        return ACCOUNT_TYPE_AOSP.equals(type) || ACCOUNT_TYPE_GOOGLE.equals(type);
-    }
-
-    @Override
-    protected DataKind addDataKindStructuredName(Context context) throws DefinitionException {
-        DataKind kind = addKind(new DataKind(StructuredName.CONTENT_ITEM_TYPE,
-                R.string.nameLabelsGroup, -1, true, R.layout.structured_name_editor_view));
-        kind.actionHeader = new SimpleInflater(R.string.nameLabelsGroup);
-        kind.actionBody = new SimpleInflater(Nickname.NAME);
-
-        kind.typeOverallMax = 1;
-
-        kind.fieldList = Lists.newArrayList();
-        kind.fieldList.add(new EditField(StructuredName.PREFIX, R.string.name_prefix,
-                FLAGS_PERSON_NAME).setOptional(true));
-        kind.fieldList.add(new EditField(StructuredName.FAMILY_NAME,
-                R.string.name_family, FLAGS_PERSON_NAME));
-        kind.fieldList.add(new EditField(StructuredName.MIDDLE_NAME,
-                R.string.name_middle, FLAGS_PERSON_NAME));
-        kind.fieldList.add(new EditField(StructuredName.GIVEN_NAME,
-                R.string.name_given, FLAGS_PERSON_NAME));
-        kind.fieldList.add(new EditField(StructuredName.SUFFIX,
-                R.string.name_suffix, FLAGS_PERSON_NAME));
-
-        kind.fieldList.add(new EditField(StructuredName.PHONETIC_FAMILY_NAME,
-                R.string.name_phonetic_family, FLAGS_PHONETIC));
-        kind.fieldList.add(new EditField(StructuredName.PHONETIC_GIVEN_NAME,
-                R.string.name_phonetic_given, FLAGS_PHONETIC));
-
-        return kind;
-    }
-
-    @Override
-    protected DataKind addDataKindDisplayName(Context context) throws DefinitionException {
-        DataKind kind = addKind(new DataKind(DataKind.PSEUDO_MIME_TYPE_DISPLAY_NAME,
-                R.string.nameLabelsGroup, -1, true, R.layout.text_fields_editor_view));
-
-        boolean displayOrderPrimary =
-                context.getResources().getBoolean(R.bool.config_editor_field_order_primary);
-        kind.typeOverallMax = 1;
-
-        kind.fieldList = Lists.newArrayList();
-        kind.fieldList.add(new EditField(StructuredName.PREFIX, R.string.name_prefix,
-                FLAGS_PERSON_NAME).setOptional(true));
-        if (!displayOrderPrimary) {
-            kind.fieldList.add(new EditField(StructuredName.FAMILY_NAME,
-                    R.string.name_family, FLAGS_PERSON_NAME));
-            kind.fieldList.add(new EditField(StructuredName.MIDDLE_NAME,
-                    R.string.name_middle, FLAGS_PERSON_NAME).setOptional(true));
-            kind.fieldList.add(new EditField(StructuredName.GIVEN_NAME,
-                    R.string.name_given, FLAGS_PERSON_NAME));
-        } else {
-            kind.fieldList.add(new EditField(StructuredName.GIVEN_NAME,
-                    R.string.name_given, FLAGS_PERSON_NAME));
-            kind.fieldList.add(new EditField(StructuredName.MIDDLE_NAME,
-                    R.string.name_middle, FLAGS_PERSON_NAME).setOptional(true));
-            kind.fieldList.add(new EditField(StructuredName.FAMILY_NAME,
-                    R.string.name_family, FLAGS_PERSON_NAME));
-        }
-        kind.fieldList.add(new EditField(StructuredName.SUFFIX,
-                R.string.name_suffix, FLAGS_PERSON_NAME).setOptional(true));
-
-        return kind;
-    }
-
-    @Override
-    protected DataKind addDataKindPhoneticName(Context context) throws DefinitionException {
-        DataKind kind = addKind(new DataKind(DataKind.PSEUDO_MIME_TYPE_PHONETIC_NAME,
-                R.string.name_phonetic, -1, true, R.layout.phonetic_name_editor_view));
-        kind.actionHeader = new SimpleInflater(R.string.nameLabelsGroup);
-        kind.actionBody = new SimpleInflater(Nickname.NAME);
-
-        kind.typeOverallMax = 1;
-
-        kind.fieldList = Lists.newArrayList();
-        kind.fieldList.add(new EditField(StructuredName.PHONETIC_FAMILY_NAME,
-                R.string.name_phonetic_family, FLAGS_PHONETIC));
-        kind.fieldList.add(new EditField(StructuredName.PHONETIC_GIVEN_NAME,
-                R.string.name_phonetic_given, FLAGS_PHONETIC));
-
-        return kind;
-    }
-
-    @Override
-    protected DataKind addDataKindNickname(Context context) throws DefinitionException {
-        final DataKind kind = super.addDataKindNickname(context);
-
-        kind.typeOverallMax = 1;
-
-        kind.fieldList = Lists.newArrayList();
-        kind.fieldList.add(new EditField(Nickname.NAME, R.string.nicknameLabelsGroup,
-                FLAGS_PERSON_NAME));
-
-        return kind;
-    }
-
-    @Override
-    protected DataKind addDataKindPhone(Context context) throws DefinitionException {
-        final DataKind kind = super.addDataKindPhone(context);
-
-        kind.typeColumn = Phone.TYPE;
-        kind.typeList = Lists.newArrayList();
-        kind.typeList.add(buildPhoneType(Phone.TYPE_MOBILE).setSpecificMax(1));
-        kind.typeList.add(buildPhoneType(Phone.TYPE_HOME).setSpecificMax(2));
-        kind.typeList.add(buildPhoneType(Phone.TYPE_WORK).setSpecificMax(2));
-        kind.typeList.add(buildPhoneType(Phone.TYPE_FAX_WORK).setSecondary(true)
-                .setSpecificMax(1));
-        kind.typeList.add(buildPhoneType(Phone.TYPE_FAX_HOME).setSecondary(true)
-                .setSpecificMax(1));
-        kind.typeList
-                .add(buildPhoneType(Phone.TYPE_PAGER).setSecondary(true).setSpecificMax(1));
-        kind.typeList.add(buildPhoneType(Phone.TYPE_CAR).setSecondary(true).setSpecificMax(1));
-        kind.typeList.add(buildPhoneType(Phone.TYPE_COMPANY_MAIN).setSecondary(true)
-                .setSpecificMax(1));
-        kind.typeList.add(buildPhoneType(Phone.TYPE_MMS).setSecondary(true).setSpecificMax(1));
-        kind.typeList
-                .add(buildPhoneType(Phone.TYPE_RADIO).setSecondary(true).setSpecificMax(1));
-        kind.typeList.add(buildPhoneType(Phone.TYPE_ASSISTANT).setSecondary(true)
-                .setSpecificMax(1));
-
-        kind.fieldList = Lists.newArrayList();
-        kind.fieldList.add(new EditField(Phone.NUMBER, R.string.phoneLabelsGroup, FLAGS_PHONE));
-
-        return kind;
-    }
-
-    @Override
-    protected DataKind addDataKindEmail(Context context) throws DefinitionException {
-        final DataKind kind = super.addDataKindEmail(context);
-
-        kind.typeOverallMax = 3;
-
-        kind.fieldList = Lists.newArrayList();
-        kind.fieldList.add(new EditField(Email.DATA, R.string.emailLabelsGroup, FLAGS_EMAIL));
-
-        return kind;
-    }
-
-    @Override
-    protected DataKind addDataKindStructuredPostal(Context context) throws DefinitionException {
-        final DataKind kind = super.addDataKindStructuredPostal(context);
-
-        final boolean useJapaneseOrder =
-            Locale.JAPANESE.getLanguage().equals(Locale.getDefault().getLanguage());
-        kind.typeColumn = StructuredPostal.TYPE;
-        kind.typeList = Lists.newArrayList();
-        kind.typeList.add(buildPostalType(StructuredPostal.TYPE_WORK).setSpecificMax(1));
-        kind.typeList.add(buildPostalType(StructuredPostal.TYPE_HOME).setSpecificMax(1));
-        kind.typeList.add(buildPostalType(StructuredPostal.TYPE_OTHER).setSpecificMax(1));
-
-        kind.fieldList = Lists.newArrayList();
-        if (useJapaneseOrder) {
-            kind.fieldList.add(new EditField(StructuredPostal.COUNTRY,
-                    R.string.postal_country, FLAGS_POSTAL).setOptional(true));
-            kind.fieldList.add(new EditField(StructuredPostal.POSTCODE,
-                    R.string.postal_postcode, FLAGS_POSTAL));
-            kind.fieldList.add(new EditField(StructuredPostal.REGION,
-                    R.string.postal_region, FLAGS_POSTAL));
-            kind.fieldList.add(new EditField(StructuredPostal.CITY,
-                    R.string.postal_city,FLAGS_POSTAL));
-            kind.fieldList.add(new EditField(StructuredPostal.STREET,
-                    R.string.postal_street, FLAGS_POSTAL));
-        } else {
-            kind.fieldList.add(new EditField(StructuredPostal.STREET,
-                    R.string.postal_street, FLAGS_POSTAL));
-            kind.fieldList.add(new EditField(StructuredPostal.CITY,
-                    R.string.postal_city,FLAGS_POSTAL));
-            kind.fieldList.add(new EditField(StructuredPostal.REGION,
-                    R.string.postal_region, FLAGS_POSTAL));
-            kind.fieldList.add(new EditField(StructuredPostal.POSTCODE,
-                    R.string.postal_postcode, FLAGS_POSTAL));
-            kind.fieldList.add(new EditField(StructuredPostal.COUNTRY,
-                    R.string.postal_country, FLAGS_POSTAL).setOptional(true));
-        }
-
-        return kind;
-    }
-
-    @Override
-    protected DataKind addDataKindIm(Context context) throws DefinitionException {
-        final DataKind kind = super.addDataKindIm(context);
-
-        // Types are not supported for IM. There can be 3 IMs, but OWA only shows only the first
-        kind.typeOverallMax = 3;
-
-        kind.defaultValues = new ContentValues();
-        kind.defaultValues.put(Im.TYPE, Im.TYPE_OTHER);
-
-        kind.fieldList = Lists.newArrayList();
-        kind.fieldList.add(new EditField(Im.DATA, R.string.imLabelsGroup, FLAGS_EMAIL));
-
-        return kind;
-    }
-
-    @Override
-    protected DataKind addDataKindOrganization(Context context) throws DefinitionException {
-        final DataKind kind = super.addDataKindOrganization(context);
-
-        kind.typeOverallMax = 1;
-
-        kind.fieldList = Lists.newArrayList();
-        kind.fieldList.add(new EditField(Organization.COMPANY, R.string.ghostData_company,
-                FLAGS_GENERIC_NAME));
-        kind.fieldList.add(new EditField(Organization.TITLE, R.string.ghostData_title,
-                FLAGS_GENERIC_NAME));
-
-        return kind;
-    }
-
-    @Override
-    protected DataKind addDataKindPhoto(Context context) throws DefinitionException {
-        final DataKind kind = super.addDataKindPhoto(context);
-
-        kind.typeOverallMax = 1;
-
-        kind.fieldList = Lists.newArrayList();
-        kind.fieldList.add(new EditField(Photo.PHOTO, -1, -1));
-
-        return kind;
-    }
-
-    @Override
-    protected DataKind addDataKindNote(Context context) throws DefinitionException {
-        final DataKind kind = super.addDataKindNote(context);
-
-        kind.fieldList = Lists.newArrayList();
-        kind.fieldList.add(new EditField(Note.NOTE, R.string.label_notes, FLAGS_NOTE));
-
-        return kind;
-    }
-
-    protected DataKind addDataKindEvent(Context context) throws DefinitionException {
-        DataKind kind = addKind(
-                new DataKind(Event.CONTENT_ITEM_TYPE, R.string.eventLabelsGroup, 150, true,
-                R.layout.event_field_editor_view));
-        kind.actionHeader = new EventActionInflater();
-        kind.actionBody = new SimpleInflater(Event.START_DATE);
-
-        kind.typeOverallMax = 1;
-
-        kind.typeColumn = Event.TYPE;
-        kind.typeList = Lists.newArrayList();
-        kind.typeList.add(buildEventType(Event.TYPE_BIRTHDAY, false).setSpecificMax(1));
-
-        kind.dateFormatWithYear = DateUtils.DATE_AND_TIME_FORMAT;
-
-        kind.fieldList = Lists.newArrayList();
-        kind.fieldList.add(new EditField(Event.DATA, R.string.eventLabelsGroup, FLAGS_EVENT));
-
-        return kind;
-    }
-
-    @Override
-    protected DataKind addDataKindWebsite(Context context) throws DefinitionException {
-        final DataKind kind = super.addDataKindWebsite(context);
-
-        kind.typeOverallMax = 1;
-
-        kind.fieldList = Lists.newArrayList();
-        kind.fieldList.add(new EditField(Website.URL, R.string.websiteLabelsGroup, FLAGS_WEBSITE));
-
-        return kind;
-    }
-
-    @Override
-    public boolean isGroupMembershipEditable() {
-        return true;
-    }
-
-    @Override
-    public boolean areContactsWritable() {
-        return true;
-    }
-}
diff --git a/src/com/android/contacts/model/account/ExternalAccountType.java b/src/com/android/contacts/model/account/ExternalAccountType.java
deleted file mode 100644
index 71dbebf..0000000
--- a/src/com/android/contacts/model/account/ExternalAccountType.java
+++ /dev/null
@@ -1,442 +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.model.account;
-
-import android.content.Context;
-import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.PackageManager.NameNotFoundException;
-import android.content.pm.ServiceInfo;
-import android.content.res.Resources;
-import android.content.res.TypedArray;
-import android.content.res.XmlResourceParser;
-import android.provider.ContactsContract.CommonDataKinds.Photo;
-import android.provider.ContactsContract.CommonDataKinds.StructuredName;
-import android.text.TextUtils;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.util.Xml;
-
-import com.android.contacts.model.dataitem.DataKind;
-import com.google.common.annotations.VisibleForTesting;
-
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * A general contacts account type descriptor.
- */
-public class ExternalAccountType extends BaseAccountType {
-    private static final String TAG = "ExternalAccountType";
-
-    private static final String METADATA_CONTACTS = "android.provider.CONTACTS_STRUCTURE";
-
-    private static final String TAG_CONTACTS_SOURCE_LEGACY = "ContactsSource";
-    private static final String TAG_CONTACTS_ACCOUNT_TYPE = "ContactsAccountType";
-    private static final String TAG_CONTACTS_DATA_KIND = "ContactsDataKind";
-    private static final String TAG_EDIT_SCHEMA = "EditSchema";
-
-    private static final String ATTR_EDIT_CONTACT_ACTIVITY = "editContactActivity";
-    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_VIEW_CONTACT_NOTIFY_SERVICE = "viewContactNotifyService";
-    private static final String ATTR_VIEW_GROUP_ACTIVITY = "viewGroupActivity";
-    private static final String ATTR_VIEW_GROUP_ACTION_LABEL = "viewGroupActionLabel";
-    private static final String ATTR_VIEW_STREAM_ITEM_ACTIVITY = "viewStreamItemActivity";
-    private static final String ATTR_VIEW_STREAM_ITEM_PHOTO_ACTIVITY =
-            "viewStreamItemPhotoActivity";
-    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_ACCOUNT_LABEL = "accountTypeLabel";
-    private static final String ATTR_ACCOUNT_ICON = "accountTypeIcon";
-
-    private final boolean mIsExtension;
-
-    private String mEditContactActivityClassName;
-    private String mCreateContactActivityClassName;
-    private String mInviteContactActivity;
-    private String mInviteActionLabelAttribute;
-    private int mInviteActionLabelResId;
-    private String mViewContactNotifyService;
-    private String mViewGroupActivity;
-    private String mViewGroupLabelAttribute;
-    private int mViewGroupLabelResId;
-    private String mViewStreamItemActivity;
-    private String mViewStreamItemPhotoActivity;
-    private List<String> mExtensionPackageNames;
-    private String mAccountTypeLabelAttribute;
-    private String mAccountTypeIconAttribute;
-    private boolean mHasContactsMetadata;
-    private boolean mHasEditSchema;
-
-    public ExternalAccountType(Context context, String resPackageName, boolean isExtension) {
-        this(context, resPackageName, isExtension, null);
-    }
-
-    /**
-     * Constructor used for testing to initialize with any arbitrary XML.
-     *
-     * @param injectedMetadata If non-null, it'll be used to initialize the type.  Only set by
-     *     tests.  If null, the metadata is loaded from the specified package.
-     */
-    ExternalAccountType(Context context, String packageName, boolean isExtension,
-            XmlResourceParser injectedMetadata) {
-        this.mIsExtension = isExtension;
-        this.resourcePackageName = packageName;
-        this.syncAdapterPackageName = packageName;
-
-        final PackageManager pm = context.getPackageManager();
-        final XmlResourceParser parser;
-        if (injectedMetadata == null) {
-            try {
-                parser = loadContactsXml(context, packageName);
-            } catch (NameNotFoundException e1) {
-                // If the package name is not found, we can't initialize this account type.
-                return;
-            }
-        } else {
-            parser = injectedMetadata;
-        }
-        boolean needLineNumberInErrorLog = true;
-        try {
-            if (parser != null) {
-                inflate(context, parser);
-            }
-
-            // Done parsing; line number no longer needed in error log.
-            needLineNumberInErrorLog = false;
-            if (mHasEditSchema) {
-                checkKindExists(StructuredName.CONTENT_ITEM_TYPE);
-                checkKindExists(DataKind.PSEUDO_MIME_TYPE_DISPLAY_NAME);
-                checkKindExists(DataKind.PSEUDO_MIME_TYPE_PHONETIC_NAME);
-                checkKindExists(Photo.CONTENT_ITEM_TYPE);
-            } else {
-                // Bring in name and photo from fallback source, which are non-optional
-                addDataKindStructuredName(context);
-                addDataKindDisplayName(context);
-                addDataKindPhoneticName(context);
-                addDataKindPhoto(context);
-            }
-        } catch (DefinitionException e) {
-            final StringBuilder error = new StringBuilder();
-            error.append("Problem reading XML");
-            if (needLineNumberInErrorLog && (parser != null)) {
-                error.append(" in line ");
-                error.append(parser.getLineNumber());
-            }
-            error.append(" for external package ");
-            error.append(packageName);
-
-            Log.e(TAG, error.toString(), e);
-            return;
-        } finally {
-            if (parser != null) {
-                parser.close();
-            }
-        }
-
-        mExtensionPackageNames = new ArrayList<String>();
-        mInviteActionLabelResId = resolveExternalResId(context, mInviteActionLabelAttribute,
-                syncAdapterPackageName, ATTR_INVITE_CONTACT_ACTION_LABEL);
-        mViewGroupLabelResId = resolveExternalResId(context, mViewGroupLabelAttribute,
-                syncAdapterPackageName, ATTR_VIEW_GROUP_ACTION_LABEL);
-        titleRes = resolveExternalResId(context, mAccountTypeLabelAttribute,
-                syncAdapterPackageName, ATTR_ACCOUNT_LABEL);
-        iconRes = resolveExternalResId(context, mAccountTypeIconAttribute,
-                syncAdapterPackageName, ATTR_ACCOUNT_ICON);
-
-        // If we reach this point, the account type has been successfully initialized.
-        mIsInitialized = true;
-    }
-
-    /**
-     * Returns the CONTACTS_STRUCTURE metadata (aka "contacts.xml") in the given apk package.
-     *
-     * Unfortunately, there's no public way to determine which service defines a sync service for
-     * which account type, so this method looks through all services in the package, and just
-     * returns the first CONTACTS_STRUCTURE metadata defined in any of them.
-     *
-     * Returns {@code null} if the package has no CONTACTS_STRUCTURE metadata.  In this case
-     * the account type *will* be initialized with minimal configuration.
-     *
-     * On the other hand, if the package is not found, it throws a {@link NameNotFoundException},
-     * in which case the account type will *not* be initialized.
-     */
-    private XmlResourceParser loadContactsXml(Context context, String resPackageName)
-            throws NameNotFoundException {
-        final PackageManager pm = context.getPackageManager();
-        PackageInfo packageInfo = pm.getPackageInfo(resPackageName,
-                PackageManager.GET_SERVICES|PackageManager.GET_META_DATA);
-        for (ServiceInfo serviceInfo : packageInfo.services) {
-            final XmlResourceParser parser = serviceInfo.loadXmlMetaData(pm,
-                    METADATA_CONTACTS);
-            if (parser != null) {
-                return parser;
-            }
-        }
-        // Package was found, but that doesn't contain the CONTACTS_STRUCTURE metadata.
-        return null;
-    }
-
-    private void checkKindExists(String mimeType) throws DefinitionException {
-        if (getKindForMimetype(mimeType) == null) {
-            throw new DefinitionException(mimeType + " must be supported");
-        }
-    }
-
-    @Override
-    public boolean isEmbedded() {
-        return false;
-    }
-
-    @Override
-    public boolean isExtension() {
-        return mIsExtension;
-    }
-
-    @Override
-    public boolean areContactsWritable() {
-        return mHasEditSchema;
-    }
-
-    /**
-     * Whether this account type has the android.provider.CONTACTS_STRUCTURE metadata xml.
-     */
-    public boolean hasContactsMetadata() {
-        return mHasContactsMetadata;
-    }
-
-    @Override
-    public String getEditContactActivityClassName() {
-        return mEditContactActivityClassName;
-    }
-
-    @Override
-    public String getCreateContactActivityClassName() {
-        return mCreateContactActivityClassName;
-    }
-
-    @Override
-    public String getInviteContactActivityClassName() {
-        return mInviteContactActivity;
-    }
-
-    @Override
-    protected int getInviteContactActionResId() {
-        return mInviteActionLabelResId;
-    }
-
-    @Override
-    public String getViewContactNotifyServiceClassName() {
-        return mViewContactNotifyService;
-    }
-
-    @Override
-    public String getViewGroupActivity() {
-        return mViewGroupActivity;
-    }
-
-    @Override
-    protected int getViewGroupLabelResId() {
-        return mViewGroupLabelResId;
-    }
-
-    @Override
-    public String getViewStreamItemActivity() {
-        return mViewStreamItemActivity;
-    }
-
-    @Override
-    public String getViewStreamItemPhotoActivity() {
-        return mViewStreamItemPhotoActivity;
-    }
-
-    @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.
-     */
-    protected void inflate(Context context, XmlPullParser parser) throws DefinitionException {
-        final AttributeSet attrs = Xml.asAttributeSet(parser);
-
-        try {
-            int type;
-            while ((type = parser.next()) != XmlPullParser.START_TAG
-                    && type != XmlPullParser.END_DOCUMENT) {
-                // Drain comments and whitespace
-            }
-
-            if (type != XmlPullParser.START_TAG) {
-                throw new IllegalStateException("No start tag found");
-            }
-
-            String rootTag = parser.getName();
-            if (!TAG_CONTACTS_ACCOUNT_TYPE.equals(rootTag) &&
-                    !TAG_CONTACTS_SOURCE_LEGACY.equals(rootTag)) {
-                throw new IllegalStateException("Top level element must be "
-                        + TAG_CONTACTS_ACCOUNT_TYPE + ", not " + rootTag);
-            }
-
-            mHasContactsMetadata = true;
-
-            int attributeCount = parser.getAttributeCount();
-            for (int i = 0; i < attributeCount; i++) {
-                String attr = parser.getAttributeName(i);
-                String value = parser.getAttributeValue(i);
-                if (Log.isLoggable(TAG, Log.DEBUG)) {
-                    Log.d(TAG, attr + "=" + value);
-                }
-                if (ATTR_EDIT_CONTACT_ACTIVITY.equals(attr)) {
-                    mEditContactActivityClassName = value;
-                } else if (ATTR_CREATE_CONTACT_ACTIVITY.equals(attr)) {
-                    mCreateContactActivityClassName = value;
-                } else if (ATTR_INVITE_CONTACT_ACTIVITY.equals(attr)) {
-                    mInviteContactActivity = value;
-                } else if (ATTR_INVITE_CONTACT_ACTION_LABEL.equals(attr)) {
-                    mInviteActionLabelAttribute = value;
-                } else if (ATTR_VIEW_CONTACT_NOTIFY_SERVICE.equals(attr)) {
-                    mViewContactNotifyService = value;
-                } else if (ATTR_VIEW_GROUP_ACTIVITY.equals(attr)) {
-                    mViewGroupActivity = value;
-                } else if (ATTR_VIEW_GROUP_ACTION_LABEL.equals(attr)) {
-                    mViewGroupLabelAttribute = value;
-                } else if (ATTR_VIEW_STREAM_ITEM_ACTIVITY.equals(attr)) {
-                    mViewStreamItemActivity = value;
-                } else if (ATTR_VIEW_STREAM_ITEM_PHOTO_ACTIVITY.equals(attr)) {
-                    mViewStreamItemPhotoActivity = 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_ACCOUNT_LABEL.equals(attr)) {
-                    mAccountTypeLabelAttribute = value;
-                } else if (ATTR_ACCOUNT_ICON.equals(attr)) {
-                    mAccountTypeIconAttribute = value;
-                } else {
-                    Log.e(TAG, "Unsupported attribute " + attr);
-                }
-            }
-
-            // Parse all children kinds
-            final int startDepth = parser.getDepth();
-            while (((type = parser.next()) != XmlPullParser.END_TAG
-                        || parser.getDepth() > startDepth)
-                    && type != XmlPullParser.END_DOCUMENT) {
-
-                if (type != XmlPullParser.START_TAG || parser.getDepth() != startDepth + 1) {
-                    continue; // Not a direct child tag
-                }
-
-                String tag = parser.getName();
-                if (TAG_EDIT_SCHEMA.equals(tag)) {
-                    mHasEditSchema = true;
-                    parseEditSchema(context, parser, attrs);
-                } else if (TAG_CONTACTS_DATA_KIND.equals(tag)) {
-                    final TypedArray a = context.obtainStyledAttributes(attrs,
-                            android.R.styleable.ContactsDataKind);
-                    final DataKind kind = new DataKind();
-
-                    kind.mimeType = a
-                            .getString(com.android.internal.R.styleable.ContactsDataKind_mimeType);
-
-                    final String summaryColumn = a.getString(
-                            com.android.internal.R.styleable.ContactsDataKind_summaryColumn);
-                    if (summaryColumn != null) {
-                        // Inflate a specific column as summary when requested
-                        kind.actionHeader = new SimpleInflater(summaryColumn);
-                    }
-
-                    final String detailColumn = a.getString(
-                            com.android.internal.R.styleable.ContactsDataKind_detailColumn);
-                    final boolean detailSocialSummary = a.getBoolean(
-                            com.android.internal.R.styleable.ContactsDataKind_detailSocialSummary,
-                            false);
-
-                    if (detailSocialSummary) {
-                        // Inflate social summary when requested
-                        kind.actionBodySocial = true;
-                    }
-
-                    if (detailColumn != null) {
-                        // Inflate specific column as summary
-                        kind.actionBody = new SimpleInflater(detailColumn);
-                    }
-
-                    a.recycle();
-
-                    addKind(kind);
-                }
-            }
-        } catch (XmlPullParserException e) {
-            throw new DefinitionException("Problem reading XML", e);
-        } catch (IOException e) {
-            throw new DefinitionException("Problem reading XML", e);
-        }
-    }
-
-    /**
-     * Takes a string in the "@xxx/yyy" format and return the resource ID for the resource in
-     * the resource package.
-     *
-     * If the argument is in the invalid format or isn't a resource name, it returns -1.
-     *
-     * @param context context
-     * @param resourceName Resource name in the "@xxx/yyy" format, e.g. "@string/invite_lavbel"
-     * @param packageName name of the package containing the resource.
-     * @param xmlAttributeName attribute name which the resource came from.  Used for logging.
-     */
-    @VisibleForTesting
-    static int resolveExternalResId(Context context, String resourceName,
-            String packageName, String xmlAttributeName) {
-        if (TextUtils.isEmpty(resourceName)) {
-            return -1; // Empty text is okay.
-        }
-        if (resourceName.charAt(0) != '@') {
-            Log.e(TAG, xmlAttributeName + " must be a resource name beginnig with '@'");
-            return -1;
-        }
-        final String name = resourceName.substring(1);
-        final Resources res;
-        try {
-             res = context.getPackageManager().getResourcesForApplication(packageName);
-        } catch (NameNotFoundException e) {
-            Log.e(TAG, "Unable to load package " + packageName);
-            return -1;
-        }
-        final int resId = res.getIdentifier(name, null, packageName);
-        if (resId == 0) {
-            Log.e(TAG, "Unable to load " + resourceName + " from package " + packageName);
-            return -1;
-        }
-        return resId;
-    }
-}
diff --git a/src/com/android/contacts/model/account/FallbackAccountType.java b/src/com/android/contacts/model/account/FallbackAccountType.java
deleted file mode 100644
index dae288d..0000000
--- a/src/com/android/contacts/model/account/FallbackAccountType.java
+++ /dev/null
@@ -1,78 +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.model.account;
-
-import android.content.Context;
-import android.util.Log;
-
-import com.android.contacts.R;
-import com.android.contacts.model.dataitem.DataKind;
-import com.android.contacts.test.NeededForTesting;
-
-public class FallbackAccountType extends BaseAccountType {
-    private static final String TAG = "FallbackAccountType";
-
-    private FallbackAccountType(Context context, String resPackageName) {
-        this.accountType = null;
-        this.dataSet = null;
-        this.titleRes = R.string.account_phone;
-        this.iconRes = R.mipmap.ic_launcher_contacts;
-
-        // Note those are only set for unit tests.
-        this.resourcePackageName = resPackageName;
-        this.syncAdapterPackageName = resPackageName;
-
-        try {
-            addDataKindStructuredName(context);
-            addDataKindDisplayName(context);
-            addDataKindPhoneticName(context);
-            addDataKindNickname(context);
-            addDataKindPhone(context);
-            addDataKindEmail(context);
-            addDataKindStructuredPostal(context);
-            addDataKindIm(context);
-            addDataKindOrganization(context);
-            addDataKindPhoto(context);
-            addDataKindNote(context);
-            addDataKindWebsite(context);
-            addDataKindSipAddress(context);
-
-            mIsInitialized = true;
-        } catch (DefinitionException e) {
-            Log.e(TAG, "Problem building account type", e);
-        }
-    }
-
-    public FallbackAccountType(Context context) {
-        this(context, null);
-    }
-
-    /**
-     * Used to compare with an {@link ExternalAccountType} built from a test contacts.xml.
-     * In order to build {@link DataKind}s with the same resource package name,
-     * {@code resPackageName} is injectable.
-     */
-    @NeededForTesting
-    static AccountType createWithPackageNameForTest(Context context, String resPackageName) {
-        return new FallbackAccountType(context, resPackageName);
-    }
-
-    @Override
-    public boolean areContactsWritable() {
-        return true;
-    }
-}
diff --git a/src/com/android/contacts/model/account/GoogleAccountType.java b/src/com/android/contacts/model/account/GoogleAccountType.java
deleted file mode 100644
index 192c3d0..0000000
--- a/src/com/android/contacts/model/account/GoogleAccountType.java
+++ /dev/null
@@ -1,197 +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.model.account;
-
-import android.content.ContentValues;
-import android.content.Context;
-import android.provider.ContactsContract.CommonDataKinds.Email;
-import android.provider.ContactsContract.CommonDataKinds.Event;
-import android.provider.ContactsContract.CommonDataKinds.Phone;
-import android.provider.ContactsContract.CommonDataKinds.Relation;
-import android.util.Log;
-
-import com.android.contacts.R;
-import com.android.contacts.model.dataitem.DataKind;
-import com.android.contacts.util.DateUtils;
-import com.google.common.collect.Lists;
-
-import java.util.List;
-
-public class GoogleAccountType extends BaseAccountType {
-    private static final String TAG = "GoogleAccountType";
-
-    public static final String ACCOUNT_TYPE = "com.google";
-
-    private static final List<String> mExtensionPackages =
-            Lists.newArrayList("com.google.android.apps.plus");
-
-    public GoogleAccountType(Context context, String authenticatorPackageName) {
-        this.accountType = ACCOUNT_TYPE;
-        this.resourcePackageName = null;
-        this.syncAdapterPackageName = authenticatorPackageName;
-
-        try {
-            addDataKindStructuredName(context);
-            addDataKindDisplayName(context);
-            addDataKindPhoneticName(context);
-            addDataKindNickname(context);
-            addDataKindPhone(context);
-            addDataKindEmail(context);
-            addDataKindStructuredPostal(context);
-            addDataKindIm(context);
-            addDataKindOrganization(context);
-            addDataKindPhoto(context);
-            addDataKindNote(context);
-            addDataKindWebsite(context);
-            addDataKindSipAddress(context);
-            addDataKindGroupMembership(context);
-            addDataKindRelation(context);
-            addDataKindEvent(context);
-
-            mIsInitialized = true;
-        } catch (DefinitionException e) {
-            Log.e(TAG, "Problem building account type", e);
-        }
-    }
-
-    @Override
-    public List<String> getExtensionPackageNames() {
-        return mExtensionPackages;
-    }
-
-    @Override
-    protected DataKind addDataKindPhone(Context context) throws DefinitionException {
-        final DataKind kind = super.addDataKindPhone(context);
-
-        kind.typeColumn = Phone.TYPE;
-        kind.typeList = Lists.newArrayList();
-        kind.typeList.add(buildPhoneType(Phone.TYPE_MOBILE));
-        kind.typeList.add(buildPhoneType(Phone.TYPE_WORK));
-        kind.typeList.add(buildPhoneType(Phone.TYPE_HOME));
-        kind.typeList.add(buildPhoneType(Phone.TYPE_MAIN));
-        kind.typeList.add(buildPhoneType(Phone.TYPE_FAX_WORK).setSecondary(true));
-        kind.typeList.add(buildPhoneType(Phone.TYPE_FAX_HOME).setSecondary(true));
-        kind.typeList.add(buildPhoneType(Phone.TYPE_PAGER).setSecondary(true));
-        kind.typeList.add(buildPhoneType(Phone.TYPE_OTHER));
-        kind.typeList.add(buildPhoneType(Phone.TYPE_CUSTOM).setSecondary(true)
-                .setCustomColumn(Phone.LABEL));
-
-        kind.fieldList = Lists.newArrayList();
-        kind.fieldList.add(new EditField(Phone.NUMBER, R.string.phoneLabelsGroup, FLAGS_PHONE));
-
-        return kind;
-    }
-
-    @Override
-    protected DataKind addDataKindEmail(Context context) throws DefinitionException {
-        final DataKind kind = super.addDataKindEmail(context);
-
-        kind.typeColumn = Email.TYPE;
-        kind.typeList = Lists.newArrayList();
-        kind.typeList.add(buildEmailType(Email.TYPE_HOME));
-        kind.typeList.add(buildEmailType(Email.TYPE_WORK));
-        kind.typeList.add(buildEmailType(Email.TYPE_OTHER));
-        kind.typeList.add(buildEmailType(Email.TYPE_CUSTOM).setSecondary(true).setCustomColumn(
-                Email.LABEL));
-
-        kind.fieldList = Lists.newArrayList();
-        kind.fieldList.add(new EditField(Email.DATA, R.string.emailLabelsGroup, FLAGS_EMAIL));
-
-        return kind;
-    }
-
-    private DataKind addDataKindRelation(Context context) throws DefinitionException {
-        DataKind kind = addKind(new DataKind(Relation.CONTENT_ITEM_TYPE,
-                R.string.relationLabelsGroup, 160, true, R.layout.text_fields_editor_view));
-        kind.actionHeader = new RelationActionInflater();
-        kind.actionBody = new SimpleInflater(Relation.NAME);
-
-        kind.typeColumn = Relation.TYPE;
-        kind.typeList = Lists.newArrayList();
-        kind.typeList.add(buildRelationType(Relation.TYPE_ASSISTANT));
-        kind.typeList.add(buildRelationType(Relation.TYPE_BROTHER));
-        kind.typeList.add(buildRelationType(Relation.TYPE_CHILD));
-        kind.typeList.add(buildRelationType(Relation.TYPE_DOMESTIC_PARTNER));
-        kind.typeList.add(buildRelationType(Relation.TYPE_FATHER));
-        kind.typeList.add(buildRelationType(Relation.TYPE_FRIEND));
-        kind.typeList.add(buildRelationType(Relation.TYPE_MANAGER));
-        kind.typeList.add(buildRelationType(Relation.TYPE_MOTHER));
-        kind.typeList.add(buildRelationType(Relation.TYPE_PARENT));
-        kind.typeList.add(buildRelationType(Relation.TYPE_PARTNER));
-        kind.typeList.add(buildRelationType(Relation.TYPE_REFERRED_BY));
-        kind.typeList.add(buildRelationType(Relation.TYPE_RELATIVE));
-        kind.typeList.add(buildRelationType(Relation.TYPE_SISTER));
-        kind.typeList.add(buildRelationType(Relation.TYPE_SPOUSE));
-        kind.typeList.add(buildRelationType(Relation.TYPE_CUSTOM).setSecondary(true)
-                .setCustomColumn(Relation.LABEL));
-
-        kind.defaultValues = new ContentValues();
-        kind.defaultValues.put(Relation.TYPE, Relation.TYPE_SPOUSE);
-
-        kind.fieldList = Lists.newArrayList();
-        kind.fieldList.add(new EditField(Relation.DATA, R.string.relationLabelsGroup,
-                FLAGS_RELATION));
-
-        return kind;
-    }
-
-    private DataKind addDataKindEvent(Context context) throws DefinitionException {
-        DataKind kind = addKind(new DataKind(Event.CONTENT_ITEM_TYPE,
-                    R.string.eventLabelsGroup, 150, true, R.layout.event_field_editor_view));
-        kind.actionHeader = new EventActionInflater();
-        kind.actionBody = new SimpleInflater(Event.START_DATE);
-
-        kind.typeColumn = Event.TYPE;
-        kind.typeList = Lists.newArrayList();
-        kind.dateFormatWithoutYear = DateUtils.NO_YEAR_DATE_FORMAT;
-        kind.dateFormatWithYear = DateUtils.FULL_DATE_FORMAT;
-        kind.typeList.add(buildEventType(Event.TYPE_BIRTHDAY, true).setSpecificMax(1));
-        kind.typeList.add(buildEventType(Event.TYPE_ANNIVERSARY, false));
-        kind.typeList.add(buildEventType(Event.TYPE_OTHER, false));
-        kind.typeList.add(buildEventType(Event.TYPE_CUSTOM, false).setSecondary(true)
-                .setCustomColumn(Event.LABEL));
-
-        kind.defaultValues = new ContentValues();
-        kind.defaultValues.put(Event.TYPE, Event.TYPE_BIRTHDAY);
-
-        kind.fieldList = Lists.newArrayList();
-        kind.fieldList.add(new EditField(Event.DATA, R.string.eventLabelsGroup, FLAGS_EVENT));
-
-        return kind;
-    }
-
-    @Override
-    public boolean isGroupMembershipEditable() {
-        return true;
-    }
-
-    @Override
-    public boolean areContactsWritable() {
-        return true;
-    }
-
-    @Override
-    public String getViewContactNotifyServiceClassName() {
-        return "com.google.android.syncadapters.contacts." +
-                "SyncHighResPhotoIntentService";
-    }
-
-    @Override
-    public String getViewContactNotifyServicePackageName() {
-        return "com.google.android.syncadapters.contacts";
-    }
-}
diff --git a/src/com/android/contacts/model/dataitem/DataItem.java b/src/com/android/contacts/model/dataitem/DataItem.java
index 9c618de..38d0c03 100644
--- a/src/com/android/contacts/model/dataitem/DataItem.java
+++ b/src/com/android/contacts/model/dataitem/DataItem.java
@@ -35,6 +35,8 @@
 import android.provider.ContactsContract.CommonDataKinds.Website;
 import android.provider.ContactsContract.Contacts.Data;
 
+import com.android.contacts.common.model.dataitem.DataKind;
+
 /**
  * This is the base class for data items, which represents a row from the Data table.
  */
diff --git a/src/com/android/contacts/model/dataitem/DataKind.java b/src/com/android/contacts/model/dataitem/DataKind.java
deleted file mode 100644
index 204b784..0000000
--- a/src/com/android/contacts/model/dataitem/DataKind.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * 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.dataitem;
-
-import android.content.ContentValues;
-import android.content.Context;
-import android.provider.ContactsContract.Data;
-
-import com.android.contacts.R;
-import com.android.contacts.model.account.AccountType.EditField;
-import com.android.contacts.model.account.AccountType.EditType;
-import com.android.contacts.model.account.AccountType.StringInflater;
-import com.google.common.collect.Iterators;
-
-import java.text.SimpleDateFormat;
-import java.util.List;
-
-/**
- * Description of a specific data type, usually marked by a unique
- * {@link Data#MIMETYPE}. Includes details about how to view and edit
- * {@link Data} rows of this kind, including the possible {@link EditType}
- * labels and editable {@link EditField}.
- */
-public final class DataKind {
-
-    public static final String PSEUDO_MIME_TYPE_DISPLAY_NAME = "#displayName";
-    public static final String PSEUDO_MIME_TYPE_PHONETIC_NAME = "#phoneticName";
-    public static final String PSEUDO_COLUMN_PHONETIC_NAME = "#phoneticName";
-
-    public String resourcePackageName;
-    public String mimeType;
-    public int titleRes;
-    public int iconAltRes;
-    public int iconAltDescriptionRes;
-    public int weight;
-    public boolean editable;
-
-    public StringInflater actionHeader;
-    public StringInflater actionAltHeader;
-    public StringInflater actionBody;
-
-    public boolean actionBodySocial = false;
-
-    public String typeColumn;
-
-    /**
-     * Maximum number of values allowed in the list. -1 represents infinity.
-     */
-    public int typeOverallMax;
-
-    public List<EditType> typeList;
-    public List<EditField> fieldList;
-
-    public ContentValues defaultValues;
-
-    /** Layout resource id for an editor view to edit this {@link DataKind}. */
-    public final int editorLayoutResourceId;
-
-    /**
-     * If this is a date field, this specifies the format of the date when saving. The
-     * date includes year, month and day. If this is not a date field or the date field is not
-     * editable, this value should be ignored.
-     */
-    public SimpleDateFormat dateFormatWithoutYear;
-
-    /**
-     * If this is a date field, this specifies the format of the date when saving. The
-     * date includes month and day. If this is not a date field, the field is not editable or
-     * dates without year are not supported, this value should be ignored.
-     */
-    public SimpleDateFormat dateFormatWithYear;
-
-    /**
-     * The number of lines available for displaying this kind of data in a
-     * {@link ContactDetailFragment} (and possibly elsewhere)
-     * Defaults to 1.
-     */
-    public int maxLinesForDisplay;
-
-    public DataKind() {
-        editorLayoutResourceId = R.layout.text_fields_editor_view;
-        maxLinesForDisplay = 1;
-    }
-
-    public DataKind(String mimeType, int titleRes, int weight, boolean editable,
-            int editorLayoutResourceId) {
-        this.mimeType = mimeType;
-        this.titleRes = titleRes;
-        this.weight = weight;
-        this.editable = editable;
-        this.typeOverallMax = -1;
-        this.editorLayoutResourceId = editorLayoutResourceId;
-        maxLinesForDisplay = 1;
-    }
-
-    public String getKindString(Context context) {
-        return (titleRes == -1 || titleRes == 0) ? "" : context.getString(titleRes);
-    }
-
-    @Override
-    public String toString() {
-        final StringBuilder sb = new StringBuilder();
-        sb.append("DataKind:");
-        sb.append(" resPackageName=").append(resourcePackageName);
-        sb.append(" mimeType=").append(mimeType);
-        sb.append(" titleRes=").append(titleRes);
-        sb.append(" iconAltRes=").append(iconAltRes);
-        sb.append(" iconAltDescriptionRes=").append(iconAltDescriptionRes);
-        sb.append(" weight=").append(weight);
-        sb.append(" editable=").append(editable);
-        sb.append(" actionHeader=").append(actionHeader);
-        sb.append(" actionAltHeader=").append(actionAltHeader);
-        sb.append(" actionBody=").append(actionBody);
-        sb.append(" actionBodySocial=").append(actionBodySocial);
-        sb.append(" typeColumn=").append(typeColumn);
-        sb.append(" typeOverallMax=").append(typeOverallMax);
-        sb.append(" typeList=").append(toString(typeList));
-        sb.append(" fieldList=").append(toString(fieldList));
-        sb.append(" defaultValues=").append(defaultValues);
-        sb.append(" editorLayoutResourceId=").append(editorLayoutResourceId);
-        sb.append(" dateFormatWithoutYear=").append(toString(dateFormatWithoutYear));
-        sb.append(" dateFormatWithYear=").append(toString(dateFormatWithYear));
-
-        return sb.toString();
-    }
-
-    public static String toString(SimpleDateFormat format) {
-        return format == null ? "(null)" : format.toPattern();
-    }
-
-    public static String toString(Iterable<?> list) {
-        if (list == null) {
-            return "(null)";
-        } else {
-            return Iterators.toString(list.iterator());
-        }
-    }
-}
diff --git a/src/com/android/contacts/quickcontact/DataAction.java b/src/com/android/contacts/quickcontact/DataAction.java
index 3cf3adf..90a97de 100644
--- a/src/com/android/contacts/quickcontact/DataAction.java
+++ b/src/com/android/contacts/quickcontact/DataAction.java
@@ -32,9 +32,9 @@
 import com.android.contacts.ContactsUtils;
 import com.android.contacts.R;
 import com.android.contacts.common.MoreContactUtils;
-import com.android.contacts.model.account.AccountType.EditType;
+import com.android.contacts.common.model.account.AccountType.EditType;
 import com.android.contacts.model.dataitem.DataItem;
-import com.android.contacts.model.dataitem.DataKind;
+import com.android.contacts.common.model.dataitem.DataKind;
 import com.android.contacts.model.dataitem.EmailDataItem;
 import com.android.contacts.model.dataitem.ImDataItem;
 import com.android.contacts.model.dataitem.PhoneDataItem;
diff --git a/src/com/android/contacts/quickcontact/QuickContactActivity.java b/src/com/android/contacts/quickcontact/QuickContactActivity.java
index 36d29ec..9044e32 100644
--- a/src/com/android/contacts/quickcontact/QuickContactActivity.java
+++ b/src/com/android/contacts/quickcontact/QuickContactActivity.java
@@ -62,9 +62,9 @@
 import com.android.contacts.model.Contact;
 import com.android.contacts.model.ContactLoader;
 import com.android.contacts.model.RawContact;
-import com.android.contacts.model.account.AccountType;
+import com.android.contacts.common.model.account.AccountType;
 import com.android.contacts.model.dataitem.DataItem;
-import com.android.contacts.model.dataitem.DataKind;
+import com.android.contacts.common.model.dataitem.DataKind;
 import com.android.contacts.model.dataitem.EmailDataItem;
 import com.android.contacts.model.dataitem.ImDataItem;
 import com.android.contacts.util.Constants;
diff --git a/src/com/android/contacts/socialwidget/SocialWidgetProvider.java b/src/com/android/contacts/socialwidget/SocialWidgetProvider.java
index 259f38d..5c584b4 100644
--- a/src/com/android/contacts/socialwidget/SocialWidgetProvider.java
+++ b/src/com/android/contacts/socialwidget/SocialWidgetProvider.java
@@ -41,7 +41,7 @@
 import com.android.contacts.model.AccountTypeManager;
 import com.android.contacts.model.Contact;
 import com.android.contacts.model.ContactLoader;
-import com.android.contacts.model.account.AccountType;
+import com.android.contacts.common.model.account.AccountType;
 import com.android.contacts.quickcontact.QuickContactBroadcastReceiver;
 import com.android.contacts.util.ContactBadgeUtil;
 import com.android.contacts.util.HtmlUtils;
diff --git a/src/com/android/contacts/test/NeededForTesting.java b/src/com/android/contacts/test/NeededForTesting.java
deleted file mode 100644
index f40fe2c..0000000
--- a/src/com/android/contacts/test/NeededForTesting.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * 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.test;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Denotes that the class, constructor, method or field is used by tests and therefore cannot be
- * removed by tools like ProGuard.
- */
-@Retention(RetentionPolicy.CLASS)
-@Target({ElementType.TYPE, ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.FIELD})
-public @interface NeededForTesting {}
diff --git a/src/com/android/contacts/util/AccountPromptUtils.java b/src/com/android/contacts/util/AccountPromptUtils.java
index cdefda0..979176b 100644
--- a/src/com/android/contacts/util/AccountPromptUtils.java
+++ b/src/com/android/contacts/util/AccountPromptUtils.java
@@ -30,7 +30,7 @@
 import android.util.Log;
 
 import com.android.contacts.R;
-import com.android.contacts.model.account.GoogleAccountType;
+import com.android.contacts.common.model.account.GoogleAccountType;
 
 import java.io.IOException;
 
diff --git a/src/com/android/contacts/util/AccountSelectionUtil.java b/src/com/android/contacts/util/AccountSelectionUtil.java
index d83cb41..d3c9d14 100644
--- a/src/com/android/contacts/util/AccountSelectionUtil.java
+++ b/src/com/android/contacts/util/AccountSelectionUtil.java
@@ -32,8 +32,8 @@
 
 import com.android.contacts.R;
 import com.android.contacts.model.AccountTypeManager;
-import com.android.contacts.model.account.AccountType;
-import com.android.contacts.model.account.AccountWithDataSet;
+import com.android.contacts.common.model.account.AccountType;
+import com.android.contacts.common.model.account.AccountWithDataSet;
 
 import java.util.List;
 
diff --git a/src/com/android/contacts/util/AccountsListAdapter.java b/src/com/android/contacts/util/AccountsListAdapter.java
index 4355cba..2740049 100644
--- a/src/com/android/contacts/util/AccountsListAdapter.java
+++ b/src/com/android/contacts/util/AccountsListAdapter.java
@@ -27,8 +27,8 @@
 
 import com.android.contacts.R;
 import com.android.contacts.model.AccountTypeManager;
-import com.android.contacts.model.account.AccountType;
-import com.android.contacts.model.account.AccountWithDataSet;
+import com.android.contacts.common.model.account.AccountType;
+import com.android.contacts.common.model.account.AccountWithDataSet;
 
 import java.util.ArrayList;
 import java.util.List;
diff --git a/src/com/android/contacts/util/DateUtils.java b/src/com/android/contacts/util/DateUtils.java
index 89127c9..56fcead 100644
--- a/src/com/android/contacts/util/DateUtils.java
+++ b/src/com/android/contacts/util/DateUtils.java
@@ -19,6 +19,8 @@
 import android.content.Context;
 import android.text.format.DateFormat;
 
+import com.android.contacts.common.util.CommonDateUtils;
+
 import java.text.ParsePosition;
 import java.text.SimpleDateFormat;
 import java.util.Calendar;
@@ -32,26 +34,17 @@
 public class DateUtils {
     public static final TimeZone UTC_TIMEZONE = TimeZone.getTimeZone("UTC");
 
-    // All the SimpleDateFormats in this class use the UTC timezone
-    public static final SimpleDateFormat NO_YEAR_DATE_FORMAT =
-            new SimpleDateFormat("--MM-dd", Locale.US);
     /**
      * When parsing a date without a year, the system assumes 1970, which wasn't a leap-year.
      * Let's add a one-off hack for that day of the year
      */
     public static final String NO_YEAR_DATE_FEB29TH = "--02-29";
-    public static final SimpleDateFormat FULL_DATE_FORMAT =
-            new SimpleDateFormat("yyyy-MM-dd", Locale.US);
-    public static final SimpleDateFormat DATE_AND_TIME_FORMAT =
-            new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.US);
-    public static final SimpleDateFormat NO_YEAR_DATE_AND_TIME_FORMAT =
-            new SimpleDateFormat("--MM-dd'T'HH:mm:ss.SSS'Z'", Locale.US);
 
     // Variations of ISO 8601 date format.  Do not change the order - it does affect the
     // result in ambiguous cases.
     private static final SimpleDateFormat[] DATE_FORMATS = {
-        FULL_DATE_FORMAT,
-        DATE_AND_TIME_FORMAT,
+        CommonDateUtils.FULL_DATE_FORMAT,
+        CommonDateUtils.DATE_AND_TIME_FORMAT,
         new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'", Locale.US),
         new SimpleDateFormat("yyyyMMdd", Locale.US),
         new SimpleDateFormat("yyyyMMdd'T'HHmmssSSS'Z'", Locale.US),
@@ -70,7 +63,7 @@
             format.setLenient(true);
             format.setTimeZone(UTC_TIMEZONE);
         }
-        NO_YEAR_DATE_FORMAT.setTimeZone(UTC_TIMEZONE);
+        CommonDateUtils.NO_YEAR_DATE_FORMAT.setTimeZone(UTC_TIMEZONE);
         FORMAT_WITHOUT_YEAR_MONTH_FIRST.setTimeZone(UTC_TIMEZONE);
         FORMAT_WITHOUT_YEAR_DAY_FIRST.setTimeZone(UTC_TIMEZONE);
     }
@@ -127,8 +120,8 @@
             date = getUtcDate(0, Calendar.FEBRUARY, 29);
             noYearParsed = true;
         } else {
-            synchronized (NO_YEAR_DATE_FORMAT) {
-                date = NO_YEAR_DATE_FORMAT.parse(string, parsePosition);
+            synchronized (CommonDateUtils.NO_YEAR_DATE_FORMAT) {
+                date = CommonDateUtils.NO_YEAR_DATE_FORMAT.parse(string, parsePosition);
             }
             noYearParsed = parsePosition.getIndex() == string.length();
         }
diff --git a/src/com/android/contacts/util/StreamItemEntry.java b/src/com/android/contacts/util/StreamItemEntry.java
index b15bae9..2332c0e 100644
--- a/src/com/android/contacts/util/StreamItemEntry.java
+++ b/src/com/android/contacts/util/StreamItemEntry.java
@@ -22,7 +22,7 @@
 import android.text.Html;
 
 import com.android.contacts.detail.ContactDetailDisplayUtils;
-import com.android.contacts.test.NeededForTesting;
+import com.android.contacts.common.test.NeededForTesting;
 
 import java.util.ArrayList;
 import java.util.Collections;
diff --git a/src/com/android/contacts/vcard/ImportVCardActivity.java b/src/com/android/contacts/vcard/ImportVCardActivity.java
index 9af2d52..a741ba3 100644
--- a/src/com/android/contacts/vcard/ImportVCardActivity.java
+++ b/src/com/android/contacts/vcard/ImportVCardActivity.java
@@ -49,7 +49,7 @@
 import com.android.contacts.ContactsActivity;
 import com.android.contacts.R;
 import com.android.contacts.model.AccountTypeManager;
-import com.android.contacts.model.account.AccountWithDataSet;
+import com.android.contacts.common.model.account.AccountWithDataSet;
 import com.android.contacts.util.AccountSelectionUtil;
 import com.android.vcard.VCardEntryCounter;
 import com.android.vcard.VCardParser;
diff --git a/src/com/android/contacts/vcard/NfcImportVCardActivity.java b/src/com/android/contacts/vcard/NfcImportVCardActivity.java
index 035be60..c181dfa 100644
--- a/src/com/android/contacts/vcard/NfcImportVCardActivity.java
+++ b/src/com/android/contacts/vcard/NfcImportVCardActivity.java
@@ -33,7 +33,7 @@
 
 import com.android.contacts.R;
 import com.android.contacts.model.AccountTypeManager;
-import com.android.contacts.model.account.AccountWithDataSet;
+import com.android.contacts.common.model.account.AccountWithDataSet;
 import com.android.vcard.VCardEntry;
 import com.android.vcard.VCardEntryCounter;
 import com.android.vcard.VCardParser;
diff --git a/src/com/android/contacts/vcard/SelectAccountActivity.java b/src/com/android/contacts/vcard/SelectAccountActivity.java
index 0e9c5a8..9185244 100644
--- a/src/com/android/contacts/vcard/SelectAccountActivity.java
+++ b/src/com/android/contacts/vcard/SelectAccountActivity.java
@@ -24,7 +24,7 @@
 import com.android.contacts.ContactsActivity;
 import com.android.contacts.R;
 import com.android.contacts.model.AccountTypeManager;
-import com.android.contacts.model.account.AccountWithDataSet;
+import com.android.contacts.common.model.account.AccountWithDataSet;
 import com.android.contacts.util.AccountSelectionUtil;
 
 import java.util.List;
diff --git a/src/com/android/contacts/widget/CompositeListAdapter.java b/src/com/android/contacts/widget/CompositeListAdapter.java
index 34c8fa0..d83246a 100644
--- a/src/com/android/contacts/widget/CompositeListAdapter.java
+++ b/src/com/android/contacts/widget/CompositeListAdapter.java
@@ -21,7 +21,7 @@
 import android.widget.BaseAdapter;
 import android.widget.ListAdapter;
 
-import com.android.contacts.test.NeededForTesting;
+import com.android.contacts.common.test.NeededForTesting;
 import com.google.common.annotations.VisibleForTesting;
 
 /**
diff --git a/tests/AndroidManifest.xml b/tests/AndroidManifest.xml
index a3dacbe..7a7df01 100644
--- a/tests/AndroidManifest.xml
+++ b/tests/AndroidManifest.xml
@@ -103,18 +103,6 @@
                 android:resource="@xml/test_basic_authenticator" />
         </service>
 
-        <service android:name=".testauth.TestSyncService$Basic" android:exported="true">
-            <intent-filter>
-                <action android:name="android.content.SyncAdapter" />
-            </intent-filter>
-            <meta-data
-                android:name="android.content.SyncAdapter"
-                android:resource="@xml/test_basic_syncadapter" />
-            <meta-data
-                android:name="android.provider.CONTACTS_STRUCTURE"
-                android:resource="@xml/test_basic_contacts" />
-        </service>
-
         <service android:name=".QueryService" />
         <service android:name=".PhoneNumberTestService" />
     </application>
diff --git a/tests/res/values/donottranslate_strings.xml b/tests/res/values/donottranslate_strings.xml
index dc8bf2f..b3f3ee7 100644
--- a/tests/res/values/donottranslate_strings.xml
+++ b/tests/res/values/donottranslate_strings.xml
@@ -17,7 +17,6 @@
 
     <string name="contactsIntents">Contacts Intents</string>
     <string name="result">Result returned by activity</string>
-    <string name="test_string">TEST STRING</string>
 
     <string-array name="allIntents">
         <!-- List modes -->
diff --git a/tests/res/xml/contacts_fallback.xml b/tests/res/xml/contacts_fallback.xml
deleted file mode 100644
index ae262eb..0000000
--- a/tests/res/xml/contacts_fallback.xml
+++ /dev/null
@@ -1,96 +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.
- */
--->
-
-<!--
-    contacts.xml to build "fallback account type" equivalent.
-    This is directly used in ExternalAccountTypeTest to test the parser.  There's no sync adapter
-    that actually defined with this definition.
--->
-
-<ContactsAccountType
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    >
-    <EditSchema
-        >
-        <DataKind kind="name"
-            maxOccurs="1"
-            supportsDisplayName="true"
-            supportsPrefix="true"
-            supportsMiddleName="true"
-            supportsSuffix="true"
-            supportsPhoneticFamilyName="true"
-            supportsPhoneticMiddleName="true"
-            supportsPhoneticGivenName="true"
-            >
-        </DataKind>
-        <DataKind kind="photo" maxOccurs="1" />
-        <DataKind kind="phone" >
-            <Type type="mobile" />
-            <Type type="home" />
-            <Type type="work" />
-            <Type type="fax_work" />
-            <Type type="fax_home" />
-            <Type type="pager" />
-            <Type type="other" />
-            <Type type="custom"/>
-            <Type type="callback" />
-            <Type type="car" />
-            <Type type="company_main" />
-            <Type type="isdn" />
-            <Type type="main" />
-            <Type type="other_fax" />
-            <Type type="radio" />
-            <Type type="telex" />
-            <Type type="tty_tdd" />
-            <Type type="work_mobile"/>
-            <Type type="work_pager" />
-            <Type type="assistant" />
-            <Type type="mms" />
-        </DataKind>
-        <DataKind kind="email" >
-            <Type type="home" />
-            <Type type="work" />
-            <Type type="other" />
-            <Type type="mobile" />
-            <Type type="custom" />
-        </DataKind>
-        <DataKind kind="nickname" maxOccurs="1" />
-        <DataKind kind="im" >
-            <Type type="aim" />
-            <Type type="msn" />
-            <Type type="yahoo" />
-            <Type type="skype" />
-            <Type type="qq" />
-            <Type type="google_talk" />
-            <Type type="icq" />
-            <Type type="jabber" />
-            <Type type="custom" />
-        </DataKind>
-        <DataKind kind="postal" needsStructured="false" >
-            <Type type="home" />
-            <Type type="work" />
-            <Type type="other" />
-            <Type type="custom" />
-        </DataKind>
-        <DataKind kind="organization" maxOccurs="1" />
-        <DataKind kind="website" />
-        <DataKind kind="sip_address" maxOccurs="1" />
-        <DataKind kind="note" maxOccurs="1" />
-    </EditSchema>
-</ContactsAccountType>
diff --git a/tests/res/xml/contacts_readonly.xml b/tests/res/xml/contacts_readonly.xml
deleted file mode 100644
index df8d9c0..0000000
--- a/tests/res/xml/contacts_readonly.xml
+++ /dev/null
@@ -1,51 +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.
- */
--->
-
-<!--
-    Contacts.xml without EditSchema.
--->
-
-<ContactsAccountType
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    >
-        <ContactsDataKind
-                android:icon="@drawable/android"
-                android:mimeType="vnd.android.cursor.item/a.b.c"
-                android:summaryColumn="data1"
-                android:detailColumn="data2"
-                android:detailSocialSummary="true"
-                >
-        </ContactsDataKind>
-        <ContactsDataKind
-                android:icon="@drawable/default_icon"
-                android:mimeType="vnd.android.cursor.item/d.e.f"
-                android:summaryColumn="data3"
-                android:detailColumn="data4"
-                android:detailSocialSummary="false"
-                >
-        </ContactsDataKind>
-        <ContactsDataKind
-                android:icon="@drawable/android"
-                android:mimeType="vnd.android.cursor.item/xyz"
-                android:summaryColumn="data5"
-                android:detailColumn="data6"
-                android:detailSocialSummary="true"
-                >
-        </ContactsDataKind>
-</ContactsAccountType>
diff --git a/tests/res/xml/iconset.xml b/tests/res/xml/iconset.xml
index d1207e7..b9e419d 100644
--- a/tests/res/xml/iconset.xml
+++ b/tests/res/xml/iconset.xml
@@ -1,24 +1,25 @@
 <?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.
--->
+<!--
+  ~ Copyright (C) 2012 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
+  -->
 
 <icon-set
     xmlns:android="http://schemas.android.com/apk/res/android">
 
     <icon-default android:icon="@drawable/default_icon" />
-    <icon android:mimeType="vnd.android.cursor.item/phone" 
+    <icon android:mimeType="vnd.android.cursor.item/phone"
         android:icon="@drawable/phone_icon" />
 
-</icon-set>
\ No newline at end of file
+</icon-set>
diff --git a/tests/res/xml/missing_contacts_base.xml b/tests/res/xml/missing_contacts_base.xml
deleted file mode 100644
index 2c9aa6d..0000000
--- a/tests/res/xml/missing_contacts_base.xml
+++ /dev/null
@@ -1,39 +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.
- */
--->
-
-<!-- XML for must-have checks.  Base definition, which is valid. -->
-
-<ContactsAccountType
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    >
-    <EditSchema>
-        <DataKind kind="name"
-            maxOccurs="1"
-            supportsDisplayName="true"
-            supportsPrefix="true"
-            supportsMiddleName="true"
-            supportsSuffix="true"
-            supportsPhoneticFamilyName="true"
-            supportsPhoneticMiddleName="true"
-            supportsPhoneticGivenName="true"
-            >
-        </DataKind>
-        <DataKind kind="photo" maxOccurs="1" />
-    </EditSchema>
-</ContactsAccountType>
diff --git a/tests/res/xml/missing_contacts_name.xml b/tests/res/xml/missing_contacts_name.xml
deleted file mode 100644
index 1ac26be..0000000
--- a/tests/res/xml/missing_contacts_name.xml
+++ /dev/null
@@ -1,28 +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.
- */
--->
-
-<!-- XML for must-have checks.  Missing "name" kind. -->
-
-<ContactsAccountType
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    >
-    <EditSchema>
-        <DataKind kind="photo" maxOccurs="1" />
-    </EditSchema>
-</ContactsAccountType>
diff --git a/tests/res/xml/missing_contacts_name_attr1.xml b/tests/res/xml/missing_contacts_name_attr1.xml
deleted file mode 100644
index b7b0f19..0000000
--- a/tests/res/xml/missing_contacts_name_attr1.xml
+++ /dev/null
@@ -1,37 +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.
- */
--->
-
-<!-- XML for must-have checks.  Missing one of the "support*" attributes". -->
-
-<ContactsAccountType
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    >
-    <EditSchema>
-        <DataKind kind="name"
-            maxOccurs="1"
-            supportsPrefix="true"
-            supportsMiddleName="true"
-            supportsSuffix="true"
-            supportsPhoneticFamilyName="true"
-            supportsPhoneticMiddleName="true"
-            supportsPhoneticGivenName="true"
-            />
-        <DataKind kind="photo" maxOccurs="1" />
-    </EditSchema>
-</ContactsAccountType>
diff --git a/tests/res/xml/missing_contacts_name_attr2.xml b/tests/res/xml/missing_contacts_name_attr2.xml
deleted file mode 100644
index 41be9e8..0000000
--- a/tests/res/xml/missing_contacts_name_attr2.xml
+++ /dev/null
@@ -1,37 +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.
- */
--->
-
-<!-- XML for must-have checks.  Missing one of the "support*" attributes". -->
-
-<ContactsAccountType
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    >
-    <EditSchema>
-        <DataKind kind="name"
-            maxOccurs="1"
-            supportsDisplayName="true"
-            supportsMiddleName="true"
-            supportsSuffix="true"
-            supportsPhoneticFamilyName="true"
-            supportsPhoneticMiddleName="true"
-            supportsPhoneticGivenName="true"
-            />
-        <DataKind kind="photo" maxOccurs="1" />
-    </EditSchema>
-</ContactsAccountType>
diff --git a/tests/res/xml/missing_contacts_name_attr3.xml b/tests/res/xml/missing_contacts_name_attr3.xml
deleted file mode 100644
index e639a76..0000000
--- a/tests/res/xml/missing_contacts_name_attr3.xml
+++ /dev/null
@@ -1,37 +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.
- */
--->
-
-<!-- XML for must-have checks.  Missing one of the "support*" attributes". -->
-
-<ContactsAccountType
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    >
-    <EditSchema>
-        <DataKind kind="name"
-            maxOccurs="1"
-            supportsDisplayName="true"
-            supportsPrefix="true"
-            supportsSuffix="true"
-            supportsPhoneticFamilyName="true"
-            supportsPhoneticMiddleName="true"
-            supportsPhoneticGivenName="true"
-            />
-        <DataKind kind="photo" maxOccurs="1" />
-    </EditSchema>
-</ContactsAccountType>
diff --git a/tests/res/xml/missing_contacts_name_attr4.xml b/tests/res/xml/missing_contacts_name_attr4.xml
deleted file mode 100644
index b42cdcd..0000000
--- a/tests/res/xml/missing_contacts_name_attr4.xml
+++ /dev/null
@@ -1,37 +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.
- */
--->
-
-<!-- XML for must-have checks.  Missing one of the "support*" attributes". -->
-
-<ContactsAccountType
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    >
-    <EditSchema>
-        <DataKind kind="name"
-            maxOccurs="1"
-            supportsDisplayName="true"
-            supportsPrefix="true"
-            supportsMiddleName="true"
-            supportsPhoneticFamilyName="true"
-            supportsPhoneticMiddleName="true"
-            supportsPhoneticGivenName="true"
-            />
-        <DataKind kind="photo" maxOccurs="1" />
-    </EditSchema>
-</ContactsAccountType>
diff --git a/tests/res/xml/missing_contacts_name_attr5.xml b/tests/res/xml/missing_contacts_name_attr5.xml
deleted file mode 100644
index 3778d2f..0000000
--- a/tests/res/xml/missing_contacts_name_attr5.xml
+++ /dev/null
@@ -1,37 +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.
- */
--->
-
-<!-- XML for must-have checks.  Missing one of the "support*" attributes". -->
-
-<ContactsAccountType
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    >
-    <EditSchema>
-        <DataKind kind="name"
-            maxOccurs="1"
-            supportsDisplayName="true"
-            supportsPrefix="true"
-            supportsMiddleName="true"
-            supportsSuffix="true"
-            supportsPhoneticMiddleName="true"
-            supportsPhoneticGivenName="true"
-            />
-        <DataKind kind="photo" maxOccurs="1" />
-    </EditSchema>
-</ContactsAccountType>
diff --git a/tests/res/xml/missing_contacts_name_attr6.xml b/tests/res/xml/missing_contacts_name_attr6.xml
deleted file mode 100644
index b3a3411..0000000
--- a/tests/res/xml/missing_contacts_name_attr6.xml
+++ /dev/null
@@ -1,37 +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.
- */
--->
-
-<!-- XML for must-have checks.  Missing one of the "support*" attributes". -->
-
-<ContactsAccountType
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    >
-    <EditSchema>
-        <DataKind kind="name"
-            maxOccurs="1"
-            supportsDisplayName="true"
-            supportsPrefix="true"
-            supportsMiddleName="true"
-            supportsSuffix="true"
-            supportsPhoneticFamilyName="true"
-            supportsPhoneticGivenName="true"
-            />
-        <DataKind kind="photo" maxOccurs="1" />
-    </EditSchema>
-</ContactsAccountType>
diff --git a/tests/res/xml/missing_contacts_name_attr7.xml b/tests/res/xml/missing_contacts_name_attr7.xml
deleted file mode 100644
index c87e4f1..0000000
--- a/tests/res/xml/missing_contacts_name_attr7.xml
+++ /dev/null
@@ -1,37 +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.
- */
--->
-
-<!-- XML for must-have checks.  Missing one of the "support*" attributes". -->
-
-<ContactsAccountType
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    >
-    <EditSchema>
-        <DataKind kind="name"
-            maxOccurs="1"
-            supportsDisplayName="true"
-            supportsPrefix="true"
-            supportsMiddleName="true"
-            supportsSuffix="true"
-            supportsPhoneticFamilyName="true"
-            supportsPhoneticMiddleName="true"
-            />
-        <DataKind kind="photo" maxOccurs="1" />
-    </EditSchema>
-</ContactsAccountType>
diff --git a/tests/res/xml/missing_contacts_photo.xml b/tests/res/xml/missing_contacts_photo.xml
deleted file mode 100644
index 87f4fc6..0000000
--- a/tests/res/xml/missing_contacts_photo.xml
+++ /dev/null
@@ -1,38 +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.
- */
--->
-
-<!-- XML for must-have checks.  Missing "photo" kind. -->
-
-<ContactsAccountType
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    >
-    <EditSchema>
-        <DataKind kind="name"
-            maxOccurs="1"
-            supportsDisplayName="true"
-            supportsPrefix="true"
-            supportsMiddleName="true"
-            supportsSuffix="true"
-            supportsPhoneticFamilyName="true"
-            supportsPhoneticMiddleName="true"
-            supportsPhoneticGivenName="true"
-            >
-        </DataKind>
-    </EditSchema>
-</ContactsAccountType>
diff --git a/tests/res/xml/test_basic_contacts.xml b/tests/res/xml/test_basic_contacts.xml
deleted file mode 100644
index 0047204..0000000
--- a/tests/res/xml/test_basic_contacts.xml
+++ /dev/null
@@ -1,283 +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.
- */
--->
-
-<ContactsAccountType
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    >
-    <EditSchema
-        >
-        <!--
-            Name:
-            - maxOccurs must be 1
-            - No types.
-
-            - Currently all the supportsXxx attributes must be true, but here's the plan for the
-              future:
-              (There's some hardcoded assumptions in the contact editor, which is one reason
-              for the above restriction)
-
-                - "Family name" and "Given name" must be supported.
-                    - All sync adapters must support structured name. "display name only" is not
-                      supported.
-                      -> Supporting this would require relatively large changes to
-                         the contact editor.
-
-                - Fields are decided from the attributes:
-                    StructuredName.DISPLAY_NAME         if supportsDisplayName == true
-                    StructuredName.PREFIX               if supportsPrefix == true
-                    StructuredName.FAMILY_NAME          (always)
-                    StructuredName.MIDDLE_NAME          if supportsPrefix == true
-                    StructuredName.GIVEN_NAME           (always)
-                    StructuredName.SUFFIX               if supportsSuffix == true
-                    StructuredName.PHONETIC_FAMILY_NAME if supportsPhoneticFamilyName == true
-                    StructuredName.PHONETIC_MIDDLE_NAME if supportsPhoneticMiddleName == true
-                    StructuredName.PHONETIC_GIVEN_NAME  if supportsPhoneticGivenName == true
-
-                - DataKind.PSEUDO_MIME_TYPE_DISPLAY_NAME  is always added.
-                - DataKind.PSEUDO_MIME_TYPE_PHONETIC_NAME is added
-                  if any of supportsPhoneticXxx == true
-        -->
-        <!-- Fallback/Google definition.  Supports all. -->
-        <DataKind kind="name"
-            maxOccurs="1"
-            supportsDisplayName="true"
-            supportsPrefix="true"
-            supportsMiddleName="true"
-            supportsSuffix="true"
-            supportsPhoneticFamilyName="true"
-            supportsPhoneticMiddleName="true"
-            supportsPhoneticGivenName="true"
-            >
-        </DataKind>
-
-        <!-- Exchange definition.  No display-name, no phonetic-middle.
-        <DataKind kind="name"
-            supportsDisplayName="false"
-            supportsPrefix="true"
-            supportsMiddleName="true"
-            supportsSuffix="true"
-            supportsPhoneticFamilyName="true"
-            supportsPhoneticMiddleName="false"
-            supportsPhoneticGivenName ="true"
-            >
-        </DataKind>
-        -->
-
-        <!--
-            Photo:
-            - maxOccurs must be 1
-            - No types.
-        -->
-        <DataKind kind="photo" maxOccurs="1" />
-
-        <!--
-            Phone definition.
-            - "is secondary?" is inferred from type.
-        -->
-        <!-- Fallback, Google definition.  -->
-        <DataKind kind="phone" >
-            <!-- Note: Google type doesn't have obsolete ones -->
-            <Type type="mobile" />
-            <Type type="home" />
-            <Type type="work" />
-            <Type type="fax_work" />
-            <Type type="fax_home" />
-            <Type type="pager" />
-            <Type type="other" />
-            <Type type="custom"/>
-            <Type type="callback" />
-            <Type type="car" />
-            <Type type="company_main" />
-            <Type type="isdn" />
-            <Type type="main" />
-            <Type type="other_fax" />
-            <Type type="radio" />
-            <Type type="telex" />
-            <Type type="tty_tdd" />
-            <Type type="work_mobile"/>
-            <Type type="work_pager" />
-            <Type type="assistant" />
-            <Type type="mms" />
-        </DataKind>
-
-        <!-- Exchange definition.
-        <DataKind kind="phone" >
-            <Type type="home" maxOccurs="2" />
-            <Type type="mobile" maxOccurs="1" />
-            <Type type="work" maxOccurs="2" />
-            <Type type="fax_work" maxOccurs="1" />
-            <Type type="fax_home" maxOccurs="1" />
-            <Type type="pager" maxOccurs="1" />
-            <Type type="car" maxOccurs="1" />
-            <Type type="company_main" maxOccurs="1" />
-            <Type type="mms" maxOccurs="1" />
-            <Type type="radio" maxOccurs="1" />
-            <Type type="assistant" maxOccurs="1" />
-        </DataKind>
-        -->
-
-        <!--
-            Email
-        -->
-        <!-- Fallback/Google definition.  -->
-        <DataKind kind="email" >
-            <!-- Note: Google type doesn't have obsolete ones -->
-            <Type type="home" />
-            <Type type="work" />
-            <Type type="other" />
-            <Type type="mobile" />
-            <Type type="custom" />
-        </DataKind>
-
-        <!--
-            Exchange definition.
-            - Same definition as "fallback" except for maxOccurs=3
-        <DataKind kind="email" maxOccurs="3" >
-            <Type type="home" />
-            <Type type="work" />
-            <Type type="other" />
-            <Type type="mobile" />
-            <Type type="custom" />
-        </DataKind>
-        -->
-
-        <!--
-            Nickname
-            - maxOccurs must be 1
-            - No types.
-        -->
-        <DataKind kind="nickname" maxOccurs="1" />
-
-        <!--
-            Im:
-             - The TYPE column always stores Im.TYPE_OTHER (defaultValues is always set)
-             - The user-selected type is stored in Im.PROTOCOL
-        -->
-        <!-- Fallback, Google definition.  -->
-        <DataKind kind="im" >
-            <Type type="aim" />
-            <Type type="msn" />
-            <Type type="yahoo" />
-            <Type type="skype" />
-            <Type type="qq" />
-            <Type type="google_talk" />
-            <Type type="icq" />
-            <Type type="jabber" />
-            <Type type="custom" />
-        </DataKind>
-
-        <!-- Exchange definition.
-        <DataKind kind="im" maxOccurs="3" >
-            <Type type="aim" />
-            <Type type="msn" />
-            <Type type="yahoo" />
-            <Type type="skype" />
-            <Type type="qq" />
-            <Type type="google_talk" />
-            <Type type="icq" />
-            <Type type="jabber" />
-            <Type type="custom" />
-        </DataKind>
-        -->
-
-        <!--
-            Postal address.
-        -->
-        <!-- Fallback/Google definition.  Not structured. -->
-        <DataKind kind="postal" needsStructured="false" >
-            <Type type="home" />
-            <Type type="work" />
-            <Type type="other" />
-            <Type type="custom" />
-        </DataKind>
-
-        <!-- Exchange definition.  Structured.
-        <DataKind kind="postal" needsStructured="true" >
-            <Type type="work" />
-            <Type type="home" />
-            <Type type="other" />
-        </DataKind>
-        -->
-
-        <!--
-            Organization:
-            - Fields are fixed: COMPANY, TITLE
-            - maxOccurs must be 1
-            - No types.
-        -->
-        <DataKind kind="organization" maxOccurs="1" />
-
-        <!--
-            Website:
-            - No types.
-        -->
-        <DataKind kind="website" />
-
-        <!--
-            Below kinds have nothing configurable.
-            - No types are supported.
-            - maxOccurs must be 1
-        -->
-        <DataKind kind="sip_address" maxOccurs="1" />
-        <DataKind kind="note" maxOccurs="1" />
-
-        <!--
-            Google/Exchange supports it, but fallback doesn't.
-        <DataKind kind="group_membership" maxOccurs="1" />
-        -->
-
-        <!--
-            Event
-        -->
-        <DataKind kind="event" dateWithTime="false">
-            <Type type="birthday" maxOccurs="1" yearOptional="true" />
-            <Type type="anniversary" />
-            <Type type="other" />
-            <Type type="custom" />
-        </DataKind>
-
-        <!--
-            Exchange definition.  dateWithTime is needed only for Exchange.
-        <DataKind kind="event" dateWithTime="true">
-            <Type type="birthday" maxOccurs="1" />
-        </DataKind>
-        -->
-
-        <!--
-            Relationship
-        -->
-        <DataKind kind="relationship" >
-            <Type type="assistant" />
-            <Type type="brother" />
-            <Type type="child" />
-            <Type type="domestic_partner" />
-            <Type type="father" />
-            <Type type="friend" />
-            <Type type="manager" />
-            <Type type="mother" />
-            <Type type="parent" />
-            <Type type="partner" />
-            <Type type="referred_by" />
-            <Type type="relative" />
-            <Type type="sister" />
-            <Type type="spouse" />
-            <Type type="custom" />
-        </DataKind>
-    </EditSchema>
-</ContactsAccountType>
diff --git a/tests/res/xml/test_basic_syncadapter.xml b/tests/res/xml/test_basic_syncadapter.xml
deleted file mode 100644
index fecc0eb..0000000
--- a/tests/res/xml/test_basic_syncadapter.xml
+++ /dev/null
@@ -1,25 +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.
- */
--->
-
-<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android"
-    android:contentAuthority="com.android.contacts"
-    android:accountType="com.android.contacts.tests.authtest.basic"
-    android:supportsUploading="true"
-    android:userVisible="true"
-/>
diff --git a/tests/src/com/android/contacts/RawContactDeltaListTests.java b/tests/src/com/android/contacts/RawContactDeltaListTests.java
index 07e9dd6..ef7667b 100644
--- a/tests/src/com/android/contacts/RawContactDeltaListTests.java
+++ b/tests/src/com/android/contacts/RawContactDeltaListTests.java
@@ -40,7 +40,7 @@
 import com.android.contacts.model.RawContactDelta.ValuesDelta;
 import com.android.contacts.model.RawContactDeltaList;
 import com.android.contacts.model.RawContactModifier;
-import com.android.contacts.model.account.AccountType;
+import com.android.contacts.common.model.account.AccountType;
 import com.google.common.collect.Lists;
 
 import java.lang.reflect.Field;
diff --git a/tests/src/com/android/contacts/RawContactModifierTests.java b/tests/src/com/android/contacts/RawContactModifierTests.java
index 497bede..bb0945b 100644
--- a/tests/src/com/android/contacts/RawContactModifierTests.java
+++ b/tests/src/com/android/contacts/RawContactModifierTests.java
@@ -44,11 +44,11 @@
 import com.android.contacts.model.RawContactDelta.ValuesDelta;
 import com.android.contacts.model.RawContactDeltaList;
 import com.android.contacts.model.RawContactModifier;
-import com.android.contacts.model.account.AccountType;
-import com.android.contacts.model.account.AccountType.EditType;
-import com.android.contacts.model.account.ExchangeAccountType;
-import com.android.contacts.model.account.GoogleAccountType;
-import com.android.contacts.model.dataitem.DataKind;
+import com.android.contacts.common.model.account.AccountType;
+import com.android.contacts.common.model.account.AccountType.EditType;
+import com.android.contacts.common.model.account.ExchangeAccountType;
+import com.android.contacts.common.model.account.GoogleAccountType;
+import com.android.contacts.common.model.dataitem.DataKind;
 import com.android.contacts.common.test.mocks.ContactsMockContext;
 import com.android.contacts.tests.mocks.MockAccountTypeManager;
 import com.android.contacts.common.test.mocks.MockContentProvider;
diff --git a/tests/src/com/android/contacts/activities/PeopleActivityTest.java b/tests/src/com/android/contacts/activities/PeopleActivityTest.java
index 644c0a5..2fb1040 100644
--- a/tests/src/com/android/contacts/activities/PeopleActivityTest.java
+++ b/tests/src/com/android/contacts/activities/PeopleActivityTest.java
@@ -42,9 +42,9 @@
 import com.android.contacts.interactions.TestLoaderManager;
 import com.android.contacts.list.ContactBrowseListFragment;
 import com.android.contacts.model.AccountTypeManager;
-import com.android.contacts.model.account.AccountType;
-import com.android.contacts.model.account.AccountWithDataSet;
-import com.android.contacts.model.account.BaseAccountType;
+import com.android.contacts.common.model.account.AccountType;
+import com.android.contacts.common.model.account.AccountWithDataSet;
+import com.android.contacts.common.model.account.BaseAccountType;
 import com.android.contacts.test.InjectedServices;
 import com.android.contacts.tests.mocks.MockAccountTypeManager;
 import com.android.contacts.tests.mocks.MockContactPhotoManager;
diff --git a/tests/src/com/android/contacts/editor/ContactEditorUtilsTest.java b/tests/src/com/android/contacts/editor/ContactEditorUtilsTest.java
index 9f2d49b..0d38c95 100644
--- a/tests/src/com/android/contacts/editor/ContactEditorUtilsTest.java
+++ b/tests/src/com/android/contacts/editor/ContactEditorUtilsTest.java
@@ -20,8 +20,8 @@
 import android.test.MoreAsserts;
 import android.test.suitebuilder.annotation.SmallTest;
 
-import com.android.contacts.model.account.AccountType;
-import com.android.contacts.model.account.AccountWithDataSet;
+import com.android.contacts.common.model.account.AccountType;
+import com.android.contacts.common.model.account.AccountWithDataSet;
 import com.android.contacts.tests.mocks.MockAccountTypeManager;
 import com.google.common.collect.Sets;
 
diff --git a/tests/src/com/android/contacts/interactions/ContactDeletionInteractionTest.java b/tests/src/com/android/contacts/interactions/ContactDeletionInteractionTest.java
index bf4e24b..a89ddc9 100644
--- a/tests/src/com/android/contacts/interactions/ContactDeletionInteractionTest.java
+++ b/tests/src/com/android/contacts/interactions/ContactDeletionInteractionTest.java
@@ -32,8 +32,8 @@
 import com.android.contacts.common.test.mocks.MockContentProvider;
 import com.android.contacts.common.test.mocks.MockContentProvider.Query;
 import com.android.contacts.model.AccountTypeManager;
-import com.android.contacts.model.account.AccountType;
-import com.android.contacts.model.account.BaseAccountType;
+import com.android.contacts.common.model.account.AccountType;
+import com.android.contacts.common.model.account.BaseAccountType;
 import com.android.contacts.test.InjectedServices;
 import com.android.contacts.tests.mocks.MockAccountTypeManager;
 
diff --git a/tests/src/com/android/contacts/model/AccountTypeManagerTest.java b/tests/src/com/android/contacts/model/AccountTypeManagerTest.java
index c8db85e..8cc4e12 100644
--- a/tests/src/com/android/contacts/model/AccountTypeManagerTest.java
+++ b/tests/src/com/android/contacts/model/AccountTypeManagerTest.java
@@ -20,9 +20,9 @@
 import android.test.AndroidTestCase;
 import android.test.suitebuilder.annotation.SmallTest;
 
-import com.android.contacts.model.account.AccountType;
-import com.android.contacts.model.account.AccountTypeWithDataSet;
-import com.android.contacts.model.account.AccountWithDataSet;
+import com.android.contacts.common.model.account.AccountType;
+import com.android.contacts.common.model.account.AccountTypeWithDataSet;
+import com.android.contacts.common.model.account.AccountWithDataSet;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 
diff --git a/tests/src/com/android/contacts/model/AccountWithDataSetTest.java b/tests/src/com/android/contacts/model/AccountWithDataSetTest.java
deleted file mode 100644
index 1818c38..0000000
--- a/tests/src/com/android/contacts/model/AccountWithDataSetTest.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * 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 android.os.Bundle;
-import android.test.AndroidTestCase;
-import android.test.MoreAsserts;
-import android.test.suitebuilder.annotation.SmallTest;
-
-import com.android.contacts.model.account.AccountWithDataSet;
-import com.google.common.collect.Lists;
-
-import java.util.List;
-
-/**
- * Test case for {@link AccountWithDataSet}.
- *
- * adb shell am instrument -w -e class com.android.contacts.model.AccountWithDataSetTest \
-       com.android.contacts.tests/android.test.InstrumentationTestRunner
- */
-@SmallTest
-public class AccountWithDataSetTest extends AndroidTestCase {
-    public void testStringifyAndUnstringify() {
-        AccountWithDataSet a1 = new AccountWithDataSet("name1", "typeA", null);
-        AccountWithDataSet a2 = new AccountWithDataSet("name2", "typeB", null);
-        AccountWithDataSet a3 = new AccountWithDataSet("name3", "typeB", "dataset");
-
-        // stringify() & unstringify
-        AccountWithDataSet a1r = AccountWithDataSet.unstringify(a1.stringify());
-        AccountWithDataSet a2r = AccountWithDataSet.unstringify(a2.stringify());
-        AccountWithDataSet a3r = AccountWithDataSet.unstringify(a3.stringify());
-
-        assertEquals(a1, a1r);
-        assertEquals(a2, a2r);
-        assertEquals(a3, a3r);
-
-        MoreAsserts.assertNotEqual(a1, a2r);
-        MoreAsserts.assertNotEqual(a1, a3r);
-
-        MoreAsserts.assertNotEqual(a2, a1r);
-        MoreAsserts.assertNotEqual(a2, a3r);
-
-        MoreAsserts.assertNotEqual(a3, a1r);
-        MoreAsserts.assertNotEqual(a3, a2r);
-    }
-
-    public void testStringifyListAndUnstringify() {
-        AccountWithDataSet a1 = new AccountWithDataSet("name1", "typeA", null);
-        AccountWithDataSet a2 = new AccountWithDataSet("name2", "typeB", null);
-        AccountWithDataSet a3 = new AccountWithDataSet("name3", "typeB", "dataset");
-
-        // Empty list
-        assertEquals(0, stringifyListAndUnstringify().size());
-
-        // 1 element
-        final List<AccountWithDataSet> listA = stringifyListAndUnstringify(a1);
-        assertEquals(1, listA.size());
-        assertEquals(a1, listA.get(0));
-
-        // 2 elements
-        final List<AccountWithDataSet> listB = stringifyListAndUnstringify(a2, a1);
-        assertEquals(2, listB.size());
-        assertEquals(a2, listB.get(0));
-        assertEquals(a1, listB.get(1));
-
-        // 3 elements
-        final List<AccountWithDataSet> listC = stringifyListAndUnstringify(a3, a2, a1);
-        assertEquals(3, listC.size());
-        assertEquals(a3, listC.get(0));
-        assertEquals(a2, listC.get(1));
-        assertEquals(a1, listC.get(2));
-    }
-
-    private static List<AccountWithDataSet> stringifyListAndUnstringify(
-            AccountWithDataSet... accounts) {
-
-        List<AccountWithDataSet> list = Lists.newArrayList(accounts);
-        return AccountWithDataSet.unstringifyList(AccountWithDataSet.stringifyList(list));
-    }
-
-    public void testParcelable() {
-        AccountWithDataSet a1 = new AccountWithDataSet("name1", "typeA", null);
-        AccountWithDataSet a2 = new AccountWithDataSet("name2", "typeB", null);
-        AccountWithDataSet a3 = new AccountWithDataSet("name3", "typeB", "dataset");
-
-        // Parcel them & unpercel.
-        final Bundle b = new Bundle();
-        b.putParcelable("a1", a1);
-        b.putParcelable("a2", a2);
-        b.putParcelable("a3", a3);
-
-        AccountWithDataSet a1r = b.getParcelable("a1");
-        AccountWithDataSet a2r = b.getParcelable("a2");
-        AccountWithDataSet a3r = b.getParcelable("a3");
-
-        assertEquals(a1, a1r);
-        assertEquals(a2, a2r);
-        assertEquals(a3, a3r);
-
-        MoreAsserts.assertNotEqual(a1, a2r);
-        MoreAsserts.assertNotEqual(a1, a3r);
-
-        MoreAsserts.assertNotEqual(a2, a1r);
-        MoreAsserts.assertNotEqual(a2, a3r);
-
-        MoreAsserts.assertNotEqual(a3, a1r);
-        MoreAsserts.assertNotEqual(a3, a2r);
-    }
-}
diff --git a/tests/src/com/android/contacts/model/ContactLoaderTest.java b/tests/src/com/android/contacts/model/ContactLoaderTest.java
index 2876e2a..c87ede8 100644
--- a/tests/src/com/android/contacts/model/ContactLoaderTest.java
+++ b/tests/src/com/android/contacts/model/ContactLoaderTest.java
@@ -30,9 +30,9 @@
 
 import com.android.contacts.common.test.mocks.ContactsMockContext;
 import com.android.contacts.common.test.mocks.MockContentProvider;
-import com.android.contacts.model.account.AccountType;
-import com.android.contacts.model.account.AccountWithDataSet;
-import com.android.contacts.model.account.BaseAccountType;
+import com.android.contacts.common.model.account.AccountType;
+import com.android.contacts.common.model.account.AccountWithDataSet;
+import com.android.contacts.common.model.account.BaseAccountType;
 import com.android.contacts.test.InjectedServices;
 import com.android.contacts.tests.mocks.MockAccountTypeManager;
 
diff --git a/tests/src/com/android/contacts/model/account/AccountTypeTest.java b/tests/src/com/android/contacts/model/account/AccountTypeTest.java
deleted file mode 100644
index 3276011..0000000
--- a/tests/src/com/android/contacts/model/account/AccountTypeTest.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * 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.account;
-
-import android.content.Context;
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
-
-import com.android.contacts.model.account.AccountType;
-import com.android.contacts.tests.R;
-
-/**
- * Test case for {@link AccountType}.
- *
- * adb shell am instrument -w -e class com.android.contacts.model.AccountTypeTest \
-       com.android.contacts.tests/android.test.InstrumentationTestRunner
- */
-@SmallTest
-public class AccountTypeTest extends AndroidTestCase {
-    public void testGetResourceText() {
-        // In this test we use the test package itself as an external package.
-        final String packageName = getTestContext().getPackageName();
-
-        final Context c = getContext();
-        final String DEFAULT = "ABC";
-
-        // Package name null, resId -1, use the default
-        assertEquals(DEFAULT, AccountType.getResourceText(c, null, -1, DEFAULT));
-
-        // Resource ID -1, use the default
-        assertEquals(DEFAULT, AccountType.getResourceText(c, packageName, -1, DEFAULT));
-
-        // Load from an external package.  (here, we use this test package itself)
-        final int externalResID = R.string.test_string;
-        assertEquals(getTestContext().getString(externalResID),
-                AccountType.getResourceText(c, packageName, externalResID, DEFAULT));
-
-        // Load from the contacts package itself.
-        final int internalResId = com.android.contacts.R.string.people;
-        assertEquals(c.getString(internalResId),
-                AccountType.getResourceText(c, null, internalResId, DEFAULT));
-    }
-
-    /**
-     * Verify if {@link AccountType#getInviteContactActionLabel} correctly gets the resource ID
-     * from {@link AccountType#getInviteContactActionResId}
-     */
-    public void testGetInviteContactActionLabel() {
-        final String packageName = getTestContext().getPackageName();
-        final Context c = getContext();
-
-        final int externalResID = R.string.test_string;
-
-        AccountType accountType = new AccountType() {
-            {
-                resourcePackageName = packageName;
-                syncAdapterPackageName = packageName;
-            }
-            @Override protected int getInviteContactActionResId() {
-                return externalResID;
-            }
-
-            @Override public boolean isGroupMembershipEditable() {
-                return false;
-            }
-
-            @Override public boolean areContactsWritable() {
-                return false;
-            }
-        };
-
-        assertEquals(getTestContext().getString(externalResID),
-                accountType.getInviteContactActionLabel(c));
-    }
-
-    public void testDisplayLabelComparator() {
-        final AccountTypeForDisplayLabelTest EMPTY = new AccountTypeForDisplayLabelTest("");
-        final AccountTypeForDisplayLabelTest NULL = new AccountTypeForDisplayLabelTest(null);
-        final AccountTypeForDisplayLabelTest AA = new AccountTypeForDisplayLabelTest("aa");
-        final AccountTypeForDisplayLabelTest BBB = new AccountTypeForDisplayLabelTest("bbb");
-        final AccountTypeForDisplayLabelTest C = new AccountTypeForDisplayLabelTest("c");
-
-        assertTrue(compareDisplayLabel(AA, BBB) < 0);
-        assertTrue(compareDisplayLabel(BBB, C) < 0);
-        assertTrue(compareDisplayLabel(AA, C) < 0);
-        assertTrue(compareDisplayLabel(AA, AA) == 0);
-        assertTrue(compareDisplayLabel(BBB, AA) > 0);
-
-        assertTrue(compareDisplayLabel(EMPTY, AA) < 0);
-        assertTrue(compareDisplayLabel(EMPTY, NULL) == 0);
-    }
-
-    private int compareDisplayLabel(AccountType lhs, AccountType rhs) {
-        return new AccountType.DisplayLabelComparator(getContext()).compare(lhs, rhs);
-    }
-
-    private class AccountTypeForDisplayLabelTest extends AccountType {
-        private final String mDisplayLabel;
-
-        public AccountTypeForDisplayLabelTest(String displayLabel) {
-            mDisplayLabel = displayLabel;
-        }
-
-        @Override
-        public CharSequence getDisplayLabel(Context context) {
-            return mDisplayLabel;
-        }
-
-        @Override
-        public boolean isGroupMembershipEditable() {
-            return false;
-        }
-
-        @Override
-        public boolean areContactsWritable() {
-            return false;
-        }
-    }
-}
diff --git a/tests/src/com/android/contacts/model/account/ExternalAccountTypeTest.java b/tests/src/com/android/contacts/model/account/ExternalAccountTypeTest.java
deleted file mode 100644
index 6eb3bd7..0000000
--- a/tests/src/com/android/contacts/model/account/ExternalAccountTypeTest.java
+++ /dev/null
@@ -1,247 +0,0 @@
-/*
- * 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.account;
-
-import android.content.Context;
-import android.provider.ContactsContract.CommonDataKinds.Email;
-import android.provider.ContactsContract.CommonDataKinds.Event;
-import android.provider.ContactsContract.CommonDataKinds.Im;
-import android.provider.ContactsContract.CommonDataKinds.Note;
-import android.provider.ContactsContract.CommonDataKinds.Organization;
-import android.provider.ContactsContract.CommonDataKinds.Photo;
-import android.provider.ContactsContract.CommonDataKinds.Relation;
-import android.provider.ContactsContract.CommonDataKinds.SipAddress;
-import android.provider.ContactsContract.CommonDataKinds.StructuredName;
-import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
-import android.provider.ContactsContract.CommonDataKinds.Website;
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
-
-import com.android.contacts.model.dataitem.DataKind;
-import com.android.contacts.tests.R;
-import com.google.common.base.Objects;
-
-import java.util.List;
-
-/**
- * Test case for {@link ExternalAccountType}.
- *
- * adb shell am instrument -w -e class com.android.contacts.model.ExternalAccountTypeTest \
-       com.android.contacts.tests/android.test.InstrumentationTestRunner
- */
-@SmallTest
-public class ExternalAccountTypeTest extends AndroidTestCase {
-    public void testResolveExternalResId() {
-        final Context c = getContext();
-        // In this test we use the test package itself as an external package.
-        final String packageName = getTestContext().getPackageName();
-
-        // Resource name empty.
-        assertEquals(-1, ExternalAccountType.resolveExternalResId(c, null, packageName, ""));
-        assertEquals(-1, ExternalAccountType.resolveExternalResId(c, "", packageName, ""));
-
-        // Name doesn't begin with '@'
-        assertEquals(-1, ExternalAccountType.resolveExternalResId(c, "x", packageName, ""));
-
-        // Invalid resource name
-        assertEquals(-1, ExternalAccountType.resolveExternalResId(c, "@", packageName, ""));
-        assertEquals(-1, ExternalAccountType.resolveExternalResId(c, "@a", packageName, ""));
-        assertEquals(-1, ExternalAccountType.resolveExternalResId(c, "@a/b", packageName, ""));
-
-        // Valid resource name
-        assertEquals(R.string.test_string, ExternalAccountType.resolveExternalResId(c,
-                "@string/test_string", packageName, ""));
-    }
-
-    /**
-     * Initialize with an invalid package name and see if type type will *not* be initialized.
-     */
-    public void testNoPackage() {
-        final ExternalAccountType type = new ExternalAccountType(getContext(),
-                "!!!no such package name!!!", false);
-        assertFalse(type.isInitialized());
-    }
-
-    /**
-     * Initialize with the name of an existing package, which has no contacts.xml metadata.
-     */
-    public void testNoMetadata() {
-        // Use the main application package, which does exist, but has no contacts.xml in it.
-        String packageName = getContext().getPackageName();
-        final ExternalAccountType type = new ExternalAccountType(getContext(),
-                packageName, false);
-        assertTrue(type.isInitialized());
-    }
-
-    /**
-     * Initialize with the test package itself and see if EditSchema is correctly parsed.
-     */
-    public void testEditSchema() {
-        final ExternalAccountType type = new ExternalAccountType(getContext(),
-                getTestContext().getPackageName(), false);
-
-        assertTrue(type.isInitialized());
-
-        // Let's just check if the DataKinds are registered.
-        assertNotNull(type.getKindForMimetype(StructuredName.CONTENT_ITEM_TYPE));
-        assertNotNull(type.getKindForMimetype(DataKind.PSEUDO_MIME_TYPE_DISPLAY_NAME));
-        assertNotNull(type.getKindForMimetype(DataKind.PSEUDO_MIME_TYPE_PHONETIC_NAME));
-        assertNotNull(type.getKindForMimetype(Email.CONTENT_ITEM_TYPE));
-        assertNotNull(type.getKindForMimetype(StructuredPostal.CONTENT_ITEM_TYPE));
-        assertNotNull(type.getKindForMimetype(Im.CONTENT_ITEM_TYPE));
-        assertNotNull(type.getKindForMimetype(Organization.CONTENT_ITEM_TYPE));
-        assertNotNull(type.getKindForMimetype(Photo.CONTENT_ITEM_TYPE));
-        assertNotNull(type.getKindForMimetype(Note.CONTENT_ITEM_TYPE));
-        assertNotNull(type.getKindForMimetype(Website.CONTENT_ITEM_TYPE));
-        assertNotNull(type.getKindForMimetype(SipAddress.CONTENT_ITEM_TYPE));
-        assertNotNull(type.getKindForMimetype(Event.CONTENT_ITEM_TYPE));
-        assertNotNull(type.getKindForMimetype(Relation.CONTENT_ITEM_TYPE));
-    }
-
-    /**
-     * Initialize with "contacts_fallback.xml" and compare the DataKinds to those of
-     * {@link FallbackAccountType}.
-     */
-    public void testEditSchema_fallback() {
-        final ExternalAccountType type = new ExternalAccountType(getContext(),
-                getTestContext().getPackageName(), false,
-                getTestContext().getResources().getXml(R.xml.contacts_fallback)
-                );
-
-        assertTrue(type.isInitialized());
-
-        // Create a fallback type with the same resource package name, and compare all the data
-        // kinds to its.
-        final AccountType reference = FallbackAccountType.createWithPackageNameForTest(
-                getContext(), type.resourcePackageName);
-
-        assertsDataKindEquals(reference.getSortedDataKinds(), type.getSortedDataKinds());
-    }
-
-    public void testEditSchema_mustHaveChecks() {
-        checkEditSchema_mustHaveChecks(R.xml.missing_contacts_base, true);
-        checkEditSchema_mustHaveChecks(R.xml.missing_contacts_photo, false);
-        checkEditSchema_mustHaveChecks(R.xml.missing_contacts_name, false);
-        checkEditSchema_mustHaveChecks(R.xml.missing_contacts_name_attr1, false);
-        checkEditSchema_mustHaveChecks(R.xml.missing_contacts_name_attr2, false);
-        checkEditSchema_mustHaveChecks(R.xml.missing_contacts_name_attr3, false);
-        checkEditSchema_mustHaveChecks(R.xml.missing_contacts_name_attr4, false);
-        checkEditSchema_mustHaveChecks(R.xml.missing_contacts_name_attr5, false);
-        checkEditSchema_mustHaveChecks(R.xml.missing_contacts_name_attr6, false);
-        checkEditSchema_mustHaveChecks(R.xml.missing_contacts_name_attr7, false);
-    }
-
-    private void checkEditSchema_mustHaveChecks(int xmlResId, boolean expectInitialized) {
-        final ExternalAccountType type = new ExternalAccountType(getContext(),
-                getTestContext().getPackageName(), false,
-                getTestContext().getResources().getXml(xmlResId)
-                );
-
-        assertEquals(expectInitialized, type.isInitialized());
-    }
-
-    /**
-     * Initialize with "contacts_readonly.xml" and see if all data kinds are correctly registered.
-     */
-    public void testReadOnlyDefinition() {
-        final ExternalAccountType type = new ExternalAccountType(getContext(),
-                getTestContext().getPackageName(), false,
-                getTestContext().getResources().getXml(R.xml.contacts_readonly)
-                );
-        assertTrue(type.isInitialized());
-
-        // Shouldn't have a "null" mimetype.
-        assertTrue(type.getKindForMimetype(null) == null);
-
-        // 3 kinds are defined in XML and 4 are added by default.
-        assertEquals(4 + 3, type.getSortedDataKinds().size());
-
-        // Check for the default kinds.
-        assertNotNull(type.getKindForMimetype(StructuredName.CONTENT_ITEM_TYPE));
-        assertNotNull(type.getKindForMimetype(DataKind.PSEUDO_MIME_TYPE_DISPLAY_NAME));
-        assertNotNull(type.getKindForMimetype(DataKind.PSEUDO_MIME_TYPE_PHONETIC_NAME));
-        assertNotNull(type.getKindForMimetype(Photo.CONTENT_ITEM_TYPE));
-
-        // Check for type specific kinds.
-        DataKind kind = type.getKindForMimetype("vnd.android.cursor.item/a.b.c");
-        assertNotNull(kind);
-        // No check for icon -- we actually just ignore it.
-        assertEquals("data1", ((BaseAccountType.SimpleInflater) kind.actionHeader)
-                .getColumnNameForTest());
-        assertEquals("data2", ((BaseAccountType.SimpleInflater) kind.actionBody)
-                .getColumnNameForTest());
-        assertEquals(true, kind.actionBodySocial);
-
-        kind = type.getKindForMimetype("vnd.android.cursor.item/d.e.f");
-        assertNotNull(kind);
-        assertEquals("data3", ((BaseAccountType.SimpleInflater) kind.actionHeader)
-                .getColumnNameForTest());
-        assertEquals("data4", ((BaseAccountType.SimpleInflater) kind.actionBody)
-                .getColumnNameForTest());
-        assertEquals(false, kind.actionBodySocial);
-
-        kind = type.getKindForMimetype("vnd.android.cursor.item/xyz");
-        assertNotNull(kind);
-        assertEquals("data5", ((BaseAccountType.SimpleInflater) kind.actionHeader)
-                .getColumnNameForTest());
-        assertEquals("data6", ((BaseAccountType.SimpleInflater) kind.actionBody)
-                .getColumnNameForTest());
-        assertEquals(true, kind.actionBodySocial);
-    }
-
-    private static void assertsDataKindEquals(List<DataKind> expectedKinds,
-            List<DataKind> actualKinds) {
-        final int count = Math.max(actualKinds.size(), expectedKinds.size());
-        for (int i = 0; i < count; i++) {
-            String actual =  actualKinds.size() > i ? actualKinds.get(i).toString() : "(n/a)";
-            String expected =  expectedKinds.size() > i ? expectedKinds.get(i).toString() : "(n/a)";
-
-            // Because assertEquals()'s output is not very friendly when comparing two similar
-            // strings, we manually do the check.
-            if (!Objects.equal(actual, expected)) {
-                final int commonPrefixEnd = findCommonPrefixEnd(actual, expected);
-                fail("Kind #" + i
-                        + "\n[Actual]\n" + insertMarkerAt(actual, commonPrefixEnd)
-                        + "\n[Expected]\n" + insertMarkerAt(expected, commonPrefixEnd));
-            }
-        }
-    }
-
-    private static int findCommonPrefixEnd(String s1, String s2) {
-        int i = 0;
-        for (;;) {
-            final boolean s1End = (s1.length() <= i);
-            final boolean s2End = (s2.length() <= i);
-            if (s1End || s2End) {
-                return i;
-            }
-            if (s1.charAt(i) != s2.charAt(i)) {
-                return i;
-            }
-            i++;
-        }
-    }
-
-    private static String insertMarkerAt(String s, int position) {
-        final String MARKER = "***";
-        if (position > s.length()) {
-            return s + MARKER;
-        } else {
-            return new StringBuilder(s).insert(position, MARKER).toString();
-        }
-    }
-}
diff --git a/tests/src/com/android/contacts/tests/mocks/MockAccountTypeManager.java b/tests/src/com/android/contacts/tests/mocks/MockAccountTypeManager.java
index ce16743..31eff52 100644
--- a/tests/src/com/android/contacts/tests/mocks/MockAccountTypeManager.java
+++ b/tests/src/com/android/contacts/tests/mocks/MockAccountTypeManager.java
@@ -16,9 +16,9 @@
 package com.android.contacts.tests.mocks;
 
 import com.android.contacts.model.AccountTypeManager;
-import com.android.contacts.model.account.AccountType;
-import com.android.contacts.model.account.AccountTypeWithDataSet;
-import com.android.contacts.model.account.AccountWithDataSet;
+import com.android.contacts.common.model.account.AccountType;
+import com.android.contacts.common.model.account.AccountTypeWithDataSet;
+import com.android.contacts.common.model.account.AccountWithDataSet;
 import com.google.common.base.Objects;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
diff --git a/tests/src/com/android/contacts/tests/streamitems/StreamItemPopulatorActivity.java b/tests/src/com/android/contacts/tests/streamitems/StreamItemPopulatorActivity.java
index 20229d2..9132e40 100644
--- a/tests/src/com/android/contacts/tests/streamitems/StreamItemPopulatorActivity.java
+++ b/tests/src/com/android/contacts/tests/streamitems/StreamItemPopulatorActivity.java
@@ -32,7 +32,7 @@
 import android.widget.Button;
 import android.widget.Toast;
 
-import com.android.contacts.model.account.GoogleAccountType;
+import com.android.contacts.common.model.account.GoogleAccountType;
 import com.android.contacts.tests.R;
 import com.google.common.collect.Lists;
 
diff --git a/tests/src/com/android/contacts/tests/testauth/TestAuthenticationService.java b/tests/src/com/android/contacts/tests/testauth/TestAuthenticationService.java
deleted file mode 100644
index 84f3f0f..0000000
--- a/tests/src/com/android/contacts/tests/testauth/TestAuthenticationService.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * 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.tests.testauth;
-
-import android.app.Service;
-import android.content.Intent;
-import android.os.IBinder;
-import android.util.Log;
-
-public abstract class TestAuthenticationService extends Service {
-
-    private TestAuthenticator mAuthenticator;
-
-    @Override
-    public void onCreate() {
-        Log.v(TestauthConstants.LOG_TAG, this + " Service started.");
-        mAuthenticator = new TestAuthenticator(this);
-    }
-
-    @Override
-    public void onDestroy() {
-        Log.v(TestauthConstants.LOG_TAG, this + " Service stopped.");
-    }
-
-    @Override
-    public IBinder onBind(Intent intent) {
-        Log.v(TestauthConstants.LOG_TAG, this + " getBinder() intent=" + intent);
-        return mAuthenticator.getIBinder();
-    }
-
-    public static class Basic extends TestAuthenticationService {
-    }
-}
diff --git a/tests/src/com/android/contacts/tests/testauth/TestAuthenticator.java b/tests/src/com/android/contacts/tests/testauth/TestAuthenticator.java
deleted file mode 100644
index 97e2e4d..0000000
--- a/tests/src/com/android/contacts/tests/testauth/TestAuthenticator.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * 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.tests.testauth;
-
-import android.accounts.AbstractAccountAuthenticator;
-import android.accounts.Account;
-import android.accounts.AccountAuthenticatorResponse;
-import android.accounts.AccountManager;
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.os.Bundle;
-import android.preference.PreferenceManager;
-import android.util.Log;
-
-/**
- * Simple authenticator.  It has no "login" dialogs/activities.  When you add a new account, it'll
- * just create a new account with a unique name.
- */
-class TestAuthenticator extends AbstractAccountAuthenticator {
-    private static final String PASSWORD = "xxx"; // any string will do.
-
-    // To remember the last user-ID.
-    private static final String PREF_KEY_LAST_USER_ID = "TestAuthenticator.PREF_KEY_LAST_USER_ID";
-
-    private final Context mContext;
-
-    public TestAuthenticator(Context context) {
-        super(context);
-        mContext = context.getApplicationContext();
-    }
-
-    /**
-     * @return a new, unique username.
-     */
-    private String newUniqueUserName() {
-        final SharedPreferences prefs =
-                PreferenceManager.getDefaultSharedPreferences(mContext);
-        final int nextId = prefs.getInt(PREF_KEY_LAST_USER_ID, 0) + 1;
-        prefs.edit().putInt(PREF_KEY_LAST_USER_ID, nextId).apply();
-
-        return "User-" + nextId;
-    }
-
-    /**
-     * Create a new account with the name generated by {@link #newUniqueUserName()}.
-     */
-    @Override
-    public Bundle addAccount(AccountAuthenticatorResponse response, String accountType,
-            String authTokenType, String[] requiredFeatures, Bundle options) {
-        Log.v(TestauthConstants.LOG_TAG, "addAccount() type=" + accountType);
-        final Bundle bundle = new Bundle();
-
-        final Account account = new Account(newUniqueUserName(), accountType);
-
-        // Create an account.
-        AccountManager.get(mContext).addAccountExplicitly(account, PASSWORD, null);
-
-        // And return it.
-        bundle.putString(AccountManager.KEY_ACCOUNT_NAME, account.name);
-        bundle.putString(AccountManager.KEY_ACCOUNT_TYPE, account.type);
-        return bundle;
-    }
-
-    /**
-     * Just return the user name as the authtoken.
-     */
-    @Override
-    public Bundle getAuthToken(AccountAuthenticatorResponse response, Account account,
-            String authTokenType, Bundle loginOptions) {
-        Log.v(TestauthConstants.LOG_TAG, "getAuthToken() account=" + account);
-        final Bundle bundle = new Bundle();
-        bundle.putString(AccountManager.KEY_ACCOUNT_NAME, account.name);
-        bundle.putString(AccountManager.KEY_ACCOUNT_TYPE, account.type);
-        bundle.putString(AccountManager.KEY_AUTHTOKEN, account.name);
-
-        return bundle;
-    }
-
-    @Override
-    public Bundle confirmCredentials(
-            AccountAuthenticatorResponse response, Account account, Bundle options) {
-        Log.v(TestauthConstants.LOG_TAG, "confirmCredentials()");
-        return null;
-    }
-
-    @Override
-    public Bundle editProperties(AccountAuthenticatorResponse response, String accountType) {
-        Log.v(TestauthConstants.LOG_TAG, "editProperties()");
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public String getAuthTokenLabel(String authTokenType) {
-        // null means we don't support multiple authToken types
-        Log.v(TestauthConstants.LOG_TAG, "getAuthTokenLabel()");
-        return null;
-    }
-
-    @Override
-    public Bundle hasFeatures(
-            AccountAuthenticatorResponse response, Account account, String[] features) {
-        // This call is used to query whether the Authenticator supports
-        // specific features. We don't expect to get called, so we always
-        // return false (no) for any queries.
-        Log.v(TestauthConstants.LOG_TAG, "hasFeatures()");
-        final Bundle result = new Bundle();
-        result.putBoolean(AccountManager.KEY_BOOLEAN_RESULT, false);
-        return result;
-    }
-
-    @Override
-    public Bundle updateCredentials(AccountAuthenticatorResponse response, Account account,
-            String authTokenType, Bundle loginOptions) {
-        Log.v(TestauthConstants.LOG_TAG, "updateCredentials()");
-        return null;
-    }
-}
diff --git a/tests/src/com/android/contacts/tests/testauth/TestSyncAdapter.java b/tests/src/com/android/contacts/tests/testauth/TestSyncAdapter.java
deleted file mode 100644
index 9e6fbf8..0000000
--- a/tests/src/com/android/contacts/tests/testauth/TestSyncAdapter.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * 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.tests.testauth;
-
-import android.accounts.Account;
-import android.accounts.AccountManager;
-import android.content.AbstractThreadedSyncAdapter;
-import android.content.ContentProviderClient;
-import android.content.ContentResolver;
-import android.content.ContentValues;
-import android.content.Context;
-import android.content.SyncResult;
-import android.os.Bundle;
-import android.provider.ContactsContract.RawContacts;
-import android.util.Log;
-
-/**
- * Simple (minimal) sync adapter.
- *
- */
-public class TestSyncAdapter extends AbstractThreadedSyncAdapter {
-    private final AccountManager mAccountManager;
-
-    private final Context mContext;
-
-    public TestSyncAdapter(Context context, boolean autoInitialize) {
-        super(context, autoInitialize);
-        mContext = context.getApplicationContext();
-        mAccountManager = AccountManager.get(mContext);
-    }
-
-    /**
-     * Doesn't actually sync, but sweep up all existing local-only contacts.
-     */
-    @Override
-    public void onPerformSync(Account account, Bundle extras, String authority,
-            ContentProviderClient provider, SyncResult syncResult) {
-        Log.v(TestauthConstants.LOG_TAG, "TestSyncAdapter.onPerformSync() account=" + account);
-
-        // First, claim all local-only contacts, if any.
-        ContentResolver cr = mContext.getContentResolver();
-        ContentValues values = new ContentValues();
-        values.put(RawContacts.ACCOUNT_NAME, account.name);
-        values.put(RawContacts.ACCOUNT_TYPE, account.type);
-        final int count = cr.update(RawContacts.CONTENT_URI, values,
-                RawContacts.ACCOUNT_NAME + " IS NULL AND " + RawContacts.ACCOUNT_TYPE + " IS NULL",
-                null);
-        if (count > 0) {
-            Log.v(TestauthConstants.LOG_TAG, "Claimed " + count + " local raw contacts");
-        }
-
-        // TODO: Clear isDirty flag
-        // TODO: Remove isDeleted raw contacts
-    }
-}
diff --git a/tests/src/com/android/contacts/tests/testauth/TestSyncService.java b/tests/src/com/android/contacts/tests/testauth/TestSyncService.java
deleted file mode 100644
index 9928777..0000000
--- a/tests/src/com/android/contacts/tests/testauth/TestSyncService.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * 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.tests.testauth;
-
-import android.app.Service;
-import android.content.Intent;
-import android.os.IBinder;
-
-public abstract class TestSyncService extends Service {
-
-    private static TestSyncAdapter sSyncAdapter;
-
-    @Override
-    public void onCreate() {
-        if (sSyncAdapter == null) {
-            sSyncAdapter = new TestSyncAdapter(getApplicationContext(), true);
-        }
-    }
-
-    @Override
-    public IBinder onBind(Intent intent) {
-        return sSyncAdapter.getSyncAdapterBinder();
-    }
-
-    public static class Basic extends TestSyncService {
-    }
-}
diff --git a/tests/src/com/android/contacts/tests/testauth/TestauthConstants.java b/tests/src/com/android/contacts/tests/testauth/TestauthConstants.java
deleted file mode 100644
index 717ed35..0000000
--- a/tests/src/com/android/contacts/tests/testauth/TestauthConstants.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * 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.tests.testauth;
-
-class TestauthConstants {
-    public static final String LOG_TAG = "Testauth";
-}
