diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 24dfe86..29fcedc 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -397,7 +397,7 @@
             </intent-filter>
         </activity>
 
-        <!-- Edit and insert details for a contact -->
+        <!-- Edit an existing contact -->
         <activity
             android:name=".activities.ContactEditorActivity"
             android:theme="@style/TallTitleBarTheme"
@@ -412,7 +412,7 @@
             </intent-filter>
         </activity>
 
-        <!-- Insert details for a contact (for now this is seperate) -->
+        <!-- Create contact (for now this is seperate) -->
         <activity
             android:name=".ui.EditContactActivity"
             android:theme="@style/TallTitleBarTheme">
@@ -426,25 +426,6 @@
             </intent-filter>
         </activity>
 
-        <!-- Activity to edit a single field of a contact, like an E-Mail address or phone -->
-        <activity
-            android:name=".activities.ContactFieldEditorActivity"
-            android:windowSoftInputMode="stateAlwaysVisible|adjustResize"
-            android:theme="@android:style/Theme.Dialog">
-
-            <intent-filter>
-                <action android:name="android.intent.action.EDIT" />
-                <category android:name="android.intent.category.DEFAULT" />
-                <data android:mimeType="vnd.android.cursor.item/name" android:host="com.android.contacts" />
-            </intent-filter>
-            <intent-filter>
-                <action android:name="android.intent.action.EDIT" />
-                <action android:name="android.intent.action.INSERT" />
-                <category android:name="android.intent.category.DEFAULT" />
-                <data android:mimeType="vnd.android.cursor.item/email_v2" android:host="com.android.contacts" />
-            </intent-filter>
-        </activity>
-
         <!-- Stub service used to keep our process alive long enough for
              background threads to finish their operations. -->
         <service
diff --git a/res/layout/list_edit_item_organization.xml b/res/layout/list_edit_item_organization.xml
new file mode 100644
index 0000000..588a2a2
--- /dev/null
+++ b/res/layout/list_edit_item_organization.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright 2010, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+
+<com.android.contacts.views.editor.view.OrganizationView
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:minHeight="?android:attr/listPreferredItemHeight"
+        android:orientation="horizontal"
+        android:paddingLeft="9dip"
+        android:gravity="center_vertical"
+        android:background="@drawable/edit_rawcontact_bg">
+    <LinearLayout
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:orientation="vertical">
+        <TextView android:id="@+id/caption"
+                android:layout_width="60dip"
+                android:layout_height="wrap_content" />
+        <Button android:id="@+id/type"
+                android:layout_width="100dip"
+                android:layout_height="wrap_content" />
+    </LinearLayout>
+    <LinearLayout
+            android:layout_width="0px"
+            android:layout_height="wrap_content"
+            android:layout_weight="1"
+            android:orientation="vertical">
+        <EditText android:id="@+id/company_field"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content" />
+        <EditText android:id="@+id/title_field"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content" />
+    </LinearLayout>
+</com.android.contacts.views.editor.view.OrganizationView>
diff --git a/res/layout/list_edit_item_simple_or_structured.xml b/res/layout/list_edit_item_simple_or_structured.xml
new file mode 100644
index 0000000..240f26d
--- /dev/null
+++ b/res/layout/list_edit_item_simple_or_structured.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright 2010, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+
+<com.android.contacts.views.editor.view.SimpleOrStructuredView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:minHeight="?android:attr/listPreferredItemHeight"
+    android:orientation="horizontal"
+    android:paddingLeft="9dip"
+    android:gravity="center_vertical"
+    android:background="@drawable/edit_rawcontact_bg"
+>
+
+    <TextView android:id="@+id/caption"
+        android:layout_width="60dip"
+        android:layout_height="wrap_content"
+    />
+
+    <EditText android:id="@+id/field"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_weight="1"
+    />
+
+    <Button android:id="@+id/structuredEditorButton"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="@string/edit_structured_editor_button"
+    />
+
+</com.android.contacts.views.editor.view.SimpleOrStructuredView>
diff --git a/res/layout/list_edit_item_single_field.xml b/res/layout/list_edit_item_single_field.xml
new file mode 100644
index 0000000..4ffc0d7
--- /dev/null
+++ b/res/layout/list_edit_item_single_field.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright 2010, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+
+<com.android.contacts.views.editor.view.SingleFieldView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:minHeight="?android:attr/listPreferredItemHeight"
+    android:orientation="horizontal"
+    android:paddingLeft="9dip"
+    android:gravity="center_vertical"
+    android:background="@drawable/edit_rawcontact_bg"
+>
+
+    <TextView android:id="@+id/caption"
+        android:layout_width="60dip"
+        android:layout_height="wrap_content"
+    />
+
+    <EditText android:id="@+id/field"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_weight="1"
+    />
+
+</com.android.contacts.views.editor.view.SingleFieldView>
diff --git a/res/layout/list_edit_item_text_icons.xml b/res/layout/list_edit_item_text_icons.xml
deleted file mode 100644
index 03868b7..0000000
--- a/res/layout/list_edit_item_text_icons.xml
+++ /dev/null
@@ -1,99 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
- * Copyright 2009, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
--->
-
-<com.android.contacts.views.editor.view.DataView
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:minHeight="?android:attr/listPreferredItemHeight"
-    android:orientation="horizontal"
-    android:paddingLeft="9dip"
-    android:gravity="center_vertical"
-    android:background="@drawable/edit_rawcontact_bg"
->
-
-    <LinearLayout
-        android:layout_width="0dip"
-        android:layout_height="wrap_content"
-        android:layout_weight="1"
-        android:layout_marginLeft="5dip"
-        android:orientation="vertical"
-        android:paddingTop="5dip"
-        android:paddingBottom="7dip"
-        android:gravity="center_vertical"
-    >
-
-        <TextView android:id="@android:id/text1"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:textAppearance="?android:attr/textAppearanceLarge"
-        />
-
-        <LinearLayout
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:orientation="horizontal"
-        >
-            <TextView android:id="@android:id/text2"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_gravity="center_vertical"
-                android:textAppearance="?android:attr/textAppearanceSmall"
-            />
-
-            <ImageView android:id="@+id/primary_icon"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_gravity="center_vertical"
-                android:paddingLeft="3dip"
-                android:src="@drawable/ic_default_number"
-            />
-        </LinearLayout>
-
-    </LinearLayout>
-
-    <ImageView android:id="@+id/action_icon"
-        android:layout_width="30dip"
-        android:layout_height="30dip"
-        android:layout_marginLeft="14dip"
-        android:layout_marginRight="14dip"
-        android:gravity="center"
-        android:scaleType="centerInside"
-    />
-
-    <View android:id="@+id/divider"
-        android:layout_width="1px"
-        android:layout_height="match_parent"
-        android:layout_marginTop="5dip"
-        android:layout_marginBottom="5dip"
-        android:background="@drawable/divider_vertical_dark"
-    />
-
-    <ImageView android:id="@+id/secondary_action_button"
-        android:layout_width="wrap_content"
-        android:layout_height="match_parent"
-        android:layout_centerVertical="true"
-        android:paddingLeft="14dip"
-        android:paddingRight="14dip"
-        android:gravity="center"
-        android:scaleType="center"
-        android:background="@android:drawable/list_selector_background"
-    />
-
-</com.android.contacts.views.editor.view.DataView>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 1b07bff..8969228 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1237,4 +1237,7 @@
 
     <!-- Shown in a Toast to indicate an error while trying to save the Data -->
     <string name="edit_error_saving">Error saving</string>
+
+    <!-- Text in the editor to show the structured editor -->
+    <string name="edit_structured_editor_button">...</string>
 </resources>
diff --git a/src/com/android/contacts/activities/ContactFieldEditorActivity.java b/src/com/android/contacts/activities/ContactFieldEditorActivity.java
deleted file mode 100644
index 6f958f6..0000000
--- a/src/com/android/contacts/activities/ContactFieldEditorActivity.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright (C) 2010 Google Inc.
- *
- * 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.activities;
-
-import com.android.contacts.views.editor.ContactFieldEditorBaseFragment;
-import com.android.contacts.views.editor.ContactFieldEditorEmailFragment;
-
-import android.app.Activity;
-import android.content.Intent;
-import android.net.Uri;
-import android.os.Bundle;
-
-public class ContactFieldEditorActivity extends Activity {
-    public final static String BUNDLE_RAW_CONTACT_URI = "RawContactUri";
-
-    private ContactFieldEditorBaseFragment mFragment;
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        mFragment = new ContactFieldEditorEmailFragment();
-        mFragment.setListener(mFragmentListener);
-
-        openFragmentTransaction()
-            .add(android.R.id.content, mFragment)
-            .commit();
-
-        final Intent intent = getIntent();
-        final Uri rawContactUri = Uri.parse(intent.getStringExtra(BUNDLE_RAW_CONTACT_URI));
-        final boolean isInsert;
-        if (Intent.ACTION_EDIT.equals(intent.getAction())) {
-            isInsert = false;
-        } else if (Intent.ACTION_INSERT.equals(intent.getAction())) {
-            isInsert = true;
-        } else throw new IllegalArgumentException("Action is neither EDIT nor INSERT");
-
-        if (isInsert) {
-            mFragment.setupInsert(intent.getType(), rawContactUri);
-        } else {
-            mFragment.setupEdit(rawContactUri, intent.getData());
-        }
-    }
-
-    private ContactFieldEditorBaseFragment.Listener mFragmentListener =
-            new ContactFieldEditorBaseFragment.Listener() {
-        public void onCancel() {
-            setResult(RESULT_CANCELED);
-            finish();
-        }
-
-        public void onContactNotFound() {
-            setResult(RESULT_CANCELED);
-            finish();
-        }
-
-        public void onDataNotFound() {
-            setResult(RESULT_CANCELED);
-            finish();
-        }
-
-        public void onSaved() {
-            setResult(RESULT_OK);
-            finish();
-        }
-    };
-}
diff --git a/src/com/android/contacts/activities/TwoPaneActivity.java b/src/com/android/contacts/activities/TwoPaneActivity.java
index 63283ad..3f8a139 100644
--- a/src/com/android/contacts/activities/TwoPaneActivity.java
+++ b/src/com/android/contacts/activities/TwoPaneActivity.java
@@ -29,9 +29,7 @@
 import android.net.Uri;
 import android.os.Bundle;
 import android.text.TextUtils;
-import android.widget.LinearLayout;
 import android.widget.Toast;
-import android.widget.LinearLayout.LayoutParams;
 
 public class TwoPaneActivity extends Activity {
     private final static String TAG = "TwoPaneActivity";
diff --git a/src/com/android/contacts/views/editor/ContactEditorFragment.java b/src/com/android/contacts/views/editor/ContactEditorFragment.java
index 58f56ff..4f65f6d 100644
--- a/src/com/android/contacts/views/editor/ContactEditorFragment.java
+++ b/src/com/android/contacts/views/editor/ContactEditorFragment.java
@@ -18,19 +18,24 @@
 
 import com.android.contacts.ContactOptionsActivity;
 import com.android.contacts.R;
-import com.android.contacts.activities.ContactFieldEditorActivity;
 import com.android.contacts.model.ContactsSource;
 import com.android.contacts.model.Sources;
 import com.android.contacts.model.ContactsSource.DataKind;
 import com.android.contacts.ui.EditContactActivity;
-import com.android.contacts.util.DataStatus;
 import com.android.contacts.views.ContactLoader;
 import com.android.contacts.views.editor.view.ViewTypes;
 import com.android.contacts.views.editor.viewModel.BaseViewModel;
-import com.android.contacts.views.editor.viewModel.DataViewModel;
 import com.android.contacts.views.editor.viewModel.EmailViewModel;
 import com.android.contacts.views.editor.viewModel.FooterViewModel;
+import com.android.contacts.views.editor.viewModel.ImViewModel;
+import com.android.contacts.views.editor.viewModel.NicknameViewModel;
+import com.android.contacts.views.editor.viewModel.NoteViewModel;
+import com.android.contacts.views.editor.viewModel.OrganizationViewModel;
 import com.android.contacts.views.editor.viewModel.PhoneViewModel;
+import com.android.contacts.views.editor.viewModel.PhotoViewModel;
+import com.android.contacts.views.editor.viewModel.StructuredNameViewModel;
+import com.android.contacts.views.editor.viewModel.StructuredPostalViewModel;
+import com.android.contacts.views.editor.viewModel.WebsiteViewModel;
 
 import android.app.Activity;
 import android.app.AlertDialog;
@@ -61,7 +66,6 @@
 import android.provider.ContactsContract.CommonDataKinds.StructuredName;
 import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
 import android.provider.ContactsContract.CommonDataKinds.Website;
-import android.text.TextUtils;
 import android.util.Log;
 import android.view.ContextMenu;
 import android.view.LayoutInflater;
@@ -265,6 +269,24 @@
                         ContactsSource.LEVEL_MIMETYPES);
                 if (kind == null) continue;
 
+                // TODO: This surely can be written more nicely. Think about a factory once
+                // all editors are done
+                if (StructuredName.CONTENT_ITEM_TYPE.equals(mimeType)) {
+                    final StructuredNameViewModel itemEditor =
+                            StructuredNameViewModel.createForExisting(mContext, rawContact, dataId,
+                            entryValues, kind.titleRes);
+                    rawContact.getFields().add(itemEditor);
+                    continue;
+                }
+
+                if (StructuredPostal.CONTENT_ITEM_TYPE.equals(mimeType)) {
+                    final StructuredPostalViewModel itemEditor =
+                            StructuredPostalViewModel.createForExisting(mContext, rawContact,
+                            dataId, entryValues, kind.titleRes);
+                    rawContact.getFields().add(itemEditor);
+                    continue;
+                }
+
                 if (Phone.CONTENT_ITEM_TYPE.equals(mimeType)) {
                     final PhoneViewModel itemEditor = PhoneViewModel.createForExisting(mContext,
                             rawContact, dataId, entryValues, kind.titleRes);
@@ -279,70 +301,48 @@
                     continue;
                 }
 
+                if (Im.CONTENT_ITEM_TYPE.equals(mimeType)) {
+                    final ImViewModel itemEditor = ImViewModel.createForExisting(mContext,
+                            rawContact, dataId, entryValues, kind.titleRes);
+                    rawContact.getFields().add(itemEditor);
+                    continue;
+                }
 
-                final DataViewModel entry = new DataViewModel(mContext, mimeType, kind,
-                        rawContact, dataId, entryValues);
+                if (Nickname.CONTENT_ITEM_TYPE.equals(mimeType)) {
+                    final NicknameViewModel itemEditor = NicknameViewModel.createForExisting(
+                            mContext, rawContact, dataId, entryValues, kind.titleRes);
+                    rawContact.getFields().add(itemEditor);
+                    continue;
+                }
 
-                final boolean hasData = !TextUtils.isEmpty(entry.data);
-                final boolean isSuperPrimary = entryValues.getAsInteger(
-                        Data.IS_SUPER_PRIMARY) != 0;
+                if (Note.CONTENT_ITEM_TYPE.equals(mimeType)) {
+                    final NoteViewModel itemEditor = NoteViewModel.createForExisting(mContext,
+                            rawContact, dataId, entryValues, kind.titleRes);
+                    rawContact.getFields().add(itemEditor);
+                    continue;
+                }
 
-                final Intent itemEditIntent = new Intent(Intent.ACTION_EDIT, entry.uri);
-                itemEditIntent.putExtra(ContactFieldEditorActivity.BUNDLE_RAW_CONTACT_URI,
-                        rawContactUriString);
-                entry.intent = itemEditIntent;
-                entry.actionIcon = R.drawable.edit;
+                if (Website.CONTENT_ITEM_TYPE.equals(mimeType)) {
+                    final WebsiteViewModel itemEditor = WebsiteViewModel.createForExisting(
+                            mContext, rawContact, dataId, entryValues, kind.titleRes);
+                    rawContact.getFields().add(itemEditor);
+                    continue;
+                }
 
-                if (StructuredName.CONTENT_ITEM_TYPE.equals(mimeType)) {
-                    rawContact.getFields().add(entry);
-                } else if (Photo.CONTENT_ITEM_TYPE.equals(mimeType)) {
-                    rawContact.getFields().add(entry);
-                } else if (Phone.CONTENT_ITEM_TYPE.equals(mimeType) && hasData) {
-                    // Remember super-primary phone
-                    entry.isPrimary = isSuperPrimary;
-                    rawContact.getFields().add(entry);
-                } else if (Email.CONTENT_ITEM_TYPE.equals(mimeType) && hasData) {
-                    // Build email entries
-                    entry.isPrimary = isSuperPrimary;
-                    rawContact.getFields().add(entry);
-                } else if (StructuredPostal.CONTENT_ITEM_TYPE.equals(mimeType) && hasData) {
-                    // Build postal entries
-                    rawContact.getFields().add(entry);
-                } else if (Im.CONTENT_ITEM_TYPE.equals(mimeType) && hasData) {
-                    // Build IM entries
-                    if (TextUtils.isEmpty(entry.label)) {
-                        entry.label = mContext.getString(R.string.chat).toLowerCase();
-                    }
-                    rawContact.getFields().add(entry);
-                } else if (Organization.CONTENT_ITEM_TYPE.equals(mimeType) &&
-                        (hasData || !TextUtils.isEmpty(entry.label))) {
-                    entry.uri = null;
+                if (Organization.CONTENT_ITEM_TYPE.equals(mimeType)) {
+                    final OrganizationViewModel itemEditor =
+                            OrganizationViewModel.createForExisting(mContext, rawContact, dataId,
+                            entryValues, kind.titleRes);
+                    rawContact.getFields().add(itemEditor);
+                    continue;
+                }
 
-                    if (TextUtils.isEmpty(entry.label)) {
-                        entry.label = entry.data;
-                        entry.data = "";
-                    }
-
-                    rawContact.getFields().add(entry);
-                } else if (Nickname.CONTENT_ITEM_TYPE.equals(mimeType) && hasData) {
-                    entry.uri = null;
-                    rawContact.getFields().add(entry);
-                } else if (Note.CONTENT_ITEM_TYPE.equals(mimeType) && hasData) {
-                    entry.uri = null;
-                    entry.maxLines = 100;
-                    rawContact.getFields().add(entry);
-                } else if (Website.CONTENT_ITEM_TYPE.equals(mimeType) && hasData) {
-                    entry.uri = null;
-                    entry.maxLines = 10;
-                    rawContact.getFields().add(entry);
-                } else {
-                    // Use social summary when requested by external source
-                    final DataStatus status = mContactData.getStatuses().get(entry.id);
-                    final boolean hasSocial = kind.actionBodySocial && status != null;
-
-                    if (hasSocial || hasData) {
-                        rawContact.getFields().add(entry);
-                    }
+                if (Photo.CONTENT_ITEM_TYPE.equals(mimeType)) {
+                    final PhotoViewModel itemEditor =
+                            PhotoViewModel.createForExisting(mContext, rawContact, dataId,
+                            entryValues);
+                    rawContact.getFields().add(itemEditor);
+                    continue;
                 }
             }
         }
@@ -492,43 +492,6 @@
         if (mListener != null) mListener.onDialogRequested(dialogId, null);
     }
 
-    @Override
-    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
-        AdapterView.AdapterContextMenuInfo info;
-        try {
-             info = (AdapterView.AdapterContextMenuInfo) menuInfo;
-        } catch (ClassCastException e) {
-            Log.e(TAG, "bad menuInfo", e);
-            return;
-        }
-
-        // This can be null sometimes, don't crash...
-        if (info == null) {
-            Log.e(TAG, "bad menuInfo");
-            return;
-        }
-
-        final BaseViewModel baseEntry = mAdapter.getEntry(info.position);
-        if (baseEntry instanceof DataViewModel) {
-            final DataViewModel entry = (DataViewModel) baseEntry;
-            menu.setHeaderTitle(R.string.contactOptionsTitle);
-            if (entry.mimetype.equals(CommonDataKinds.Phone.CONTENT_ITEM_TYPE)) {
-                menu.add(0, 0, 0, R.string.menu_call).setIntent(entry.intent);
-                menu.add(0, 0, 0, R.string.menu_sendSMS).setIntent(entry.secondaryIntent);
-                if (!entry.isPrimary) {
-                    menu.add(0, MENU_ITEM_MAKE_DEFAULT, 0, R.string.menu_makeDefaultNumber);
-                }
-            } else if (entry.mimetype.equals(CommonDataKinds.Email.CONTENT_ITEM_TYPE)) {
-                menu.add(0, 0, 0, R.string.menu_sendEmail).setIntent(entry.intent);
-                if (!entry.isPrimary) {
-                    menu.add(0, MENU_ITEM_MAKE_DEFAULT, 0, R.string.menu_makeDefaultEmail);
-                }
-            } else if (entry.mimetype.equals(CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE)) {
-                menu.add(0, 0, 0, R.string.menu_viewAddress).setIntent(entry.intent);
-            }
-        }
-    }
-
     // This was the ListView based code to expand/collapse sections.
 //    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
 //        if (mListener == null) return;
@@ -619,12 +582,13 @@
                         final String rawContactUriString = ContentUris.withAppendedId(
                                 RawContacts.CONTENT_URI, rawContactId).toString();
                         final DataKind dataKind = filteredDataKinds.get(which);
-                        final Intent intent = new Intent();
-                        intent.setType(dataKind.mimeType);
-                        intent.setAction(Intent.ACTION_INSERT);
-                        intent.putExtra(ContactFieldEditorActivity.BUNDLE_RAW_CONTACT_URI,
-                                rawContactUriString);
-                        if (mListener != null) mListener.onEditorRequested(intent);
+                        // TODO: Add new row
+//                        final Intent intent = new Intent();
+//                        intent.setType(dataKind.mimeType);
+//                        intent.setAction(Intent.ACTION_INSERT);
+//                        intent.putExtra(ContactFieldEditorActivity.BUNDLE_RAW_CONTACT_URI,
+//                                rawContactUriString);
+//                        if (mListener != null) mListener.onEditorRequested(intent);
                     }
                 };
                 return new AlertDialog.Builder(mContext)
@@ -643,48 +607,6 @@
         return null;
     }
 
-    @Override
-    public boolean onContextItemSelected(MenuItem item) {
-        switch (item.getItemId()) {
-            case MENU_ITEM_MAKE_DEFAULT: {
-                if (makeItemDefault(item)) {
-                    return true;
-                }
-                break;
-            }
-        }
-
-        return false;
-    }
-
-    private boolean makeItemDefault(MenuItem item) {
-        final BaseViewModel baseEntry = getViewEntryForMenuItem(item);
-        if (baseEntry == null || !(baseEntry instanceof DataViewModel)) {
-            return false;
-        }
-        final DataViewModel entry = (DataViewModel) baseEntry;
-
-        // Update the primary values in the data record.
-        ContentValues values = new ContentValues(1);
-        values.put(Data.IS_SUPER_PRIMARY, 1);
-
-        mContext.getContentResolver().update(ContentUris.withAppendedId(Data.CONTENT_URI, entry.id),
-                values, null, null);
-        return true;
-    }
-
-    private BaseViewModel getViewEntryForMenuItem(MenuItem item) {
-        final AdapterView.AdapterContextMenuInfo info;
-        try {
-             info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
-        } catch (ClassCastException e) {
-            Log.e(TAG, "bad menuInfo", e);
-            return null;
-        }
-
-        return mAdapter.getEntry(info.position);
-    }
-
     private FooterViewModel.Listener mRawContactFooterListener =
             new FooterViewModel.Listener() {
         public void onAddClicked(DisplayRawContact rawContact) {
diff --git a/src/com/android/contacts/views/editor/ContactFieldEditorBaseFragment.java b/src/com/android/contacts/views/editor/ContactFieldEditorBaseFragment.java
deleted file mode 100644
index afc0673..0000000
--- a/src/com/android/contacts/views/editor/ContactFieldEditorBaseFragment.java
+++ /dev/null
@@ -1,222 +0,0 @@
-/*
- * Copyright (C) 2010 Google Inc.
- *
- * 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.views.editor;
-
-import com.android.contacts.views.ContactLoader;
-import com.android.contacts.views.ContactSaveService;
-import com.android.internal.util.ArrayUtils;
-
-import android.app.Activity;
-import android.app.LoaderManagingFragment;
-import android.content.ContentProviderOperation;
-import android.content.ContentResolver;
-import android.content.ContentUris;
-import android.content.ContentValues;
-import android.content.Context;
-import android.content.Entity;
-import android.content.Intent;
-import android.content.Loader;
-import android.content.ContentProviderOperation.Builder;
-import android.content.Entity.NamedContentValues;
-import android.net.Uri;
-import android.os.Bundle;
-import android.provider.ContactsContract.Data;
-import android.provider.ContactsContract.RawContacts;
-import android.util.Log;
-
-import java.util.ArrayList;
-
-public abstract class ContactFieldEditorBaseFragment
-        extends LoaderManagingFragment<ContactLoader.Result> {
-    private static final String TAG = "ContactFieldEditorBaseFragment";
-
-    private static final int LOADER_DETAILS = 1;
-
-    private String mMimeType;
-    private long mRawContactId;
-    private Uri mRawContactUri;
-    private long mDataId;
-    private Uri mDataUri;
-    private Context mContext;
-    private Listener mListener;
-    private ContactLoader.Result mContactData;
-
-    @Override
-    public void onAttach(Activity activity) {
-        super.onAttach(activity);
-        mContext = activity;
-    }
-
-    public ContactLoader.Result getContactData() {
-        return mContactData;
-    }
-
-    /**
-     * Sets up the Fragment for Insert-Mode. Neither mimeType nor rawContactUri must be null
-     */
-    public void setupInsert(String mimeType, Uri rawContactUri) {
-        mMimeType = mimeType;
-        mRawContactUri = rawContactUri;
-        mRawContactId = Long.parseLong(rawContactUri.getLastPathSegment());
-        mDataUri = null;
-        mDataId = 0;
-    }
-
-    /**
-     * Sets up the Fragment for Edit-Mode. Neither rawContactUri nor dataUri must be null
-     * and dataUri must reference a data item that is associated with the given rawContactUri
-     */
-    public void setupEdit(Uri rawContactUri, Uri dataUri) {
-        mMimeType = null;
-        mRawContactUri = rawContactUri;
-        mRawContactId = Long.parseLong(rawContactUri.getLastPathSegment());
-        mDataUri = dataUri;
-        mDataId = Long.parseLong(dataUri.getLastPathSegment());
-    }
-
-    @Override
-    protected void onInitializeLoaders() {
-        startLoading(LOADER_DETAILS, null);
-    }
-
-    @Override
-    protected Loader<ContactLoader.Result> onCreateLoader(int id, Bundle args) {
-        switch (id) {
-            case LOADER_DETAILS: {
-                return new ContactLoader(mContext,
-                        ContentUris.withAppendedId(RawContacts.CONTENT_URI, mRawContactId));
-            }
-            default: {
-                Log.wtf(TAG, "Unknown ID in onCreateLoader: " + id);
-            }
-        }
-        return null;
-    }
-
-    @Override
-    protected void onLoadFinished(Loader<ContactLoader.Result> loader,
-            ContactLoader.Result data) {
-        final int id = loader.getId();
-        switch (id) {
-            case LOADER_DETAILS:
-                if (data == ContactLoader.Result.NOT_FOUND) {
-                    // Item has been deleted
-                    Log.i(TAG, "No contact found. Closing activity");
-                    if (mListener != null) mListener.onContactNotFound();
-                    return;
-                }
-                if (data == ContactLoader.Result.ERROR) {
-                    throw new IllegalStateException("Error during data loading");
-                }
-                mContactData = data;
-
-                // Find the correct RawContact
-                for (Entity entity : mContactData.getEntities()) {
-                    final ContentValues rawContactEntity = entity.getEntityValues();
-                    final long rawContactId = rawContactEntity.getAsLong(RawContacts._ID);
-                    if (rawContactId == mRawContactId) {
-                        if (mDataId == 0) {
-                            // Do an INSERT
-                            setupEmpty(rawContactEntity);
-                            return;
-                        }
-                        // Do an EDIT. Find the correct item
-                        for (NamedContentValues subValue : entity.getSubValues()) {
-                            final long dataId = subValue.values.getAsLong(Data._ID);
-                            if (dataId == mDataId) {
-                                loadData(subValue);
-                                return;
-                            }
-                        }
-                    }
-                }
-
-                // Item could not be found
-                Log.i(TAG, "Data item not found. Closing activity");
-                if (mListener != null) mListener.onDataNotFound();
-                return;
-            default: {
-                Log.wtf(TAG, "Unknown ID in onLoadFinished: " + id);
-            }
-        }
-    }
-
-    protected void saveData() {
-        final ContentResolver resolver = getActivity().getContentResolver();
-
-        final ArrayList<ContentProviderOperation> operations =
-            new ArrayList<ContentProviderOperation>();
-
-        final Builder builder;
-        if (getDataUri() == null) {
-            // INSERT
-            builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);
-            builder.withValue(Data.MIMETYPE, mMimeType);
-            builder.withValue(Data.RAW_CONTACT_ID, getRawContactId());
-            saveData(builder);
-        } else {
-            // UPDATE
-            builder = ContentProviderOperation.newUpdate(getDataUri());
-            saveData(builder);
-        }
-        operations.add(builder.build());
-
-        // Tell the Service to save
-        final Intent serviceIntent = new Intent();
-        final ContentProviderOperation[] operationsArray =
-                operations.toArray(ArrayUtils.emptyArray(ContentProviderOperation.class));
-        serviceIntent.putExtra(ContactSaveService.EXTRA_OPERATIONS, operationsArray);
-        serviceIntent.setClass(getActivity().getApplicationContext(), ContactSaveService.class);
-
-        getActivity().startService(serviceIntent);
-    }
-
-    protected abstract void saveData(final Builder builder);
-    protected abstract void setupEmpty(ContentValues rawContactEntity);
-    protected abstract void loadData(NamedContentValues contentValues);
-
-    public void setListener(Listener listener) {
-        mListener = listener;
-    }
-
-    public Listener getListener() {
-        return mListener;
-    }
-
-    public Uri getRawContactUri() {
-        return mRawContactUri;
-    }
-
-    public long getRawContactId() {
-        return mRawContactId;
-    }
-
-    public Uri getDataUri() {
-        return mDataUri;
-    }
-
-    public long getDataId() {
-        return mDataId;
-    }
-
-    public static interface Listener {
-        void onContactNotFound();
-        void onDataNotFound();
-        void onCancel();
-        void onSaved();
-    }
-}
diff --git a/src/com/android/contacts/views/editor/ContactFieldEditorEmailFragment.java b/src/com/android/contacts/views/editor/ContactFieldEditorEmailFragment.java
deleted file mode 100644
index 7760b64..0000000
--- a/src/com/android/contacts/views/editor/ContactFieldEditorEmailFragment.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Copyright (C) 2010 Google Inc.
- *
- * 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.views.editor;
-
-import com.android.contacts.R;
-import com.android.contacts.util.ViewGroupAnimator;
-
-import android.content.ContentValues;
-import android.content.ContentProviderOperation.Builder;
-import android.content.Entity.NamedContentValues;
-import android.graphics.Color;
-import android.os.Bundle;
-import android.provider.ContactsContract.CommonDataKinds.Email;
-import android.util.SparseArray;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.View.OnClickListener;
-import android.widget.Button;
-import android.widget.EditText;
-
-public class ContactFieldEditorEmailFragment extends ContactFieldEditorBaseFragment {
-    private EditText mEditText;
-    private View mCustomTypeContainer;
-    private EditText mCustomTypeTextView;
-    private SparseArray<Button> mTypeButtons = new SparseArray<Button>();
-    private int mSelectedType;
-
-    @Override
-    public View onCreateView(LayoutInflater inflater, ViewGroup container,
-            Bundle savedInstanceState) {
-        final View view = inflater.inflate(R.layout.contact_field_editor_email_fragment, container,
-                false);
-
-        mEditText = (EditText) view.findViewById(R.id.email_edit_text);
-        mTypeButtons.append(Email.TYPE_HOME, (Button) view.findViewById(R.id.email_type_home));
-        mTypeButtons.append(Email.TYPE_WORK, (Button) view.findViewById(R.id.email_type_work));
-        mTypeButtons.append(Email.TYPE_OTHER, (Button) view.findViewById(R.id.email_type_other));
-        mTypeButtons.append(Email.TYPE_CUSTOM, (Button) view.findViewById(R.id.email_type_custom));
-
-        mCustomTypeContainer = view.findViewById(R.id.email_edit_custom_type);
-        mCustomTypeTextView = (EditText) view.findViewById(R.id.email_edit_type_text);
-
-        for (int i = 0; i < mTypeButtons.size(); i++) {
-            final int type = mTypeButtons.keyAt(i);
-            final Button button = mTypeButtons.get(type);
-            button.setText(Email.getTypeLabelResource(type));
-            button.setOnClickListener(mTypeButtonOnClickListener);
-        }
-
-        final Button okButton = (Button) view.findViewById(R.id.btn_ok);
-        final Button cancelButton = (Button) view.findViewById(R.id.btn_cancel);
-        okButton.setOnClickListener(new OnClickListener() {
-            public void onClick(View v) {
-                saveData();
-
-                if (getListener() != null) getListener().onSaved();
-            }
-        });
-        cancelButton.setOnClickListener(new OnClickListener() {
-            public void onClick(View v) {
-                if (getListener() != null) getListener().onCancel();
-            }
-        });
-        return view;
-    }
-
-    private void pushTypeButton(int newType, boolean animate) {
-        boolean doAnimation =
-                animate && ((mSelectedType == Email.TYPE_CUSTOM) ^ (newType == Email.TYPE_CUSTOM));
-
-        final ViewGroupAnimator animator;
-        if (doAnimation) {
-            animator = ViewGroupAnimator.captureView(getView().getRootView());
-        } else {
-            animator = null;
-        }
-        for (int i = 0; i < mTypeButtons.size(); i++) {
-            final int type = mTypeButtons.keyAt(i);
-            final Button button = mTypeButtons.get(type);
-            button.setTextColor(newType == type ? Color.BLACK : Color.GRAY);
-        }
-
-        mCustomTypeContainer.setVisibility(newType == Email.TYPE_CUSTOM ? View.VISIBLE : View.GONE);
-
-        if (doAnimation) animator.animate();
-
-        mSelectedType = newType;
-    }
-
-    private OnClickListener mTypeButtonOnClickListener = new OnClickListener() {
-        public void onClick(View v) {
-            final Button b = (Button) v;
-            final int index = mTypeButtons.indexOfValue(b);
-            final int type = mTypeButtons.keyAt(index);
-            pushTypeButton(type, true);
-        }
-    };
-
-    @Override
-    protected void setupEmpty(ContentValues rawContactEntity) {
-        pushTypeButton(Email.TYPE_HOME, false);
-    }
-
-    @Override
-    protected void loadData(NamedContentValues contentValues) {
-        mEditText.setText(contentValues.values.getAsString(Email.ADDRESS));
-        pushTypeButton(contentValues.values.getAsInteger(Email.TYPE).intValue(), false);
-        mCustomTypeTextView.setText(contentValues.values.getAsString(Email.LABEL));
-    }
-
-    @Override
-    protected void saveData(Builder builder) {
-        builder.withValue(Email.ADDRESS, mEditText.getText().toString());
-        builder.withValue(Email.TYPE, mSelectedType);
-        builder.withValue(Email.LABEL, mCustomTypeTextView.getText().toString());
-    }
-}
diff --git a/src/com/android/contacts/views/editor/view/DataView.java b/src/com/android/contacts/views/editor/view/DataView.java
deleted file mode 100644
index e4cd1de..0000000
--- a/src/com/android/contacts/views/editor/view/DataView.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Copyright (C) 2010 Google Inc.
- *
- * 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.views.editor.view;
-
-import com.android.contacts.R;
-
-import android.content.Context;
-import android.content.Intent;
-import android.content.res.Resources;
-import android.text.TextUtils;
-import android.util.AttributeSet;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-
-public class DataView extends LinearLayout {
-    public TextView mLabelTextView;
-    public TextView mDataTextView;
-    public ImageView mActionIconImageView;
-    public ImageView mPrimaryIconImageView;
-    public ImageView mSecondaryActionButtonImageView;
-    public View mSecondaryActionDividerView;
-
-    public DataView(Context context) {
-        super(context);
-    }
-
-    public DataView(Context context, AttributeSet attrs) {
-        super(context, attrs);
-    }
-
-    public DataView(Context context, AttributeSet attrs, int defStyle) {
-        super(context, attrs, defStyle);
-    }
-
-    public static DataView inflate(LayoutInflater inflater, ViewGroup parent,
-            boolean attachToRoot) {
-        return (DataView) inflater.inflate(R.layout.list_edit_item_text_icons, parent,
-                attachToRoot);
-    }
-
-    @Override
-    protected void onFinishInflate() {
-        super.onFinishInflate();
-
-        mLabelTextView = (TextView) findViewById(android.R.id.text1);
-        mDataTextView = (TextView) findViewById(android.R.id.text2);
-        mActionIconImageView = (ImageView) findViewById(R.id.action_icon);
-        mPrimaryIconImageView = (ImageView) findViewById(R.id.primary_icon);
-        mSecondaryActionButtonImageView = (ImageView) findViewById(R.id.secondary_action_button);
-        mSecondaryActionDividerView = findViewById(R.id.divider);
-    }
-
-    public void setLabelText(String value, int maxLines) {
-        mLabelTextView.setText(value);
-        setMaxLines(mLabelTextView, maxLines);
-    }
-
-    public void setDataText(String value, int maxLines) {
-        mDataTextView.setText(value);
-        setMaxLines(mDataTextView, maxLines);
-    }
-
-    private static void setMaxLines(TextView textView, int maxLines) {
-        if (maxLines == 1) {
-            textView.setSingleLine(true);
-            textView.setEllipsize(TextUtils.TruncateAt.END);
-        } else {
-            textView.setSingleLine(false);
-            textView.setMaxLines(maxLines);
-            textView.setEllipsize(null);
-        }
-    }
-
-    public void setPrimary(boolean value) {
-        mPrimaryIconImageView.setVisibility(value ? View.VISIBLE : View.GONE);
-    }
-
-    public void setPrimaryIntent(Intent intent, Resources resources, int actionIcon) {
-        if (intent != null) {
-            mActionIconImageView.setImageDrawable(resources.getDrawable(actionIcon));
-            mActionIconImageView.setVisibility(View.VISIBLE);
-        } else {
-            mActionIconImageView.setVisibility(View.INVISIBLE);
-        }
-    }
-
-    public void setSecondaryIntent(Intent intent, Resources resources, int actionIcon) {
-        if (intent != null) {
-            mSecondaryActionButtonImageView.setImageDrawable(resources.getDrawable(actionIcon));
-            mSecondaryActionButtonImageView.setVisibility(View.VISIBLE);
-            mSecondaryActionDividerView.setVisibility(View.VISIBLE);
-        } else {
-            mSecondaryActionButtonImageView.setVisibility(View.INVISIBLE);
-            mSecondaryActionDividerView.setVisibility(View.INVISIBLE);
-        }
-    }
-}
diff --git a/src/com/android/contacts/views/editor/view/OrganizationView.java b/src/com/android/contacts/views/editor/view/OrganizationView.java
new file mode 100644
index 0000000..53b400f
--- /dev/null
+++ b/src/com/android/contacts/views/editor/view/OrganizationView.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * 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.views.editor.view;
+
+import com.android.contacts.R;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+public class OrganizationView extends LinearLayout {
+    private TextView mCaptionTextView;
+    private EditText mCompanyFieldEditText;
+    private EditText mTitleFieldEditText;
+    private Button mTypeButton;
+    private Listener mListener;
+    private boolean mHasFocus;
+
+    public OrganizationView(Context context) {
+        super(context);
+    }
+
+    public OrganizationView(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    public OrganizationView(Context context, AttributeSet attrs, int defStyle) {
+        super(context, attrs, defStyle);
+    }
+
+    public static OrganizationView inflate(LayoutInflater inflater, ViewGroup parent,
+            boolean attachToRoot) {
+        return (OrganizationView) inflater.inflate(R.layout.list_edit_item_organization, parent,
+                attachToRoot);
+    }
+
+    public void setListener(Listener value) {
+        mListener = value;
+    }
+
+    @Override
+    protected void onFinishInflate() {
+        super.onFinishInflate();
+
+        mCaptionTextView = (TextView) findViewById(R.id.caption);
+        mCompanyFieldEditText = (EditText) findViewById(R.id.company_field);
+        mCompanyFieldEditText.setOnFocusChangeListener(mFieldEditTextFocusChangeListener);
+        mTitleFieldEditText = (EditText) findViewById(R.id.title_field);
+        mTitleFieldEditText.setOnFocusChangeListener(mFieldEditTextFocusChangeListener);
+        mTypeButton = (Button) findViewById(R.id.type);
+    }
+
+    public void setLabelText(int resId) {
+        mCaptionTextView.setText(resId);
+    }
+
+    public void setFieldValues(CharSequence company, CharSequence title) {
+        mCompanyFieldEditText.setText(company);
+        mTitleFieldEditText.setText(title);
+    }
+
+    public CharSequence getCompanyFieldValue() {
+        return mCompanyFieldEditText.getText();
+    }
+
+    public CharSequence getTitleFieldValue() {
+        return mTitleFieldEditText.getText();
+    }
+
+    public void setTypeDisplayLabel(CharSequence type) {
+        mTypeButton.setText(type);
+    }
+
+    private OnFocusChangeListener mFieldEditTextFocusChangeListener = new OnFocusChangeListener() {
+        public void onFocusChange(View v, boolean hasFocus) {
+            boolean anyHasFocus = mCompanyFieldEditText.hasFocus()
+                    || mTitleFieldEditText.hasFocus();
+            if (mHasFocus && !anyHasFocus && mListener != null) {
+                mListener.onFocusLost(OrganizationView.this);
+            }
+            mHasFocus = anyHasFocus;
+        }
+    };
+
+    public interface Listener {
+        void onFocusLost(OrganizationView view);
+    }
+}
diff --git a/src/com/android/contacts/views/editor/view/SimpleOrStructuredView.java b/src/com/android/contacts/views/editor/view/SimpleOrStructuredView.java
new file mode 100644
index 0000000..2bd0bd0
--- /dev/null
+++ b/src/com/android/contacts/views/editor/view/SimpleOrStructuredView.java
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * 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.views.editor.view;
+
+import com.android.contacts.R;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+public class SimpleOrStructuredView extends LinearLayout {
+    private TextView mCaptionTextView;
+    private EditText mFieldEditText;
+    private Button mStructuredEditorButton;
+    private Listener mListener;
+    private boolean mHasFocus;
+
+    public SimpleOrStructuredView(Context context) {
+        super(context);
+    }
+
+    public SimpleOrStructuredView(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    public SimpleOrStructuredView(Context context, AttributeSet attrs, int defStyle) {
+        super(context, attrs, defStyle);
+    }
+
+    public static SimpleOrStructuredView inflate(LayoutInflater inflater, ViewGroup parent,
+            boolean attachToRoot) {
+        return (SimpleOrStructuredView) inflater.inflate(
+                R.layout.list_edit_item_simple_or_structured, parent, attachToRoot);
+    }
+
+    public void setListener(Listener value) {
+        mListener = value;
+    }
+
+    @Override
+    protected void onFinishInflate() {
+        super.onFinishInflate();
+
+        mCaptionTextView = (TextView) findViewById(R.id.caption);
+        mFieldEditText = (EditText) findViewById(R.id.field);
+        mFieldEditText.setOnFocusChangeListener(mFieldEditTextFocusChangeListener);
+        mStructuredEditorButton = (Button) findViewById(R.id.structuredEditorButton);
+        mStructuredEditorButton.setOnClickListener(mFullEditorClickListener);
+    }
+
+    public void setLabelText(int resId) {
+        mCaptionTextView.setText(resId);
+    }
+
+    public void setDisplayName(CharSequence value) {
+        mFieldEditText.setText(value);
+    }
+
+    public CharSequence getDisplayName() {
+        return mFieldEditText.getText();
+    }
+
+    private OnFocusChangeListener mFieldEditTextFocusChangeListener = new OnFocusChangeListener() {
+        public void onFocusChange(View v, boolean hasFocus) {
+            if (mHasFocus && !hasFocus && mListener != null) {
+                mListener.onFocusLost(SimpleOrStructuredView.this);
+            }
+            mHasFocus = hasFocus;
+        }
+    };
+
+    private OnClickListener mFullEditorClickListener = new OnClickListener() {
+        public void onClick(View v) {
+            if (mListener != null) {
+                mListener.onStructuredEditorRequested(SimpleOrStructuredView.this);
+            }
+        }
+    };
+
+    public interface Listener {
+        void onFocusLost(SimpleOrStructuredView view);
+        void onStructuredEditorRequested(SimpleOrStructuredView view);
+    }
+}
diff --git a/src/com/android/contacts/views/editor/view/SingleFieldView.java b/src/com/android/contacts/views/editor/view/SingleFieldView.java
new file mode 100644
index 0000000..2d4695e
--- /dev/null
+++ b/src/com/android/contacts/views/editor/view/SingleFieldView.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * 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.views.editor.view;
+
+import com.android.contacts.R;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.EditText;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+public class SingleFieldView extends LinearLayout {
+    private TextView mCaptionTextView;
+    private EditText mFieldEditText;
+    private Listener mListener;
+    private boolean mHasFocus;
+
+    public SingleFieldView(Context context) {
+        super(context);
+    }
+
+    public SingleFieldView(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    public SingleFieldView(Context context, AttributeSet attrs, int defStyle) {
+        super(context, attrs, defStyle);
+    }
+
+    public static SingleFieldView inflate(LayoutInflater inflater, ViewGroup parent,
+            boolean attachToRoot) {
+        return (SingleFieldView) inflater.inflate(R.layout.list_edit_item_single_field,
+                parent, attachToRoot);
+    }
+
+    public void setListener(Listener value) {
+        mListener = value;
+    }
+
+    @Override
+    protected void onFinishInflate() {
+        super.onFinishInflate();
+
+        mCaptionTextView = (TextView) findViewById(R.id.caption);
+        mFieldEditText = (EditText) findViewById(R.id.field);
+        mFieldEditText.setOnFocusChangeListener(mFieldEditTextFocusChangeListener);
+    }
+
+    public void setLabelText(int resId) {
+        mCaptionTextView.setText(resId);
+    }
+
+    public void setFieldValue(CharSequence value) {
+        mFieldEditText.setText(value);
+    }
+
+    public CharSequence getFieldValue() {
+        return mFieldEditText.getText();
+    }
+
+    private OnFocusChangeListener mFieldEditTextFocusChangeListener = new OnFocusChangeListener() {
+        public void onFocusChange(View v, boolean hasFocus) {
+            if (mHasFocus && !hasFocus && mListener != null) {
+                mListener.onFocusLost(SingleFieldView.this);
+            }
+            mHasFocus = hasFocus;
+        }
+    };
+
+    public interface Listener {
+        void onFocusLost(SingleFieldView view);
+    }
+}
diff --git a/src/com/android/contacts/views/editor/view/ViewTypes.java b/src/com/android/contacts/views/editor/view/ViewTypes.java
index 7cd2702..9795e40 100644
--- a/src/com/android/contacts/views/editor/view/ViewTypes.java
+++ b/src/com/android/contacts/views/editor/view/ViewTypes.java
@@ -18,9 +18,12 @@
 
 public interface ViewTypes {
     public static final int DATA = 0;
-    public static final int FIELD_AND_TYPE = 1;
-    public static final int PHOTO = 2;
-    public static final int RAW_CONTACT_HEADER = 3;
-    public static final int RAW_CONTACT_FOOTER = 4;
-    public static final int _COUNT = 5;
+    public static final int SINGLE_FIELD = 1;
+    public static final int FIELD_AND_TYPE = 2;
+    public static final int SIMPLE_OR_STRUCTURED = 3;
+    public static final int PHOTO = 4;
+    public static final int ORGANIZATION = 5;
+    public static final int RAW_CONTACT_HEADER = 6;
+    public static final int RAW_CONTACT_FOOTER = 7;
+    public static final int _COUNT = 8;
 }
diff --git a/src/com/android/contacts/views/editor/viewModel/BaseViewModel.java b/src/com/android/contacts/views/editor/viewModel/BaseViewModel.java
index 0a324ca..6bef3ca 100644
--- a/src/com/android/contacts/views/editor/viewModel/BaseViewModel.java
+++ b/src/com/android/contacts/views/editor/viewModel/BaseViewModel.java
@@ -24,7 +24,6 @@
 import android.view.ViewGroup;
 
 public abstract class BaseViewModel {
-    // TODO: Consider just storing the Id of the RawContact. Would prevent some cyclic references
     private final DisplayRawContact mRawContact;
     private final Context mContext;
 
diff --git a/src/com/android/contacts/views/editor/viewModel/DataViewModel.java b/src/com/android/contacts/views/editor/viewModel/DataViewModel.java
index fb1c4c5..23e98e4 100644
--- a/src/com/android/contacts/views/editor/viewModel/DataViewModel.java
+++ b/src/com/android/contacts/views/editor/viewModel/DataViewModel.java
@@ -16,128 +16,86 @@
 
 package com.android.contacts.views.editor.viewModel;
 
-import com.android.contacts.model.ContactsSource.DataKind;
-import com.android.contacts.util.Constants;
+import com.android.contacts.views.ContactSaveService;
 import com.android.contacts.views.editor.DisplayRawContact;
-import com.android.contacts.views.editor.view.DataView;
-import com.android.contacts.views.editor.view.PhotoView;
-import com.android.contacts.views.editor.view.ViewTypes;
+import com.android.internal.util.ArrayUtils;
 
+import android.content.ContentProviderOperation;
+import android.content.ContentResolver;
 import android.content.ContentUris;
 import android.content.ContentValues;
 import android.content.Context;
 import android.content.Intent;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
+import android.content.ContentProviderOperation.Builder;
 import android.net.Uri;
 import android.provider.ContactsContract.Data;
-import android.provider.ContactsContract.CommonDataKinds.Phone;
-import android.provider.ContactsContract.CommonDataKinds.Photo;
-import android.telephony.PhoneNumberUtils;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
 
-public class DataViewModel extends BaseViewModel {
-    public String label;
-    public String data;
-    public Uri uri;
-    public long id = 0;
-    public int maxLines = 1;
-    public String mimetype;
+import java.util.ArrayList;
 
-    public int actionIcon = -1;
-    public boolean isPrimary = false;
-    public Intent intent;
-    public Intent secondaryIntent = null;
-    public int maxLabelLines = 1;
-    public byte[] binaryData = null;
+public abstract class DataViewModel extends BaseViewModel {
+    private final long mDataId;
+    private final ContentValues mContentValues;
+    private final String mMimeType;
+    private final Uri mDataUri;
+
+    protected DataViewModel(Context context, DisplayRawContact rawContact, long dataId,
+            ContentValues contentValues, String mimeType) {
+        super(context, rawContact);
+        mDataId = dataId;
+        mContentValues = contentValues;
+        mMimeType = mimeType;
+        mDataUri = ContentUris.withAppendedId(Data.CONTENT_URI, mDataId);
+    }
+
+    public long getDataId() {
+        return mDataId;
+    }
+
+    public Uri getDataUri() {
+        return mDataUri;
+    }
+
+    protected ContentValues getContentValues() {
+        return mContentValues;
+    }
+
+    public String getMimeType() {
+        return mMimeType;
+    }
 
     /**
-     * Build new {@link DataViewModel} and populate from the given values.
+     * Uncoditionally saves the current state to the database. No difference analysis is performed
      */
-    public DataViewModel(Context context, String mimeType, DataKind kind,
-            DisplayRawContact rawContact, long dataId, ContentValues values) {
-        super(context, rawContact);
-        id = dataId;
-        uri = ContentUris.withAppendedId(Data.CONTENT_URI, id);
-        mimetype = mimeType;
-        label = buildActionString(kind, values, false, context);
-        data = buildDataString(kind, values, context);
-        binaryData = values.getAsByteArray(Data.DATA15);
-    }
+    public void saveData() {
+        final ContentResolver resolver = getContext().getContentResolver();
 
-    @Override
-    public int getEntryType() {
-        return Photo.CONTENT_ITEM_TYPE.equals(mimetype) ? ViewTypes.PHOTO : ViewTypes.DATA;
-    }
+        final ArrayList<ContentProviderOperation> operations =
+            new ArrayList<ContentProviderOperation>();
 
-    @Override
-    public View getView(LayoutInflater inflater, View convertView, ViewGroup parent) {
-        // Special Case: Photo
-        if (Photo.CONTENT_ITEM_TYPE.equals(mimetype)) {
-            final PhotoView result = convertView != null
-                    ? (PhotoView) convertView
-                    : PhotoView.inflate(inflater, parent, false);
-
-            final Bitmap bitmap = binaryData != null
-                    ? BitmapFactory.decodeByteArray(binaryData, 0, binaryData.length)
-                    : null;
-            result.setPhoto(bitmap);
-            return result;
-        }
-
-        // All other cases
-        final DataView result = convertView != null
-                ? (DataView) convertView
-                : DataView.inflate(inflater, parent, false);
-
-        // Set the label
-        result.setLabelText(label, maxLabelLines);
-
-        // Set data
-        if (data != null) {
-            if (Phone.CONTENT_ITEM_TYPE.equals(mimetype)
-                    || Constants.MIME_SMS_ADDRESS.equals(mimetype)) {
-                result.setDataText(PhoneNumberUtils.formatNumber(data), maxLines);
-            } else {
-                result.setDataText(data, maxLines);
-            }
+        final Builder builder;
+        if (getDataUri() == null) {
+            // INSERT
+            builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);
+            builder.withValue(Data.MIMETYPE, getMimeType());
+            builder.withValue(Data.RAW_CONTACT_ID, getRawContact().getId());
+            writeToBuilder(builder, true);
         } else {
-            result.setDataText("", maxLines);
+            // UPDATE
+            builder = ContentProviderOperation.newUpdate(getDataUri());
+            writeToBuilder(builder, false);
         }
+        operations.add(builder.build());
 
-        // Set the primary icon
-        result.setPrimary(isPrimary);
+        // Tell the Service to save
+        // TODO: Handle the case where the data element has been removed in the background
+        final Intent serviceIntent = new Intent();
+        final ContentProviderOperation[] operationsArray =
+                operations.toArray(ArrayUtils.emptyArray(ContentProviderOperation.class));
+        serviceIntent.putExtra(ContactSaveService.EXTRA_OPERATIONS, operationsArray);
+        serviceIntent.setClass(getContext().getApplicationContext(), ContactSaveService.class);
 
-        // Set the action icon
-        result.setPrimaryIntent(intent, getContext().getResources(), actionIcon);
-
-        // Set the secondary action button
-        // TODO: Change this to our new form
-        result.setSecondaryIntent(null, null, 0);
-        return result;
+        getContext().startService(serviceIntent);
     }
 
-    private static String buildActionString(DataKind kind, ContentValues values,
-            boolean lowerCase, Context context) {
-        if (kind.actionHeader == null) {
-            return null;
-        }
-        CharSequence actionHeader = kind.actionHeader.inflateUsing(context, values);
-        if (actionHeader == null) {
-            return null;
-        }
-        return lowerCase ? actionHeader.toString().toLowerCase() : actionHeader.toString();
-    }
-
-    private static String buildDataString(DataKind kind, ContentValues values,
-            Context context) {
-        if (kind.actionBody == null) {
-            return null;
-        }
-        CharSequence actionBody = kind.actionBody.inflateUsing(context, values);
-        return actionBody == null ? null : actionBody.toString();
-    }
-
+    protected abstract void writeToBuilder(final Builder builder, boolean isInsert);
 }
diff --git a/src/com/android/contacts/views/editor/viewModel/EmailViewModel.java b/src/com/android/contacts/views/editor/viewModel/EmailViewModel.java
index 70bb8ea..bcc4397 100644
--- a/src/com/android/contacts/views/editor/viewModel/EmailViewModel.java
+++ b/src/com/android/contacts/views/editor/viewModel/EmailViewModel.java
@@ -25,8 +25,8 @@
 public class EmailViewModel extends FieldAndTypeViewModel {
     private EmailViewModel(Context context, DisplayRawContact rawContact, long dataId,
             ContentValues contentValues, int titleResId) {
-        super(context, rawContact, dataId, contentValues, titleResId, Email.ADDRESS, Email.TYPE,
-                Email.LABEL);
+        super(context, rawContact, dataId, contentValues, Email.CONTENT_ITEM_TYPE, titleResId,
+                Email.ADDRESS, Email.TYPE, Email.LABEL);
     }
 
     public static EmailViewModel createForExisting(Context context, DisplayRawContact rawContact,
diff --git a/src/com/android/contacts/views/editor/viewModel/FieldAndTypeViewModel.java b/src/com/android/contacts/views/editor/viewModel/FieldAndTypeViewModel.java
index e6468c6..c754e92 100644
--- a/src/com/android/contacts/views/editor/viewModel/FieldAndTypeViewModel.java
+++ b/src/com/android/contacts/views/editor/viewModel/FieldAndTypeViewModel.java
@@ -16,46 +16,31 @@
 
 package com.android.contacts.views.editor.viewModel;
 
-import com.android.contacts.views.ContactSaveService;
 import com.android.contacts.views.editor.DisplayRawContact;
 import com.android.contacts.views.editor.view.FieldAndTypeView;
 import com.android.contacts.views.editor.view.ViewTypes;
-import com.android.internal.util.ArrayUtils;
 
-import android.content.ContentProviderOperation;
-import android.content.ContentResolver;
-import android.content.ContentUris;
 import android.content.ContentValues;
 import android.content.Context;
-import android.content.Intent;
 import android.content.ContentProviderOperation.Builder;
-import android.net.Uri;
-import android.provider.ContactsContract.Data;
+import android.text.TextUtils;
 import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 
-import java.util.ArrayList;
-
-public abstract class FieldAndTypeViewModel extends BaseViewModel {
+public abstract class FieldAndTypeViewModel extends DataViewModel {
     private static final String TAG = "FieldAndTypeViewModel";
 
-    private final long mDataId;
-    private final ContentValues mContentValues;
     private final int mLabelResId;
-    private final Uri mDataUri;
     private final String mFieldColumn;
     private final String mLabelColumn;
     private final String mTypeColumn;
 
     protected FieldAndTypeViewModel(Context context, DisplayRawContact rawContact,
-            long dataId, ContentValues contentValues, int labelResId, String fieldColumn,
-            String typeColumn, String labelColumn) {
-        super(context, rawContact);
-        mDataId = dataId;
-        mDataUri = ContentUris.withAppendedId(Data.CONTENT_URI, mDataId);
-        mContentValues = contentValues;
+            long dataId, ContentValues contentValues, String mimeType, int labelResId,
+            String fieldColumn, String typeColumn, String labelColumn) {
+        super(context, rawContact, dataId, contentValues, mimeType);
         mLabelResId = labelResId;
 
         mFieldColumn = fieldColumn;
@@ -82,45 +67,8 @@
         return result;
     }
 
-    public long getDataId() {
-        return mDataId;
-    }
-
-    public ContentValues getContentValues() {
-        return mContentValues;
-    }
-
-    private void saveData() {
-        final ContentResolver resolver = getContext().getContentResolver();
-
-        final ArrayList<ContentProviderOperation> operations =
-            new ArrayList<ContentProviderOperation>();
-
-        final Builder builder;
-//        if (getDataUri() == null) {
-//            // INSERT
-//            builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);
-//            builder.withValue(Data.MIMETYPE, mMimeType);
-//            builder.withValue(Data.RAW_CONTACT_ID, getRawContactId());
-//            writeToBuilder(builder);
-//        } else {
-            // UPDATE
-            builder = ContentProviderOperation.newUpdate(mDataUri);
-            writeToBuilder(builder);
-//        }
-        operations.add(builder.build());
-
-        // Tell the Service to save
-        final Intent serviceIntent = new Intent();
-        final ContentProviderOperation[] operationsArray =
-                operations.toArray(ArrayUtils.emptyArray(ContentProviderOperation.class));
-        serviceIntent.putExtra(ContactSaveService.EXTRA_OPERATIONS, operationsArray);
-        serviceIntent.setClass(getContext().getApplicationContext(), ContactSaveService.class);
-
-        getContext().startService(serviceIntent);
-    }
-
-    private void writeToBuilder(final Builder builder) {
+    @Override
+    protected void writeToBuilder(Builder builder, boolean isInsert) {
         builder.withValue(mFieldColumn, getFieldValue());
         builder.withValue(mTypeColumn, getType());
         builder.withValue(mLabelColumn, getLabel());
@@ -130,23 +78,23 @@
         return getContentValues().getAsString(mFieldColumn);
     }
 
-    private void putFieldValue(String value) {
+    protected void putFieldValue(String value) {
         getContentValues().put(mFieldColumn, value);
     }
 
-    public int getType() {
+    protected int getType() {
         return getContentValues().getAsInteger(mTypeColumn).intValue();
     }
 
-    private void putType(int value) {
+    protected void putType(int value) {
         getContentValues().put(mTypeColumn, value);
     }
 
-    public String getLabel() {
+    protected String getLabel() {
         return getContentValues().getAsString(mLabelColumn);
     }
 
-    private void putLabel(String value) {
+    protected void putLabel(String value) {
         getContentValues().put(mLabelColumn, value);
     }
 
@@ -159,7 +107,7 @@
 
             final String oldValue = getFieldValue();
             final String newValue = view.getFieldValue().toString();
-            if (!oldValue.equals(newValue)) {
+            if (!TextUtils.equals(oldValue, newValue)) {
                 putFieldValue(newValue);
                 hasChanged = true;
             }
diff --git a/src/com/android/contacts/views/editor/viewModel/ImViewModel.java b/src/com/android/contacts/views/editor/viewModel/ImViewModel.java
new file mode 100644
index 0000000..7ee3b21
--- /dev/null
+++ b/src/com/android/contacts/views/editor/viewModel/ImViewModel.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * 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.views.editor.viewModel;
+
+import com.android.contacts.views.editor.DisplayRawContact;
+
+import android.content.ContentValues;
+import android.content.Context;
+import android.content.ContentProviderOperation.Builder;
+import android.provider.ContactsContract.CommonDataKinds.Im;
+
+/**
+ * Editor for Instant Messaging fields. The Type (HOME, WORK, OTHER, CUSTOM) is not shown but
+ * instead the same field is used for showing the Protocol (AIM, YAHOO etc). When
+ * creating new Im rows, the Type is set to OTHER
+ */
+public class ImViewModel extends FieldAndTypeViewModel {
+    private ImViewModel(Context context, DisplayRawContact rawContact, long dataId,
+            ContentValues contentValues, int titleResId) {
+        super(context, rawContact, dataId, contentValues, Im.CONTENT_ITEM_TYPE, titleResId, Im.DATA,
+                Im.PROTOCOL, Im.CUSTOM_PROTOCOL);
+    }
+
+    public static ImViewModel createForExisting(Context context, DisplayRawContact rawContact,
+            long dataId, ContentValues contentValues, int titleResId) {
+        return new ImViewModel(context, rawContact, dataId, contentValues, titleResId);
+    }
+
+    @Override
+    protected CharSequence getTypeDisplayLabel() {
+        return Im.getProtocolLabel(getContext().getResources(), getType(), getLabel());
+    }
+
+    @Override
+    protected void writeToBuilder(Builder builder, boolean isInsert) {
+        // The Type field is not exposed in the UI. Write OTHER for Insert but don't change it
+        // for updates
+        if (isInsert) {
+            builder.withValue(Im.TYPE, Im.TYPE_OTHER);
+            builder.withValue(Im.LABEL, "");
+        }
+        super.writeToBuilder(builder, isInsert);
+    }
+}
diff --git a/src/com/android/contacts/views/editor/viewModel/NicknameViewModel.java b/src/com/android/contacts/views/editor/viewModel/NicknameViewModel.java
new file mode 100644
index 0000000..55c7976
--- /dev/null
+++ b/src/com/android/contacts/views/editor/viewModel/NicknameViewModel.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * 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.views.editor.viewModel;
+
+import com.android.contacts.views.editor.DisplayRawContact;
+
+import android.content.ContentValues;
+import android.content.Context;
+import android.provider.ContactsContract.CommonDataKinds.Nickname;
+
+public class NicknameViewModel extends SingleFieldViewModel {
+    private NicknameViewModel(Context context, DisplayRawContact rawContact, long dataId,
+            ContentValues contentValues, int titleResId) {
+        super(context, rawContact, dataId, contentValues, Nickname.CONTENT_ITEM_TYPE, titleResId,
+                Nickname.NAME);
+    }
+
+    public static NicknameViewModel createForExisting(Context context, DisplayRawContact rawContact,
+            long dataId, ContentValues contentValues, int titleResId) {
+        return new NicknameViewModel(context, rawContact, dataId, contentValues, titleResId);
+    }
+}
diff --git a/src/com/android/contacts/views/editor/viewModel/NoteViewModel.java b/src/com/android/contacts/views/editor/viewModel/NoteViewModel.java
new file mode 100644
index 0000000..80e45d8
--- /dev/null
+++ b/src/com/android/contacts/views/editor/viewModel/NoteViewModel.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * 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.views.editor.viewModel;
+
+import com.android.contacts.views.editor.DisplayRawContact;
+
+import android.content.ContentValues;
+import android.content.Context;
+import android.provider.ContactsContract.CommonDataKinds.Note;
+
+public class NoteViewModel extends SingleFieldViewModel {
+    private NoteViewModel(Context context, DisplayRawContact rawContact, long dataId,
+            ContentValues contentValues, int titleResId) {
+        super(context, rawContact, dataId, contentValues, Note.CONTENT_ITEM_TYPE, titleResId,
+                Note.NOTE);
+    }
+
+    public static NoteViewModel createForExisting(Context context, DisplayRawContact rawContact,
+            long dataId, ContentValues contentValues, int titleResId) {
+        return new NoteViewModel(context, rawContact, dataId, contentValues, titleResId);
+    }
+}
diff --git a/src/com/android/contacts/views/editor/viewModel/OrganizationViewModel.java b/src/com/android/contacts/views/editor/viewModel/OrganizationViewModel.java
new file mode 100644
index 0000000..0f40532
--- /dev/null
+++ b/src/com/android/contacts/views/editor/viewModel/OrganizationViewModel.java
@@ -0,0 +1,146 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * 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.views.editor.viewModel;
+
+import com.android.contacts.views.editor.DisplayRawContact;
+import com.android.contacts.views.editor.view.OrganizationView;
+import com.android.contacts.views.editor.view.ViewTypes;
+
+import android.content.ContentValues;
+import android.content.Context;
+import android.content.ContentProviderOperation.Builder;
+import android.provider.ContactsContract.CommonDataKinds.Organization;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+public class OrganizationViewModel extends DataViewModel {
+    private static final String TAG = "OrganizationViewModel";
+
+    private final int mLabelResId;
+    private final String mCompanyFieldColumn;
+    private final String mTitleFieldColumn;
+    private final String mLabelColumn;
+    private final String mTypeColumn;
+
+    private OrganizationViewModel(Context context, DisplayRawContact rawContact,
+            long dataId, ContentValues contentValues, int labelResId) {
+        super(context, rawContact, dataId, contentValues, Organization.CONTENT_ITEM_TYPE);
+        mLabelResId = labelResId;
+
+        mCompanyFieldColumn = Organization.COMPANY;
+        mTitleFieldColumn = Organization.TITLE;
+        mTypeColumn = Organization.TYPE;
+        mLabelColumn = Organization.LABEL;
+    }
+
+    public static OrganizationViewModel createForExisting(Context context,
+            DisplayRawContact rawContact, long dataId, ContentValues contentValues,
+            int titleResId) {
+        return new OrganizationViewModel(context, rawContact, dataId, contentValues, titleResId);
+    }
+
+    @Override
+    public int getEntryType() {
+        return ViewTypes.ORGANIZATION;
+    }
+
+    @Override
+    public OrganizationView getView(LayoutInflater inflater, View convertView, ViewGroup parent) {
+        final OrganizationView result = convertView != null
+                ? (OrganizationView) convertView
+                : OrganizationView.inflate(inflater, parent, false);
+
+        result.setListener(mViewListener);
+        result.setLabelText(mLabelResId);
+        result.setFieldValues(getCompanyFieldValue(), getTitleFieldValue());
+        result.setTypeDisplayLabel(getTypeDisplayLabel());
+
+        return result;
+    }
+
+    @Override
+    protected void writeToBuilder(Builder builder, boolean isInsert) {
+        builder.withValue(mCompanyFieldColumn, getCompanyFieldValue());
+        builder.withValue(mTitleFieldColumn, getTitleFieldValue());
+        builder.withValue(mTypeColumn, getType());
+        builder.withValue(mLabelColumn, getLabel());
+    }
+
+    protected String getCompanyFieldValue() {
+        return getContentValues().getAsString(mCompanyFieldColumn);
+    }
+
+    protected String getTitleFieldValue() {
+        return getContentValues().getAsString(mTitleFieldColumn);
+    }
+
+    private void putCompanyFieldValue(String value) {
+        getContentValues().put(mCompanyFieldColumn, value);
+    }
+
+    private void putTitleFieldValue(String value) {
+        getContentValues().put(mTitleFieldColumn, value);
+    }
+
+    private int getType() {
+        return getContentValues().getAsInteger(mTypeColumn).intValue();
+    }
+
+    private void putType(int value) {
+        getContentValues().put(mTypeColumn, value);
+    }
+
+    private String getLabel() {
+        return getContentValues().getAsString(mLabelColumn);
+    }
+
+    private void putLabel(String value) {
+        getContentValues().put(mLabelColumn, value);
+    }
+
+    private CharSequence getTypeDisplayLabel() {
+        return Organization.getTypeLabel(getContext().getResources(), getType(), getLabel());
+    }
+
+    private OrganizationView.Listener mViewListener = new OrganizationView.Listener() {
+        public void onFocusLost(OrganizationView view) {
+            Log.v(TAG, "Received FocusLost. Checking for changes");
+            boolean hasChanged = false;
+
+            final String oldCompanyValue = getCompanyFieldValue();
+            final String newCompanyValue = view.getCompanyFieldValue().toString();
+            if (!TextUtils.equals(oldCompanyValue, newCompanyValue)) {
+                putCompanyFieldValue(newCompanyValue);
+                hasChanged = true;
+            }
+
+            final String oldTitleValue = getTitleFieldValue();
+            final String newTitleValue = view.getTitleFieldValue().toString();
+            if (!TextUtils.equals(oldTitleValue, newTitleValue)) {
+                putTitleFieldValue(newTitleValue);
+                hasChanged = true;
+            }
+            if (hasChanged) {
+                Log.v(TAG, "Found changes. Updating DB");
+                saveData();
+            }
+        }
+    };
+}
diff --git a/src/com/android/contacts/views/editor/viewModel/PhoneViewModel.java b/src/com/android/contacts/views/editor/viewModel/PhoneViewModel.java
index 496bf2a..9ea033b 100644
--- a/src/com/android/contacts/views/editor/viewModel/PhoneViewModel.java
+++ b/src/com/android/contacts/views/editor/viewModel/PhoneViewModel.java
@@ -25,8 +25,8 @@
 public class PhoneViewModel extends FieldAndTypeViewModel {
     private PhoneViewModel(Context context, DisplayRawContact rawContact, long dataId,
             ContentValues contentValues, int titleResId) {
-        super(context, rawContact, dataId, contentValues, titleResId, Phone.NUMBER, Phone.TYPE,
-                Phone.LABEL);
+        super(context, rawContact, dataId, contentValues, Phone.CONTENT_ITEM_TYPE, titleResId,
+                Phone.NUMBER, Phone.TYPE, Phone.LABEL);
     }
 
     public static PhoneViewModel createForExisting(Context context, DisplayRawContact rawContact,
diff --git a/src/com/android/contacts/views/editor/viewModel/PhotoViewModel.java b/src/com/android/contacts/views/editor/viewModel/PhotoViewModel.java
new file mode 100644
index 0000000..05adf57
--- /dev/null
+++ b/src/com/android/contacts/views/editor/viewModel/PhotoViewModel.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * 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.views.editor.viewModel;
+
+import com.android.contacts.views.editor.DisplayRawContact;
+import com.android.contacts.views.editor.view.PhotoView;
+import com.android.contacts.views.editor.view.ViewTypes;
+
+import android.content.ContentValues;
+import android.content.Context;
+import android.content.ContentProviderOperation.Builder;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.provider.ContactsContract.CommonDataKinds.Im;
+import android.provider.ContactsContract.CommonDataKinds.Photo;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+/**
+ * Editor for the contact photo.
+ */
+public class PhotoViewModel extends DataViewModel {
+    private PhotoViewModel(Context context, DisplayRawContact rawContact, long dataId,
+            ContentValues contentValues) {
+        super(context, rawContact, dataId, contentValues, Im.CONTENT_ITEM_TYPE);
+    }
+
+    public static PhotoViewModel createForExisting(Context context, DisplayRawContact rawContact,
+            long dataId, ContentValues contentValues) {
+        return new PhotoViewModel(context, rawContact, dataId, contentValues);
+    }
+
+    @Override
+    protected void writeToBuilder(Builder builder, boolean isInsert) {
+        // TODO
+    }
+
+    @Override
+    public int getEntryType() {
+        return ViewTypes.PHOTO;
+    }
+
+    @Override
+    public View getView(LayoutInflater inflater, View convertView, ViewGroup parent) {
+        final PhotoView result = convertView != null
+                ? (PhotoView) convertView
+                : PhotoView.inflate(inflater, parent, false);
+
+        final byte[] binaryData = getContentValues().getAsByteArray(Photo.PHOTO);
+
+        final Bitmap bitmap = binaryData != null
+                ? BitmapFactory.decodeByteArray(binaryData, 0, binaryData.length)
+                : null;
+        result.setPhoto(bitmap);
+        return result;
+    }
+}
diff --git a/src/com/android/contacts/views/editor/viewModel/SingleFieldViewModel.java b/src/com/android/contacts/views/editor/viewModel/SingleFieldViewModel.java
new file mode 100644
index 0000000..16a9769
--- /dev/null
+++ b/src/com/android/contacts/views/editor/viewModel/SingleFieldViewModel.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * 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.views.editor.viewModel;
+
+import com.android.contacts.views.editor.DisplayRawContact;
+import com.android.contacts.views.editor.view.SingleFieldView;
+import com.android.contacts.views.editor.view.ViewTypes;
+
+import android.content.ContentValues;
+import android.content.Context;
+import android.content.ContentProviderOperation.Builder;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+public abstract class SingleFieldViewModel extends DataViewModel {
+    private static final String TAG = "SingleFieldViewModel";
+
+    private final int mLabelResId;
+    private final String mFieldColumn;
+
+    protected SingleFieldViewModel(Context context, DisplayRawContact rawContact,
+            long dataId, ContentValues contentValues, String mimeType, int labelResId,
+            String fieldColumn) {
+        super(context, rawContact, dataId, contentValues, mimeType);
+        mLabelResId = labelResId;
+        mFieldColumn = fieldColumn;
+    }
+
+    @Override
+    public int getEntryType() {
+        return ViewTypes.SINGLE_FIELD;
+    }
+
+    @Override
+    public SingleFieldView getView(LayoutInflater inflater, View convertView, ViewGroup parent) {
+        final SingleFieldView result = convertView != null
+                ? (SingleFieldView) convertView
+                : SingleFieldView.inflate(inflater, parent, false);
+
+        result.setListener(mViewListener);
+        result.setLabelText(mLabelResId);
+        result.setFieldValue(getFieldValue());
+
+        return result;
+    }
+
+    @Override
+    protected void writeToBuilder(Builder builder, boolean isInsert) {
+        builder.withValue(mFieldColumn, getFieldValue());
+    }
+
+    protected String getFieldValue() {
+        return getContentValues().getAsString(mFieldColumn);
+    }
+
+    protected void putFieldValue(String value) {
+        getContentValues().put(mFieldColumn, value);
+    }
+
+    private SingleFieldView.Listener mViewListener = new SingleFieldView.Listener() {
+        public void onFocusLost(SingleFieldView view) {
+            Log.v(TAG, "Received FocusLost. Checking for changes");
+            boolean hasChanged = false;
+
+            final String oldValue = getFieldValue();
+            final String newValue = view.getFieldValue().toString();
+            if (!TextUtils.equals(oldValue, newValue)) {
+                putFieldValue(newValue);
+                hasChanged = true;
+            }
+            if (hasChanged) {
+                Log.v(TAG, "Found changes. Updating DB");
+                saveData();
+            }
+        }
+    };
+}
diff --git a/src/com/android/contacts/views/editor/viewModel/StructuredNameViewModel.java b/src/com/android/contacts/views/editor/viewModel/StructuredNameViewModel.java
new file mode 100644
index 0000000..269bc2a
--- /dev/null
+++ b/src/com/android/contacts/views/editor/viewModel/StructuredNameViewModel.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * 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.views.editor.viewModel;
+
+import com.android.contacts.views.editor.DisplayRawContact;
+import com.android.contacts.views.editor.view.SimpleOrStructuredView;
+import com.android.contacts.views.editor.view.ViewTypes;
+
+import android.content.ContentValues;
+import android.content.Context;
+import android.content.ContentProviderOperation.Builder;
+import android.provider.ContactsContract.CommonDataKinds.StructuredName;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+/**
+ * Editor for the StructuredName. Handles both the structured representation as well the
+ * single field display
+ */
+public class StructuredNameViewModel extends DataViewModel {
+    protected static final String TAG = "StructuredNameViewModel";
+    private final int mLabelResId;
+
+    private StructuredNameViewModel(Context context, DisplayRawContact rawContact, long dataId,
+            ContentValues contentValues, int labelResId) {
+        super(context, rawContact, dataId, contentValues, StructuredName.CONTENT_ITEM_TYPE);
+        mLabelResId = labelResId;
+    }
+
+    public static StructuredNameViewModel createForExisting(Context context, DisplayRawContact rawContact,
+            long dataId, ContentValues contentValues, int labelResId) {
+        return new StructuredNameViewModel(context, rawContact, dataId, contentValues, labelResId);
+    }
+
+    @Override
+    protected void writeToBuilder(Builder builder, boolean isInsert) {
+        // TODO: Handle both structured and unstructured inputs.
+        // if (structuredEntered()) {
+        // } else {
+        builder.withValue(StructuredName.DISPLAY_NAME, getDisplayName());
+        builder.withValue(StructuredName.GIVEN_NAME, null);
+        builder.withValue(StructuredName.FAMILY_NAME, null);
+        builder.withValue(StructuredName.PREFIX, null);
+        builder.withValue(StructuredName.MIDDLE_NAME, null);
+        builder.withValue(StructuredName.SUFFIX, null);
+        // }
+    }
+
+    @Override
+    public int getEntryType() {
+        return ViewTypes.SIMPLE_OR_STRUCTURED;
+    }
+
+    @Override
+    public View getView(LayoutInflater inflater, View convertView, ViewGroup parent) {
+        final SimpleOrStructuredView result = convertView != null
+                ? (SimpleOrStructuredView) convertView
+                : SimpleOrStructuredView.inflate(inflater, parent, false);
+
+        result.setListener(mViewListener);
+        result.setLabelText(mLabelResId);
+        result.setDisplayName(getDisplayName());
+
+        return result;
+    }
+
+    private String getDisplayName() {
+        return getContentValues().getAsString(StructuredName.DISPLAY_NAME);
+    }
+
+    private void putDisplayName(String value) {
+        getContentValues().put(StructuredName.DISPLAY_NAME, value);
+    }
+
+    private SimpleOrStructuredView.Listener mViewListener = new SimpleOrStructuredView.Listener() {
+        public void onFocusLost(SimpleOrStructuredView view) {
+            Log.v(TAG, "Received FocusLost. Checking for changes");
+            boolean hasChanged = false;
+
+            final String oldValue = getDisplayName();
+            final String newValue = view.getDisplayName().toString();
+            if (!TextUtils.equals(oldValue, newValue)) {
+                putDisplayName(newValue);
+                hasChanged = true;
+            }
+            if (hasChanged) {
+                Log.v(TAG, "Found changes. Updating DB");
+                saveData();
+            }
+        }
+
+        public void onStructuredEditorRequested(SimpleOrStructuredView view) {
+            // TODO
+        }
+    };
+}
diff --git a/src/com/android/contacts/views/editor/viewModel/StructuredPostalViewModel.java b/src/com/android/contacts/views/editor/viewModel/StructuredPostalViewModel.java
new file mode 100644
index 0000000..9f8fc46
--- /dev/null
+++ b/src/com/android/contacts/views/editor/viewModel/StructuredPostalViewModel.java
@@ -0,0 +1,122 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * 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.views.editor.viewModel;
+
+import com.android.contacts.views.editor.DisplayRawContact;
+import com.android.contacts.views.editor.view.SimpleOrStructuredView;
+import com.android.contacts.views.editor.view.ViewTypes;
+
+import android.content.ContentValues;
+import android.content.Context;
+import android.content.ContentProviderOperation.Builder;
+import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+/**
+ * Editor for the StructuredPostal. Handles both the structured representation as well the
+ * single field display
+ */
+public class StructuredPostalViewModel extends DataViewModel {
+    protected static final String TAG = "StructuredPostalViewModel";
+    private final int mLabelResId;
+
+    private StructuredPostalViewModel(Context context, DisplayRawContact rawContact, long dataId,
+            ContentValues contentValues, int labelResId) {
+        super(context, rawContact, dataId, contentValues, StructuredPostal.CONTENT_ITEM_TYPE);
+        mLabelResId = labelResId;
+    }
+
+    public static StructuredPostalViewModel createForExisting(Context context,
+            DisplayRawContact rawContact, long dataId, ContentValues contentValues,
+            int labelResId) {
+        return new StructuredPostalViewModel(context, rawContact, dataId, contentValues,
+                labelResId);
+    }
+
+    @Override
+    protected void writeToBuilder(Builder builder, boolean isInsert) {
+        // TODO: Writing the non-structured field works pretty badly as we
+        // currently can't parse it properly. This is also a problem when an address it taken
+        // from Maps
+
+        // TODO: Handle both structured and unstructured inputs.
+
+        // if (structuredEntered()) {
+        // } else {
+        builder.withValue(StructuredPostal.FORMATTED_ADDRESS, getFormattedAddress());
+        builder.withValue(StructuredPostal.STREET, null);
+        builder.withValue(StructuredPostal.POBOX, null);
+        builder.withValue(StructuredPostal.NEIGHBORHOOD, null);
+        builder.withValue(StructuredPostal.CITY, null);
+        builder.withValue(StructuredPostal.REGION, null);
+        builder.withValue(StructuredPostal.POSTCODE, null);
+        builder.withValue(StructuredPostal.COUNTRY, null);
+        // }
+    }
+
+    @Override
+    public int getEntryType() {
+        return ViewTypes.SIMPLE_OR_STRUCTURED;
+    }
+
+    @Override
+    public View getView(LayoutInflater inflater, View convertView, ViewGroup parent) {
+        final SimpleOrStructuredView result = convertView != null
+                ? (SimpleOrStructuredView) convertView
+                : SimpleOrStructuredView.inflate(inflater, parent, false);
+
+        result.setListener(mViewListener);
+        result.setLabelText(mLabelResId);
+        result.setDisplayName(getFormattedAddress());
+
+        return result;
+    }
+
+    private String getFormattedAddress() {
+        return getContentValues().getAsString(StructuredPostal.FORMATTED_ADDRESS);
+    }
+
+    private void putDisplayName(String value) {
+        getContentValues().put(StructuredPostal.FORMATTED_ADDRESS, value);
+    }
+
+    private SimpleOrStructuredView.Listener mViewListener = new SimpleOrStructuredView.Listener() {
+        public void onFocusLost(SimpleOrStructuredView view) {
+            Log.v(TAG, "Received FocusLost. Checking for changes");
+            boolean hasChanged = false;
+
+            final String oldValue = getFormattedAddress();
+            final String newValue = view.getDisplayName().toString();
+            if (!TextUtils.equals(oldValue, newValue)) {
+                putDisplayName(newValue);
+                hasChanged = true;
+            }
+            if (hasChanged) {
+                Log.v(TAG, "Found changes. Updating DB");
+                saveData();
+            }
+        }
+
+        public void onStructuredEditorRequested(SimpleOrStructuredView view) {
+            // TODO
+        }
+    };
+}
diff --git a/src/com/android/contacts/views/editor/viewModel/WebsiteViewModel.java b/src/com/android/contacts/views/editor/viewModel/WebsiteViewModel.java
new file mode 100644
index 0000000..5aabb29
--- /dev/null
+++ b/src/com/android/contacts/views/editor/viewModel/WebsiteViewModel.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * 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.views.editor.viewModel;
+
+import com.android.contacts.views.editor.DisplayRawContact;
+
+import android.content.ContentValues;
+import android.content.Context;
+import android.provider.ContactsContract.CommonDataKinds.Website;
+
+public class WebsiteViewModel extends SingleFieldViewModel {
+    private WebsiteViewModel(Context context, DisplayRawContact rawContact, long dataId,
+            ContentValues contentValues, int titleResId) {
+        super(context, rawContact, dataId, contentValues, Website.CONTENT_ITEM_TYPE, titleResId,
+                Website.URL);
+    }
+
+    public static WebsiteViewModel createForExisting(Context context, DisplayRawContact rawContact,
+            long dataId, ContentValues contentValues, int titleResId) {
+        return new WebsiteViewModel(context, rawContact, dataId, contentValues, titleResId);
+    }
+}
