diff --git a/res/layout/dialtacts_activity.xml b/res/layout/dialtacts_activity.xml
index 14a6b39..63ca3bd 100644
--- a/res/layout/dialtacts_activity.xml
+++ b/res/layout/dialtacts_activity.xml
@@ -14,26 +14,35 @@
      limitations under the License.
 -->
 
-<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@android:id/tabhost"
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="match_parent">
 
-    <LinearLayout
-        android:orientation="vertical"
+    <!-- Dialer --> -->
+    <fragment
+        class="com.android.contacts.dialpad.DialpadFragment"
+        android:id="@+id/dialpad_fragment"
         android:layout_width="match_parent"
-        android:layout_height="match_parent">
+        android:layout_height="match_parent" />
 
-        <TabWidget android:id="@android:id/tabs"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-        />
+    <!-- Call Log -->
+    <fragment
+        class="com.android.contacts.calllog.CallLogFragment"
+        android:id="@+id/call_log_fragment"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent" />
 
-        <FrameLayout android:id="@android:id/tabcontent"
-            android:layout_width="match_parent"
-            android:layout_height="0dip"
-            android:layout_weight="1"
-        />
-    </LinearLayout>
-</TabHost>
+    <!-- Contacts -->
+    <fragment
+        android:id="@+id/contacts_fragment"
+        class="com.android.contacts.list.DefaultContactBrowseListFragment"
+        android:layout_height="match_parent"
+        android:layout_width="match_parent" />
 
+    <!-- Favorites -->
+    <fragment
+        android:id="@+id/favorites_fragment"
+        class="com.android.contacts.list.DefaultContactBrowseListFragment"
+        android:layout_height="match_parent"
+        android:layout_width="match_parent" />
+</FrameLayout>
\ No newline at end of file
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 2c2f791..0582fd4 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -15,8 +15,27 @@
 -->
 <resources>
     <style name="DialtactsTheme" parent="android:Theme.Holo.Light">
-        <item name="android:windowNoTitle">true</item>
         <item name="android:windowContentOverlay">@null</item>
+        <item name="list_item_height">?android:attr/listPreferredItemHeight</item>
+        <item name="activated_background">@drawable/list_item_activated_background</item>
+        <item name="section_header_background">@drawable/list_title_holo</item>
+        <item name="list_section_header_height">32dip</item>
+        <item name="list_item_divider">@drawable/list_item_divider</item>
+        <item name="list_item_padding_top">4dip</item>
+        <item name="list_item_padding_right">11dip</item>
+        <item name="list_item_padding_bottom">4dip</item>
+        <item name="list_item_padding_left">4dip</item>
+        <item name="list_item_gap_between_image_and_text">8dip</item>
+        <item name="list_item_gap_between_label_and_data">5dip</item>
+        <item name="list_item_call_button_padding">14dip</item>
+        <item name="list_item_vertical_divider_margin">5dip</item>
+        <item name="list_item_presence_icon_margin">5dip</item>
+        <item name="list_item_photo_size">56dip</item>
+        <item name="list_item_prefix_highlight_color">#729a27</item>
+        <item name="list_item_header_text_indent">56dip</item>
+        <item name="list_item_header_text_color">?color/section_header_text_color</item>
+        <item name="list_item_header_text_size">14sp</item>
+        <item name="contact_filter_popup_width">320dip</item>
     </style>
 
     <style name="CallDetailActivityTheme" parent="android:Theme.Holo.Light">
diff --git a/src/com/android/contacts/activities/ContactBrowserActivity.java b/src/com/android/contacts/activities/ContactBrowserActivity.java
index 52d7b36..0672481 100644
--- a/src/com/android/contacts/activities/ContactBrowserActivity.java
+++ b/src/com/android/contacts/activities/ContactBrowserActivity.java
@@ -42,7 +42,6 @@
 import com.android.contacts.model.AccountTypeManager;
 import com.android.contacts.preference.ContactsPreferenceActivity;
 import com.android.contacts.util.AccountSelectionUtil;
-import com.android.contacts.util.AccountsListAdapter;
 import com.android.contacts.util.DialogManager;
 import com.android.contacts.widget.ContextMenuAdapter;
 
@@ -69,9 +68,6 @@
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.view.Window;
-import android.widget.AdapterView;
-import android.widget.AdapterView.OnItemClickListener;
-import android.widget.ListPopupWindow;
 import android.widget.Toast;
 
 import java.util.ArrayList;
@@ -88,9 +84,8 @@
     private static final String TAG = "ContactBrowserActivity";
 
     private static final int SUBACTIVITY_NEW_CONTACT = 2;
-    private static final int SUBACTIVITY_SETTINGS = 3;
-    private static final int SUBACTIVITY_EDIT_CONTACT = 4;
-    private static final int SUBACTIVITY_CUSTOMIZE_FILTER = 5;
+    private static final int SUBACTIVITY_EDIT_CONTACT = 3;
+    private static final int SUBACTIVITY_CUSTOMIZE_FILTER = 4;
 
     private static final String KEY_SEARCH_MODE = "searchMode";
 
@@ -725,7 +720,7 @@
         switch (item.getItemId()) {
             case R.id.menu_settings: {
                 final Intent intent = new Intent(this, ContactsPreferenceActivity.class);
-                startActivityForResult(intent, SUBACTIVITY_SETTINGS);
+                startActivity(intent);
                 return true;
             }
             case R.id.menu_search: {
@@ -836,9 +831,6 @@
                 break;
             }
 
-            case SUBACTIVITY_SETTINGS:
-                break;
-
             // TODO: Using the new startActivityWithResultFromFragment API this should not be needed
             // anymore
             case ContactEntryListFragment.ACTIVITY_REQUEST_CODE_PICKER:
diff --git a/src/com/android/contacts/activities/DialpadActivity.java b/src/com/android/contacts/activities/DialpadActivity.java
index a30460a..bb122df 100644
--- a/src/com/android/contacts/activities/DialpadActivity.java
+++ b/src/com/android/contacts/activities/DialpadActivity.java
@@ -108,31 +108,6 @@
     }
 
     @Override
-    public boolean onCreateOptionsMenu(Menu menu) {
-        super.onCreateOptionsMenu(menu);
-
-        // Nothing to do here; see DialpadFragment.onCreateOptionsMenu().
-        return true;
-    }
-
-    @Override
-    public boolean onPrepareOptionsMenu(Menu menu) {
-        // The DialpadFragment completely owns the options menu,
-        // so we don't add any items here.  We *do* however
-        // have to return false here if the DialpadFragment
-        // says there shouldn't be a menu at all.
-        if (!mFragment.allowOptionsMenu()) {
-            return false;
-        }
-
-        super.onPrepareOptionsMenu(menu);
-
-        // See DialpadFragment.onPrepareOptionsMenu() for the actual menu
-        // contents.
-        return true;
-    }
-
-    @Override
     public boolean onKeyDown(int keyCode, KeyEvent event) {
         switch (keyCode) {
             case KeyEvent.KEYCODE_CALL: {
diff --git a/src/com/android/contacts/activities/DialtactsActivity.java b/src/com/android/contacts/activities/DialtactsActivity.java
index 869ae2a..ae8f479 100644
--- a/src/com/android/contacts/activities/DialtactsActivity.java
+++ b/src/com/android/contacts/activities/DialtactsActivity.java
@@ -17,13 +17,26 @@
 package com.android.contacts.activities;
 
 import com.android.contacts.R;
-import com.android.contacts.activities.ContactsFrontDoor;
-import com.android.contacts.activities.ContactBrowserActivity;
-import com.android.contacts.activities.DialpadActivity;
+import com.android.contacts.calllog.CallLogFragment;
+import com.android.contacts.dialpad.DialpadFragment;
+import com.android.contacts.interactions.ImportExportInteraction;
+import com.android.contacts.list.ContactListFilter;
+import com.android.contacts.list.ContactsIntentResolver;
+import com.android.contacts.list.ContactsRequest;
+import com.android.contacts.list.DefaultContactBrowseListFragment;
+import com.android.contacts.list.DirectoryListLoader;
+import com.android.contacts.list.OnContactBrowserActionListener;
+import com.android.contacts.preference.ContactsPreferenceActivity;
 import com.android.internal.telephony.ITelephony;
 
+import android.app.ActionBar;
+import android.app.ActionBar.Tab;
+import android.app.ActionBar.TabListener;
 import android.app.Activity;
-import android.app.TabActivity;
+import android.app.Dialog;
+import android.app.Fragment;
+import android.app.FragmentManager;
+import android.app.FragmentTransaction;
 import android.content.Intent;
 import android.content.SharedPreferences;
 import android.net.Uri;
@@ -31,10 +44,14 @@
 import android.os.RemoteException;
 import android.os.ServiceManager;
 import android.provider.CallLog.Calls;
+import android.provider.ContactsContract;
+import android.provider.ContactsContract.Contacts;
+import android.provider.Settings;
 import android.provider.ContactsContract.Intents.UI;
 import android.util.Log;
-import android.view.Window;
-import android.widget.TabHost;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
 
 /**
  * The dialer activity that has one tab with the virtual 12key
@@ -43,7 +60,7 @@
  * embedded using intents.
  * The dialer tab's title is 'phone', a more common name (see strings.xml).
  */
-public class DialtactsActivity extends TabActivity implements TabHost.OnTabChangeListener {
+public class DialtactsActivity extends Activity {
     private static final String TAG = "DialtactsActivity";
 
     private static final int TAB_INDEX_DIALER = 0;
@@ -63,9 +80,13 @@
     private static final String PREF_LAST_MANUALLY_SELECTED_TAB = "last_manually_selected_tab";
     private static final int PREF_LAST_MANUALLY_SELECTED_TAB_DEFAULT = TAB_INDEX_DIALER;
 
-    private TabHost mTabHost;
     private String mFilterText;
     private Uri mDialUri;
+    private DialpadFragment mDialpadFragment;
+    private CallLogFragment mCallLogFragment;
+    private DefaultContactBrowseListFragment mContactsFragment;
+    private DefaultContactBrowseListFragment mFavoritesFragment;
+    private ImportExportInteraction mImportExportInteraction;
 
     /**
      * The index of the tab that has last been manually selected (the user clicked on a tab).
@@ -80,18 +101,34 @@
         final Intent intent = getIntent();
         fixIntent(intent);
 
-        requestWindowFeature(Window.FEATURE_NO_TITLE);
         setContentView(R.layout.dialtacts_activity);
 
-        mTabHost = getTabHost();
-        mTabHost.setOnTabChangedListener(this);
+        final FragmentManager fragmentManager = getFragmentManager();
+        mDialpadFragment = (DialpadFragment) fragmentManager
+                .findFragmentById(R.id.dialpad_fragment);
+        mCallLogFragment = (CallLogFragment) fragmentManager
+                .findFragmentById(R.id.call_log_fragment);
+        mContactsFragment = (DefaultContactBrowseListFragment) fragmentManager
+                .findFragmentById(R.id.contacts_fragment);
+        mFavoritesFragment = (DefaultContactBrowseListFragment) fragmentManager
+                .findFragmentById(R.id.favorites_fragment);
 
-        // Setup the tabs
-        setupDialerTab();
-        setupCallLogTab();
-        setupContactsTab();
-        setupFavoritesTab();
-        setupGroupsTab();
+        // Hide all tabs (the current tab will later be reshown once a tab is selected)
+        final FragmentTransaction transaction = fragmentManager.beginTransaction();
+        transaction.hide(mDialpadFragment);
+        transaction.hide(mCallLogFragment);
+        transaction.hide(mContactsFragment);
+        transaction.hide(mFavoritesFragment);
+        transaction.commit();
+
+        // Setup the ActionBar tabs (the order matches the tab-index contants TAB_INDEX_*)
+        setupDialer();
+        setupCallLog();
+        setupContacts();
+        setupFavorites();
+        getActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
+        getActionBar().setDisplayShowTitleEnabled(false);
+        getActionBar().setDisplayShowHomeEnabled(false);
 
         // Load the last manually loaded tab
         final SharedPreferences prefs = getSharedPreferences(PREFS_DIALTACTS, MODE_PRIVATE);
@@ -110,7 +147,7 @@
     protected void onPause() {
         super.onPause();
 
-        final int currentTabIndex = mTabHost.getCurrentTab();
+        final int currentTabIndex = getActionBar().getSelectedTab().getPosition();
         final SharedPreferences.Editor editor =
                 getSharedPreferences(PREFS_DIALTACTS, MODE_PRIVATE).edit();
         if (currentTabIndex == TAB_INDEX_CONTACTS || currentTabIndex == TAB_INDEX_FAVORITES) {
@@ -132,57 +169,73 @@
         }
     }
 
-    private void setupCallLogTab() {
-        // Force the class since overriding tab entries doesn't work
-        Intent intent = new Intent("com.android.phone.action.RECENT_CALLS");
-        intent.setClass(this, CallLogActivity.class);
-
-        mTabHost.addTab(mTabHost.newTabSpec("call_log")
-                .setIndicator(getString(R.string.recentCallsIconLabel),
-                        getResources().getDrawable(R.drawable.ic_tab_recent))
-                .setContent(intent));
+    private void setupDialer() {
+        final Tab tab = getActionBar().newTab();
+        tab.setText(R.string.dialerIconLabel);
+        tab.setTabListener(new TabChangeListener(mDialpadFragment));
+        tab.setIcon(R.drawable.ic_tab_dialer);
+        getActionBar().addTab(tab);
+        mDialpadFragment.resolveIntent();
     }
 
-    private void setupDialerTab() {
-        Intent intent = new Intent("com.android.phone.action.TOUCH_DIALER");
-        intent.setClass(this, DialpadActivity.class);
-
-        mTabHost.addTab(mTabHost.newTabSpec("dialer")
-                .setIndicator(getString(R.string.dialerIconLabel),
-                        getResources().getDrawable(R.drawable.ic_tab_dialer))
-                .setContent(intent));
+    private void setupCallLog() {
+        final Tab tab = getActionBar().newTab();
+        tab.setText(R.string.recentCallsIconLabel);
+        tab.setIcon(R.drawable.ic_tab_recent);
+        tab.setTabListener(new TabChangeListener(mCallLogFragment));
+        getActionBar().addTab(tab);
     }
 
-    private void setupContactsTab() {
+    private void setupContacts() {
+        final Tab tab = getActionBar().newTab();
+        tab.setText(R.string.contactsIconLabel);
+        tab.setIcon(R.drawable.ic_tab_contacts);
+        tab.setTabListener(new TabChangeListener(mContactsFragment));
+        getActionBar().addTab(tab);
+
+        // TODO: We should not artificially create Intents and put them into the Fragment.
+        // It would be nicer to directly pass in the UI constant
         Intent intent = new Intent(UI.LIST_ALL_CONTACTS_ACTION);
         intent.setClass(this, ContactBrowserActivity.class);
 
-        mTabHost.addTab(mTabHost.newTabSpec("contacts")
-                .setIndicator(getText(R.string.contactsIconLabel),
-                        getResources().getDrawable(R.drawable.ic_tab_contacts))
-                .setContent(intent));
+        ContactsIntentResolver resolver = new ContactsIntentResolver(this);
+        ContactsRequest request = resolver.resolveIntent(intent);
+        final ContactListFilter filter = new ContactListFilter(
+                ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS);
+        mContactsFragment.setFilter(filter, false);
+        mContactsFragment.setSearchMode(request.isSearchMode());
+        mContactsFragment.setQueryString(request.getQueryString(), false);
+        mContactsFragment.setContactsRequest(request);
+        mContactsFragment.setDirectorySearchMode(request.isDirectorySearchEnabled()
+                ? DirectoryListLoader.SEARCH_MODE_DEFAULT
+                : DirectoryListLoader.SEARCH_MODE_NONE);
+        mContactsFragment.setOnContactListActionListener(mListFragmentListener);
     }
 
-    private void setupFavoritesTab() {
+    private void setupFavorites() {
+        final Tab tab = getActionBar().newTab();
+        tab.setText(R.string.contactsFavoritesLabel);
+        tab.setIcon(R.drawable.ic_tab_starred);
+        tab.setTabListener(new TabChangeListener(mFavoritesFragment));
+        getActionBar().addTab(tab);
+
+        // TODO: We should not artificially create Intents and put them into the Fragment.
+        // It would be nicer to directly pass in the UI constant
         Intent intent = new Intent(UI.LIST_STREQUENT_ACTION);
         intent.setClass(this, ContactBrowserActivity.class);
 
-        mTabHost.addTab(mTabHost.newTabSpec("favorites")
-                .setIndicator(getString(R.string.contactsFavoritesLabel),
-                        getResources().getDrawable(R.drawable.ic_tab_starred))
-                .setContent(intent));
-    }
-
-    private void setupGroupsTab() {
-        // This is a temporary intent action until the refactoring for the phone/contacts
-        // split is complete.
-        Intent intent = new Intent("com.android.phone.action.GROUPS_LIST");
-                        intent.setClass(this, GroupBrowserActivity.class);
-
-        mTabHost.addTab(mTabHost.newTabSpec("groups")
-                .setIndicator(getString(R.string.contactsGroupsLabel),
-                        getResources().getDrawable(R.drawable.ic_menu_display_all_holo_light))
-                .setContent(intent));
+        ContactsIntentResolver resolver = new ContactsIntentResolver(this);
+        ContactsRequest request = resolver.resolveIntent(intent);
+        final ContactListFilter filter = new ContactListFilter(
+                ContactListFilter.FILTER_TYPE_STARRED);
+        mFavoritesFragment.setFilter(filter, false);
+        mFavoritesFragment.setSearchMode(request.isSearchMode());
+        mFavoritesFragment.setQueryString(request.getQueryString(), false);
+        mFavoritesFragment.setContactsRequest(request);
+        mFavoritesFragment.setDirectorySearchMode(request.isDirectorySearchEnabled()
+                ? DirectoryListLoader.SEARCH_MODE_DEFAULT
+                : DirectoryListLoader.SEARCH_MODE_NONE);
+        mFavoritesFragment.setOnContactListActionListener(mListFragmentListener);
     }
 
     /**
@@ -223,13 +276,6 @@
             return;
         }
 
-        // Dismiss menu provided by any children activities
-        Activity activity = getLocalActivityManager().
-                getActivity(mTabHost.getCurrentTabTag());
-        if (activity != null) {
-            activity.closeOptionsMenu();
-        }
-
         // Tell the children activities that they should ignore any possible saved
         // state and instead reload their state from the parent's intent
         intent.putExtra(EXTRA_IGNORE_STATE, true);
@@ -246,21 +292,21 @@
             boolean favoritesAsContacts = prefs.getBoolean(PREF_FAVORITES_AS_CONTACTS,
                     PREF_FAVORITES_AS_CONTACTS_DEFAULT);
             if (favoritesAsContacts) {
-                mTabHost.setCurrentTab(TAB_INDEX_FAVORITES);
+                getActionBar().selectTab(getActionBar().getTabAt(TAB_INDEX_FAVORITES));
             } else {
-                mTabHost.setCurrentTab(TAB_INDEX_CONTACTS);
+                getActionBar().selectTab(getActionBar().getTabAt(TAB_INDEX_CONTACTS));
             }
         } else {
             // Not launched through the front door, look at the component to determine the tab
             String componentName = intent.getComponent().getClassName();
             if (getClass().getName().equals(componentName)) {
                 if (recentCallsRequest) {
-                    mTabHost.setCurrentTab(TAB_INDEX_CALL_LOG);
+                    getActionBar().selectTab(getActionBar().getTabAt(TAB_INDEX_CALL_LOG));
                 } else {
-                    mTabHost.setCurrentTab(TAB_INDEX_DIALER);
+                    getActionBar().selectTab(getActionBar().getTabAt(TAB_INDEX_DIALER));
                 }
             } else {
-                mTabHost.setCurrentTab(mLastManuallySelectedTab);
+                getActionBar().selectTab(getActionBar().getTabAt(mLastManuallySelectedTab));
             }
         }
 
@@ -371,19 +417,158 @@
         }
     }
 
-    /** {@inheritDoc} */
-    public void onTabChanged(String tabId) {
-        // Because we're using Activities as our tab children, we trigger
-        // onWindowFocusChanged() to let them know when they're active.  This may
-        // seem to duplicate the purpose of onResume(), but it's needed because
-        // onResume() can't reliably check if a keyguard is active.
-        Activity activity = getLocalActivityManager().getActivity(tabId);
-        if (activity != null) {
-            activity.onWindowFocusChanged(true);
+    @Override
+    protected void onPostCreate(Bundle savedInstanceState) {
+        super.onPostCreate(savedInstanceState);
+
+        // Pass this lifecycle event down to the fragment
+        mDialpadFragment.onPostCreate();
+    }
+
+    /**
+     * Tab change listener that is instantiated once for each tab. Handles showing/hiding tabs
+     * and remembers manual tab selections
+     */
+    private class TabChangeListener implements TabListener {
+        private final Fragment mFragment;
+
+        public TabChangeListener(Fragment fragment) {
+            mFragment = fragment;
         }
 
-        // Remember this tab index. This function is also called, if the tab is set automatically
-        // in which case the setter (setCurrentTab) has to set this to its old value afterwards
-        mLastManuallySelectedTab = mTabHost.getCurrentTab();
+        @Override
+        public void onTabUnselected(Tab tab, FragmentTransaction ft) {
+            ft.hide(mFragment);
+        }
+
+        @Override
+        public void onTabSelected(Tab tab, FragmentTransaction ft) {
+            ft.show(mFragment);
+
+            // Remember this tab index. This function is also called, if the tab is set
+            // automatically in which case the setter (setCurrentTab) has to set this to its old
+            // value afterwards
+            mLastManuallySelectedTab = tab.getPosition();
+        }
+
+        @Override
+        public void onTabReselected(Tab tab, FragmentTransaction ft) {
+        }
+    }
+
+    private OnContactBrowserActionListener mListFragmentListener =
+            new OnContactBrowserActionListener() {
+        @Override
+        public void onViewContactAction(Uri contactLookupUri) {
+            startActivity(new Intent(Intent.ACTION_VIEW, contactLookupUri));
+        }
+
+        @Override
+        public void onSmsContactAction(Uri contactUri) {
+        }
+
+        @Override
+        public void onSelectionChange() {
+        }
+
+        @Override
+        public void onRemoveFromFavoritesAction(Uri contactUri) {
+        }
+
+        @Override
+        public void onInvalidSelection() {
+        }
+
+        @Override
+        public void onFinishAction() {
+        }
+
+        @Override
+        public void onEditContactAction(Uri contactLookupUri) {
+        }
+
+        @Override
+        public void onDeleteContactAction(Uri contactUri) {
+        }
+
+        @Override
+        public void onCreateNewContactAction() {
+        }
+
+        @Override
+        public void onCallContactAction(Uri contactUri) {
+        }
+
+        @Override
+        public void onAddToFavoritesAction(Uri contactUri) {
+        }
+    };
+
+    @Override
+    public boolean onCreateOptionsMenu(Menu menu) {
+        // For now, create the menu in here. It would be nice to do this in the Fragment,
+        // but that Fragment is re-used in other views.
+        final ActionBar actionBar = getActionBar();
+        if (actionBar == null) return false;
+        final Tab tab = actionBar.getSelectedTab();
+        if (tab == null) return false;
+        final int tabIndex = tab.getPosition();
+        if (tabIndex != TAB_INDEX_CONTACTS && tabIndex != TAB_INDEX_FAVORITES) return false;
+
+        MenuInflater inflater = getMenuInflater();
+        inflater.inflate(R.menu.list, menu);
+        return true;
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        // This is currently a copy of the equivalent code of ContactBrowserActivity (with the
+        // exception of menu_add, because we do not select items in the list).
+        // Should be consolidated
+        switch (item.getItemId()) {
+        case R.id.menu_settings: {
+            final Intent intent = new Intent(this, ContactsPreferenceActivity.class);
+            startActivity(intent);
+            return true;
+        }
+        case R.id.menu_search: {
+            onSearchRequested();
+            return true;
+        }
+        case R.id.menu_add: {
+            final Intent intent = new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI);
+            startActivity(intent);
+            return true;
+        }
+        case R.id.menu_import_export: {
+            getImportExportInteraction().startInteraction();
+            return true;
+        }
+        case R.id.menu_accounts: {
+            final Intent intent = new Intent(Settings.ACTION_SYNC_SETTINGS);
+            intent.putExtra(Settings.EXTRA_AUTHORITIES, new String[] {
+                ContactsContract.AUTHORITY
+            });
+            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
+            startActivity(intent);
+            return true;
+        }
+        default:
+            return super.onOptionsItemSelected(item);
+        }
+    }
+
+    @Override
+    protected Dialog onCreateDialog(int id, Bundle bundle) {
+        Dialog dialog = getImportExportInteraction().onCreateDialog(id, bundle);
+        if (dialog != null) return dialog;
+        return super.onCreateDialog(id, bundle);
+    }
+
+    private ImportExportInteraction getImportExportInteraction() {
+        if (mImportExportInteraction == null) {
+            mImportExportInteraction = new ImportExportInteraction(this);
+        }
+        return mImportExportInteraction;
     }
 }
diff --git a/src/com/android/contacts/dialpad/DialpadFragment.java b/src/com/android/contacts/dialpad/DialpadFragment.java
index fc5fcd9..58ffb9e 100644
--- a/src/com/android/contacts/dialpad/DialpadFragment.java
+++ b/src/com/android/contacts/dialpad/DialpadFragment.java
@@ -516,17 +516,14 @@
                 .setIcon(R.drawable.ic_menu_wait);
     }
 
-    /** @return true if an options menu should be shown in our containing activity. */
-    public boolean allowOptionsMenu() {
-        // We never show a menu if the "choose dialpad" UI is up.
-        // Otherwise the menu is allowed (see onPrepareOptionsMenu() below.)
-        return (!dialpadChooserVisible());
-    }
-
     @Override
     public void onPrepareOptionsMenu(Menu menu) {
-        // Note that we won't show a menu at all if the "choose dialpad" UI is up.
-        // (See allowOptionsMenu() above, along with DialogActivity.onPrepareOptionsMenu().)
+        // If we have not been inflated yet, there is no menu
+        if (mDialpadChooser == null) return;
+
+        // We never show a menu if the "choose dialpad" UI is up.
+        // Otherwise the menu is allowed (see onPrepareOptionsMenu() below.)
+        if (!dialpadChooserVisible()) return;
 
         if (isDigitsEmpty()) {
             mAddToContactMenuItem.setVisible(false);
