diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 7817e3a..4ffe15e 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -167,6 +167,7 @@
         <activity android:name=".activities.ContactBrowserActivity"
             android:label="@string/contactsList"
             android:clearTaskOnLaunch="true"
+            android:theme="@style/ContactBrowserTheme"
         >
             <intent-filter>
                 <action android:name="com.android.contacts.action.LIST_DEFAULT" />
@@ -214,6 +215,7 @@
         <activity android:name=".activities.ContactSelectionActivity"
             android:label="@string/contactsList"
             android:clearTaskOnLaunch="true"
+            android:theme="@style/ContactPickerTheme"
         >
             <intent-filter>
                 <action android:name="android.intent.action.INSERT_OR_EDIT" />
@@ -272,7 +274,7 @@
         </activity>
 
         <!-- The contacts search/filter UI -->
-        <activity android:name="ContactsSearchActivity"
+        <activity android:name=".activities.ContactSearchActivity"
             android:theme="@style/ContactsSearchTheme"
             android:windowSoftInputMode="stateAlwaysVisible"
         >
@@ -286,7 +288,7 @@
 
         <!-- The contacts search/filter UI -->
         <activity-alias android:name="SearchResultsActivity"
-            android:targetActivity="ContactsSearchActivity"
+            android:targetActivity=".activities.ContactSearchActivity"
         >
             <intent-filter>
                 <action android:name="android.intent.action.SEARCH" />
diff --git a/res/layout/two_pane_activity.xml b/res/layout-xlarge/contact_browser.xml
similarity index 93%
rename from res/layout/two_pane_activity.xml
rename to res/layout-xlarge/contact_browser.xml
index 9676de0..18212d3 100644
--- a/res/layout/two_pane_activity.xml
+++ b/res/layout-xlarge/contact_browser.xml
@@ -20,14 +20,14 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent">
     <FrameLayout 
-        android:id="@+id/two_pane_list"
+        android:id="@+id/list_container"
         android:layout_width="0px"
         android:layout_height="match_parent"
         android:layout_weight="1" />
 
     <!--  Holder for detail- or editor-fragment. -->
     <FrameLayout
-        android:id="@+id/two_pane_right_view"
+        android:id="@+id/detail_container"
         android:layout_width="0px"
         android:layout_height="match_parent"
         android:layout_weight="1"
diff --git a/res/layout/contact_browser.xml b/res/layout/contact_browser.xml
new file mode 100644
index 0000000..0b4bb63
--- /dev/null
+++ b/res/layout/contact_browser.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/list_container"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+</FrameLayout>
diff --git a/res/values-xlarge/styles.xml b/res/values-xlarge/styles.xml
new file mode 100644
index 0000000..f514aad
--- /dev/null
+++ b/res/values-xlarge/styles.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<resources>
+    <style name="ContactBrowserTheme" parent="@android:Theme.WithActionBar">
+    </style>
+    <style name="ContactPickerTheme" parent="@android:Theme.Dialog">
+    </style>
+
+</resources>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 93ae91d..385cc53 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -104,4 +104,11 @@
     <style name="DummyAnimation">
         <item name="android:windowExitAnimation">@anim/dummy_animation</item>
     </style>
+    
+    <style name="ContactBrowserTheme" parent="@android:Theme">
+    </style>
+    
+    <style name="ContactPickerTheme" parent="@android:Theme">
+    </style>
+    
 </resources>
diff --git a/src/com/android/contacts/ContactsSearchActivity.java b/src/com/android/contacts/ContactsSearchActivity.java
deleted file mode 100644
index ef2fe25..0000000
--- a/src/com/android/contacts/ContactsSearchActivity.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.contacts;
-
-import com.android.contacts.activities.ContactBrowserActivity;
-
-public class ContactsSearchActivity extends ContactBrowserActivity {
-
-}
diff --git a/src/com/android/contacts/activities/ContactBrowserActivity.java b/src/com/android/contacts/activities/ContactBrowserActivity.java
index 1fe292a..40b5693 100644
--- a/src/com/android/contacts/activities/ContactBrowserActivity.java
+++ b/src/com/android/contacts/activities/ContactBrowserActivity.java
@@ -34,24 +34,19 @@
 import com.android.contacts.views.detail.ContactNoneFragment;
 import com.android.contacts.views.editor.ContactEditorFragment;
 import com.android.contacts.widget.ContextMenuAdapter;
-import com.android.contacts.widget.SearchEditText;
-import com.android.contacts.widget.SearchEditText.OnFilterTextListener;
 
 import android.app.ActionBar;
 import android.app.Activity;
 import android.app.Dialog;
 import android.app.Fragment;
-import android.app.FragmentTransaction;
 import android.content.ContentValues;
 import android.content.Intent;
-import android.content.res.Configuration;
 import android.net.Uri;
 import android.os.Bundle;
 import android.provider.ContactsContract;
 import android.provider.ContactsContract.Contacts;
 import android.provider.Settings;
 import android.text.TextUtils;
-import android.util.Log;
 import android.view.KeyEvent;
 import android.view.Menu;
 import android.view.MenuInflater;
@@ -102,12 +97,13 @@
     private boolean mSearchInitiated;
 
     private ContactsRequest mRequest;
-    private SearchEditText mSearchEditText;
 
-    private boolean mTwoPaneLayout;
+    private boolean mContactContentDisplayed;
     private NavigationBar mNavigationBar;
     private int mMode = -1;
 
+    private boolean mHasActionBar;
+
     public ContactBrowserActivity() {
         mIntentResolver = new ContactsIntentResolver(this);
     }
@@ -152,138 +148,101 @@
             return;
         }
 
-        // The user launched the config based front door, pick the right activity to go to
-        Configuration config = getResources().getConfiguration();
-        int screenLayoutSize = config.screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK;
-        mTwoPaneLayout = (screenLayoutSize == Configuration.SCREENLAYOUT_SIZE_XLARGE);
-        if (mTwoPaneLayout) {
-            configureTwoPaneLayout(savedState);
-        } else {
-            configureSinglePaneLayout();
-        }
-    }
-
-    private void configureSinglePaneLayout() {
         setTitle(mRequest.getActivityTitle());
+        setContentView(R.layout.contact_browser);
 
-        mListFragment = createListFragment(mRequest.getActionCode());
 
-        int listFragmentContainerId;
-        if (mRequest.isSearchMode()) {
-            setContentView(R.layout.contacts_search_content);
-            listFragmentContainerId = R.id.list_container;
-            mSearchEditText = (SearchEditText)findViewById(R.id.search_src_text);
-            mSearchEditText.setText(mRequest.getQueryString());
-            mSearchEditText.setOnFilterTextListener(new OnFilterTextListener() {
-                public void onFilterChange(String queryString) {
-                    mListFragment.setQueryString(queryString);
-                }
+        mHasActionBar = getWindow().hasFeature(Window.FEATURE_ACTION_BAR);
+        if (mHasActionBar) {
+            mNavigationBar = new NavigationBar(this);
+            mNavigationBar.onCreate(savedState, mRequest);
+            mNavigationBar.setListener(this);
 
-                public void onCancelSearch() {
-                    finish();
-                }
-            });
-        } else {
-            listFragmentContainerId = android.R.id.content;
+            ActionBar actionBar = getActionBar();
+            View navBarView = mNavigationBar.onCreateView(getLayoutInflater());
+            actionBar.setCustomNavigationMode(navBarView);
         }
 
-        FragmentTransaction transaction = openFragmentTransaction();
-        transaction.add(listFragmentContainerId, mListFragment);
-        transaction.commit();
-    }
-
-    private void configureTwoPaneLayout(Bundle savedState) {
-
-        // TODO: set the theme conditionally in AndroidManifest, once that feature is available
-        setTheme(android.R.style.Theme_WithActionBar);
-        requestWindowFeature(Window.FEATURE_ACTION_BAR);
-
-        setContentView(R.layout.two_pane_activity);
-
-        mNavigationBar = new NavigationBar(this);
-        mNavigationBar.onCreate(savedState, mRequest);
-        mNavigationBar.setListener(this);
-
-        ActionBar actionBar = getActionBar();
-        View navBarView = mNavigationBar.onCreateView(getLayoutInflater());
-        actionBar.setCustomNavigationMode(navBarView);
-
-        if (mListFragment == null) {
-            configureListFragment();
-        }
-
-        if (mEmptyFragment == null && mDetailFragment == null && mEditorFragment == null) {
-            setupContactDetailFragment(null);
-        }
-
-    }
-
-    @Override
-    public void onNavigationBarChange() {
         configureListFragment();
+
+        mContactContentDisplayed = findViewById(R.id.detail_container) != null;
+        if (mContactContentDisplayed) {
+            setupContactDetailFragment(mListFragment.getSelectedContactUri());
+        }
     }
 
     private void configureListFragment() {
-        int mode = mNavigationBar.getMode();
-        if (mode == NavigationBar.MODE_SEARCH
-                && TextUtils.isEmpty(mNavigationBar.getQueryString())) {
-            mode = mNavigationBar.getDefaultMode();
+        int mode = -1;
+        if (mHasActionBar) {
+            mode = mNavigationBar.getMode();
+            if (mode == NavigationBar.MODE_SEARCH
+                    && TextUtils.isEmpty(mNavigationBar.getQueryString())) {
+                mode = mNavigationBar.getDefaultMode();
+            }
+        } else {
+            int actionCode = mRequest.getActionCode();
+            if (actionCode == ContactsRequest.ACTION_FREQUENT ||
+                    actionCode == ContactsRequest.ACTION_STARRED ||
+                    actionCode == ContactsRequest.ACTION_STREQUENT) {
+                mode = NavigationBar.MODE_FAVORITES;
+            } else {
+                mode = NavigationBar.MODE_CONTACTS;
+            }
         }
 
-        if (mode == mMode) {
-            if (mode == NavigationBar.MODE_SEARCH) {
-                mListFragment.setQueryString(mNavigationBar.getQueryString());
-            }
-            return;
-        }
-
-        closeListFragment();
-
-        mMode = mode;
-        switch (mMode) {
-            case NavigationBar.MODE_CONTACTS: {
-                mListFragment = createListFragment(ContactsRequest.ACTION_DEFAULT);
-                break;
-            }
-            case NavigationBar.MODE_FAVORITES: {
-                int favoritesAction = mRequest.getActionCode();
-                if (favoritesAction == ContactsRequest.ACTION_DEFAULT) {
-                    favoritesAction = ContactsRequest.ACTION_STREQUENT;
+        boolean replaceList = (mode != mMode);
+        if (replaceList) {
+            closeListFragment();
+            mMode = mode;
+            switch (mMode) {
+                case NavigationBar.MODE_CONTACTS: {
+                    mListFragment = createListFragment(ContactsRequest.ACTION_DEFAULT);
+                    break;
                 }
-                mListFragment = createListFragment(favoritesAction);
-                break;
-            }
-            case NavigationBar.MODE_SEARCH: {
-                mListFragment = createContactSearchFragment();
-                break;
+                case NavigationBar.MODE_FAVORITES: {
+                    int favoritesAction = mRequest.getActionCode();
+                    if (favoritesAction == ContactsRequest.ACTION_DEFAULT) {
+                        favoritesAction = ContactsRequest.ACTION_STREQUENT;
+                    }
+                    mListFragment = createListFragment(favoritesAction);
+                    break;
+                }
+                case NavigationBar.MODE_SEARCH: {
+                    mListFragment = createContactSearchFragment();
+                    break;
+                }
             }
         }
 
-        Bundle savedState = mNavigationBar.getSavedStateForMode(mMode);
-        if (savedState != null) {
-            mListFragment.restoreSavedState(savedState);
-        }
-
-        if (mode == NavigationBar.MODE_SEARCH) {
+        if (mMode == NavigationBar.MODE_SEARCH) {
             mListFragment.setQueryString(mNavigationBar.getQueryString());
         }
 
-        setupContactDetailFragment(mListFragment.getSelectedContactUri());
+        if (mHasActionBar) {
+            Bundle savedStateForMode = mNavigationBar.getSavedStateForMode(mMode);
+            if (savedStateForMode != null) {
+                mListFragment.restoreSavedState(savedStateForMode);
+            }
+        }
 
-        openFragmentTransaction()
-                .replace(R.id.two_pane_list, mListFragment)
-                .commit();
+        if (replaceList) {
+            openFragmentTransaction()
+                    .replace(R.id.list_container, mListFragment)
+                    .commit();
+        }
     }
 
     private void closeListFragment() {
         if (mListFragment != null) {
             mListFragment.setOnContactListActionListener(null);
 
-            if (mNavigationBar != null) {
+            if (mHasActionBar) {
                 Bundle state = new Bundle();
                 mListFragment.onSaveInstanceState(state);
                 mNavigationBar.saveStateForMode(mMode, state);
             }
+
+            mListFragment = null;
         }
     }
 
@@ -317,14 +276,14 @@
 
             // Nothing showing yet? Create (this happens during Activity-Startup)
             openFragmentTransaction()
-                    .replace(R.id.two_pane_right_view, mDetailFragment)
+                    .replace(R.id.detail_container, mDetailFragment)
                     .commit();
         } else {
             closeDetailFragment();
 
             mEmptyFragment = new ContactNoneFragment();
             openFragmentTransaction()
-                    .replace(R.id.two_pane_right_view, mEmptyFragment)
+                    .replace(R.id.detail_container, mEmptyFragment)
                     .commit();
         }
     }
@@ -341,7 +300,7 @@
 
         // Nothing showing yet? Create (this happens during Activity-Startup)
         openFragmentTransaction()
-                .replace(R.id.two_pane_right_view, mEditorFragment)
+                .replace(R.id.detail_container, mEditorFragment)
                 .commit();
     }
 
@@ -370,11 +329,9 @@
     }
 
     @Override
-    protected void onResume() {
-        super.onResume();
-        if (!mTwoPaneLayout && mRequest.isSearchMode()) {
-            mSearchEditText.requestFocus();
-        }
+    public void onNavigationBarChange() {
+        configureListFragment();
+        setupContactDetailFragment(mListFragment.getSelectedContactUri());
     }
 
     @Override
@@ -402,7 +359,7 @@
                 fragment.setDirectorySearchEnabled(
                         mRequest.isSearchMode() && mRequest.isDirectorySearchEnabled());
                 fragment.setAizyEnabled(!mRequest.isSearchMode());
-                fragment.setSelectionVisible(mTwoPaneLayout);
+                fragment.setSelectionVisible(mContactContentDisplayed);
                 return fragment;
             }
 
@@ -415,7 +372,7 @@
                 fragment.setOnContactListActionListener(new ContactBrowserActionListener());
                 fragment.setFrequentlyContactedContactsIncluded(false);
                 fragment.setStarredContactsIncluded(true);
-                fragment.setSelectionVisible(mTwoPaneLayout);
+                fragment.setSelectionVisible(mContactContentDisplayed);
                 return fragment;
             }
 
@@ -424,7 +381,7 @@
                 fragment.setOnContactListActionListener(new ContactBrowserActionListener());
                 fragment.setFrequentlyContactedContactsIncluded(true);
                 fragment.setStarredContactsIncluded(false);
-                fragment.setSelectionVisible(mTwoPaneLayout);
+                fragment.setSelectionVisible(mContactContentDisplayed);
                 return fragment;
             }
 
@@ -433,7 +390,7 @@
                 fragment.setOnContactListActionListener(new ContactBrowserActionListener());
                 fragment.setFrequentlyContactedContactsIncluded(true);
                 fragment.setStarredContactsIncluded(true);
-                fragment.setSelectionVisible(mTwoPaneLayout);
+                fragment.setSelectionVisible(mContactContentDisplayed);
                 return fragment;
             }
 
@@ -457,7 +414,7 @@
 
     private final class ContactBrowserActionListener implements OnContactBrowserActionListener {
         public void onViewContactAction(Uri contactLookupUri) {
-            if (mTwoPaneLayout) {
+            if (mContactContentDisplayed) {
                 mListFragment.setSelectedContactUri(contactLookupUri);
                 setupContactDetailFragment(contactLookupUri);
             } else {
@@ -594,7 +551,7 @@
         super.onCreateOptionsMenu(menu);
 
         MenuInflater inflater = getMenuInflater();
-        if (mTwoPaneLayout) {
+        if (mContactContentDisplayed) {
             inflater.inflate(R.menu.actions, menu);
             return true;
         } else if (mRequest.getActionCode() == ContactsRequest.ACTION_DEFAULT ||
@@ -783,7 +740,7 @@
 
                 if (unicodeChar != 0) {
                     String query = new String(new int[]{ unicodeChar }, 0, 1);
-                    if (mTwoPaneLayout) {
+                    if (mContactContentDisplayed) {
                         if (mNavigationBar.getMode() != NavigationBar.MODE_SEARCH) {
                             mNavigationBar.setQueryString(query);
                             mNavigationBar.setMode(NavigationBar.MODE_SEARCH);
diff --git a/src/com/android/contacts/activities/ContactSearchActivity.java b/src/com/android/contacts/activities/ContactSearchActivity.java
new file mode 100644
index 0000000..327ccfa
--- /dev/null
+++ b/src/com/android/contacts/activities/ContactSearchActivity.java
@@ -0,0 +1,177 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.contacts.activities;
+
+import com.android.contacts.R;
+import com.android.contacts.interactions.ContactDeletionInteraction;
+import com.android.contacts.interactions.PhoneNumberInteraction;
+import com.android.contacts.list.ContactBrowseListContextMenuAdapter;
+import com.android.contacts.list.ContactBrowseListFragment;
+import com.android.contacts.list.ContactsIntentResolver;
+import com.android.contacts.list.ContactsRequest;
+import com.android.contacts.list.DefaultContactBrowseListFragment;
+import com.android.contacts.list.OnContactBrowserActionListener;
+import com.android.contacts.widget.SearchEditText;
+import com.android.contacts.widget.SearchEditText.OnFilterTextListener;
+
+import android.app.Activity;
+import android.content.ContentValues;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Bundle;
+import android.provider.ContactsContract.Contacts;
+
+public class ContactSearchActivity extends Activity {
+
+    private ContactsIntentResolver mIntentResolver;
+    private ContactsRequest mRequest;
+    private ContactBrowseListFragment mListFragment;
+    private PhoneNumberInteraction mPhoneNumberCallInteraction;
+    private PhoneNumberInteraction mSendTextMessageInteraction;
+    private ContactDeletionInteraction mContactDeletionInteraction;
+    private SearchEditText mSearchEditText;
+
+    public ContactSearchActivity() {
+        mIntentResolver = new ContactsIntentResolver(this);
+    }
+
+    @Override
+    protected void onCreate(Bundle savedState) {
+        super.onCreate(savedState);
+
+        // Extract relevant information from the intent
+        mRequest = mIntentResolver.resolveIntent(getIntent());
+        if (!mRequest.isValid()) {
+            setResult(RESULT_CANCELED);
+            finish();
+            return;
+        }
+
+        setTitle(mRequest.getActivityTitle());
+
+        setContentView(R.layout.contacts_search_content);
+
+        if (mListFragment == null) {
+            mListFragment = createContactSearchFragment();
+            openFragmentTransaction()
+                    .replace(R.id.list_container, mListFragment)
+                    .commit();
+        }
+
+        mSearchEditText = (SearchEditText)findViewById(R.id.search_src_text);
+        mSearchEditText.setText(mRequest.getQueryString());
+        mSearchEditText.setOnFilterTextListener(new OnFilterTextListener() {
+            public void onFilterChange(String queryString) {
+                mListFragment.setQueryString(queryString);
+            }
+
+            public void onCancelSearch() {
+                finish();
+            }
+        });
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        mSearchEditText.requestFocus();
+    }
+
+
+    private ContactBrowseListFragment createContactSearchFragment() {
+        DefaultContactBrowseListFragment fragment = new DefaultContactBrowseListFragment();
+        fragment.setOnContactListActionListener(new ContactBrowserActionListener());
+        fragment.setDisplayWithPhonesOnlyOption(ContactsRequest.DISPLAY_ONLY_WITH_PHONES_DISABLED);
+        fragment.setVisibleContactsRestrictionEnabled(true);
+        fragment.setContextMenuAdapter(new ContactBrowseListContextMenuAdapter(fragment));
+        fragment.setSearchMode(true);
+        fragment.setDirectorySearchEnabled(true);
+        fragment.setAizyEnabled(false);
+        fragment.setSelectionVisible(true);
+        fragment.setEditMode(mRequest.getActionCode() ==
+                ContactsRequest.ACTION_INSERT_OR_EDIT_CONTACT);
+        return fragment;
+    }
+
+    private final class ContactBrowserActionListener implements OnContactBrowserActionListener {
+        public void onViewContactAction(Uri contactLookupUri) {
+            startActivity(new Intent(Intent.ACTION_VIEW, contactLookupUri));
+        }
+
+        public void onCreateNewContactAction() {
+        }
+
+        public void onEditContactAction(Uri contactLookupUri) {
+            Intent intent = new Intent(Intent.ACTION_EDIT, contactLookupUri);
+            Bundle extras = getIntent().getExtras();
+            if (extras != null) {
+                intent.putExtras(extras);
+            }
+            startActivity(intent);
+        }
+
+        public void onAddToFavoritesAction(Uri contactUri) {
+            ContentValues values = new ContentValues(1);
+            values.put(Contacts.STARRED, 1);
+            getContentResolver().update(contactUri, values, null, null);
+        }
+
+        public void onRemoveFromFavoritesAction(Uri contactUri) {
+            ContentValues values = new ContentValues(1);
+            values.put(Contacts.STARRED, 0);
+            getContentResolver().update(contactUri, values, null, null);
+        }
+
+        public void onCallContactAction(Uri contactUri) {
+            getPhoneNumberCallInteraction().startInteraction(contactUri);
+        }
+
+        public void onSmsContactAction(Uri contactUri) {
+            getSendTextMessageInteraction().startInteraction(contactUri);
+        }
+
+        public void onDeleteContactAction(Uri contactUri) {
+            getContactDeletionInteraction().deleteContact(contactUri);
+        }
+
+        public void onFinishAction() {
+            onBackPressed();
+        }
+    }
+
+    private PhoneNumberInteraction getPhoneNumberCallInteraction() {
+        if (mPhoneNumberCallInteraction == null) {
+            mPhoneNumberCallInteraction = new PhoneNumberInteraction(this, false, null);
+        }
+        return mPhoneNumberCallInteraction;
+    }
+
+    private PhoneNumberInteraction getSendTextMessageInteraction() {
+        if (mSendTextMessageInteraction == null) {
+            mSendTextMessageInteraction = new PhoneNumberInteraction(this, true, null);
+        }
+        return mSendTextMessageInteraction;
+    }
+
+    private ContactDeletionInteraction getContactDeletionInteraction() {
+        if (mContactDeletionInteraction == null) {
+            mContactDeletionInteraction = new ContactDeletionInteraction();
+            mContactDeletionInteraction.attachToActivity(this);
+        }
+        return mContactDeletionInteraction;
+    }
+}
