diff --git a/src/com/android/contacts/BaseContactCardActivity.java b/src/com/android/contacts/BaseContactCardActivity.java
index 2aac1a2..bd62b8a 100644
--- a/src/com/android/contacts/BaseContactCardActivity.java
+++ b/src/com/android/contacts/BaseContactCardActivity.java
@@ -74,7 +74,7 @@
     protected static final int TAB_ACCOUNT_TYPE_COLUMN_INDEX = 2;
 
     protected static final String SELECTED_RAW_CONTACT_ID_KEY = "selectedRawContact";
-    protected long mSelectedRawContactId;
+    protected Long mSelectedRawContactId = null;
 
     private static final int TOKEN_TABS = 0;
 
@@ -231,31 +231,24 @@
     }
 
     protected void selectInitialTab() {
-        int selectedTabIndex = -1;
-        if (mSelectedRawContactId > 0) {
-            selectedTabIndex = getTabIndexForRawContactId(mSelectedRawContactId);
-        }
-        if (selectedTabIndex >= 0) {
-            mTabWidget.setCurrentTab(selectedTabIndex);
-        } else {
-            selectDefaultTab();
-        }
-    }
+        int selectedTabIndex = 0;
 
-    /**
-     * Makes the default tab selection. This is called after the tabs have been
-     * bound for the first time, and whenever a new intent is received. Override
-     * this method if you want to customize the default tab behavior.
-     */
-    protected void selectDefaultTab() {
-        // Select the first tab.
-        mTabWidget.setCurrentTab(0);
+        if (mSelectedRawContactId != null) {
+            selectedTabIndex = getTabIndexForRawContactId(mSelectedRawContactId);
+            if (selectedTabIndex == -1) {
+                // If there was no matching tab, just select the first;
+                selectedTabIndex = 0;
+            }
+        }
+
+        mTabWidget.setCurrentTab(selectedTabIndex);
+        onTabSelectionChanged(selectedTabIndex, false);
     }
 
     @Override
     public void onNewIntent(Intent newIntent) {
         setIntent(newIntent);
-        selectDefaultTab();
+        selectInitialTab();
         mUri = newIntent.getData();
     }
 
diff --git a/src/com/android/contacts/ViewContactActivity.java b/src/com/android/contacts/ViewContactActivity.java
index cd9802c..5efe5ca 100644
--- a/src/com/android/contacts/ViewContactActivity.java
+++ b/src/com/android/contacts/ViewContactActivity.java
@@ -200,9 +200,6 @@
         //TODO Read this value from a preference
         mShowSmsLinksForAllPhones = true;
 
-        //Select the all tab to start.
-        mSelectedRawContactId = ALL_CONTACTS_ID;
-
         mCursor = mResolver.query(Uri.withAppendedPath(mUri, "data"),
                 CONTACT_PROJECTION, null, null, null);
     }
@@ -305,9 +302,6 @@
 
     @Override
     public boolean onCreateOptionsMenu(Menu menu) {
-        menu.add(0, MENU_ITEM_EDIT, 0, R.string.menu_editContact)
-                .setIcon(android.R.drawable.ic_menu_edit)
-                .setAlphabeticShortcut('e');
         menu.add(0, MENU_ITEM_DELETE, 0, R.string.menu_deleteContact)
                 .setIcon(android.R.drawable.ic_menu_delete);
         menu.add(0, MENU_ITEM_SPLIT_AGGREGATE, 0, R.string.menu_splitAggregate)
@@ -333,6 +327,17 @@
             menu.removeItem(MENU_ITEM_SHOW_BARCODE);
         }
 
+        // Only show the edit option if we have a selected tab.
+        if (mSelectedRawContactId != null) {
+            if (menu.findItem(MENU_ITEM_EDIT) == null) {
+                menu.add(0, MENU_ITEM_EDIT, 0, R.string.menu_editContact)
+                    .setIcon(android.R.drawable.ic_menu_edit)
+                    .setAlphabeticShortcut('e');
+            }
+        } else {
+            menu.removeItem(MENU_ITEM_EDIT);
+        }
+
         boolean isAggregate = mRawContactIds.size() > 1;
         menu.findItem(MENU_ITEM_SPLIT_AGGREGATE).setEnabled(isAggregate);
         return true;
@@ -386,11 +391,15 @@
     public boolean onOptionsItemSelected(MenuItem item) {
         switch (item.getItemId()) {
             case MENU_ITEM_EDIT: {
-                final int tabIndex = mTabWidget.getCurrentTab();
-                long rawContactIdToEdit = getTabRawContactId(tabIndex);
+                Long rawContactIdToEdit = mSelectedRawContactId;
+                if (rawContactIdToEdit == null) {
+                    // This shouldn't be possible. We only show the edit option if
+                    // this value is non-null.
+                    break;
+                }
                 if (rawContactIdToEdit == ALL_CONTACTS_ID) {
                     // If the "all" tab is selected, edit the next tab.
-                    rawContactIdToEdit = getTabRawContactId(tabIndex + 1);
+                    rawContactIdToEdit = getTabRawContactId(mTabWidget.getCurrentTab() + 1);
                 }
                 Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI,
                         rawContactIdToEdit);
@@ -732,7 +741,8 @@
                 }
 
                 // This performs the tab filtering
-                if (mSelectedRawContactId != entry.contactId
+                if (mSelectedRawContactId != null
+                        && mSelectedRawContactId != entry.contactId
                         && mSelectedRawContactId != ALL_CONTACTS_ID) {
                     continue;
                 }
