diff --git a/res/menu-xlarge/actions.xml b/res/menu-xlarge/actions.xml
new file mode 100644
index 0000000..60788e0
--- /dev/null
+++ b/res/menu-xlarge/actions.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+    <item
+        android:id="@+id/menu_search"
+        android:showAsAction="always"
+        android:actionViewClass="android.widget.SearchView" />
+
+    <item
+        android:id="@+id/menu_add_contact"
+        android:icon="@drawable/ic_menu_add_contact_holo_light"
+        android:title="@string/menu_new_contact_action_bar"
+        android:showAsAction="withText|always" />
+
+    <item
+        android:id="@+id/menu_add_group"
+        android:icon="@drawable/ic_menu_display_all_holo_light"
+        android:title="@string/menu_new_contact_action_bar"
+        android:showAsAction="withText|always" />
+
+    <item
+        android:id="@+id/menu_contacts_filter"
+        android:icon="@drawable/ic_menu_settings_holo_light"
+        android:title="@string/menu_contacts_filter" />
+
+    <item
+        android:id="@+id/menu_settings"
+        android:icon="@drawable/ic_menu_settings_holo_light"
+        android:title="@string/menu_settings" />
+
+    <item
+        android:id="@+id/menu_accounts"
+        android:icon="@drawable/ic_menu_accounts_holo_light"
+        android:title="@string/menu_accounts" />
+
+    <item
+        android:id="@+id/menu_import_export"
+        android:icon="@drawable/ic_menu_import_export_holo_light"
+        android:title="@string/menu_import_export" />
+
+</menu>
diff --git a/res/menu/view.xml b/res/menu-xlarge/view_contact.xml
similarity index 100%
rename from res/menu/view.xml
rename to res/menu-xlarge/view_contact.xml
diff --git a/res/menu-xlarge/view_group.xml b/res/menu-xlarge/view_group.xml
new file mode 100644
index 0000000..8b0867b
--- /dev/null
+++ b/res/menu-xlarge/view_group.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+    <item
+        android:id="@+id/menu_edit_group"
+        android:icon="@drawable/ic_menu_compose_holo_light"
+        android:title="@string/menu_editGroup"
+        android:alphabeticShortcut="e"
+        android:showAsAction="always" />
+
+    <item
+        android:id="@+id/menu_rename_group"
+        android:icon="@drawable/ic_menu_settings_holo_light"
+        android:title="@string/menu_renameGroup" />
+
+    <item
+        android:id="@+id/menu_delete_group"
+        android:icon="@drawable/ic_menu_trash_holo_light"
+        android:title="@string/menu_deleteGroup" />
+</menu>
diff --git a/res/menu/actions.xml b/res/menu/actions.xml
index 083d352..98d36a5 100644
--- a/res/menu/actions.xml
+++ b/res/menu/actions.xml
@@ -20,8 +20,14 @@
         android:actionViewClass="android.widget.SearchView" />
 
     <item
-        android:id="@+id/menu_add"
-        android:showAsAction="always" />
+        android:id="@+id/menu_add_contact"
+        android:icon="@drawable/ic_menu_add_contact_holo_light"
+        android:title="@string/menu_new_contact_action_bar" />
+
+    <item
+        android:id="@+id/menu_add_group"
+        android:icon="@drawable/ic_menu_display_all_holo_light"
+        android:title="@string/menu_new_contact_action_bar" />
 
     <item
         android:id="@+id/menu_contacts_filter"
@@ -43,13 +49,4 @@
         android:icon="@drawable/ic_menu_import_export_holo_light"
         android:title="@string/menu_import_export" />
 
-    <item
-        android:id="@+id/menu_rename_group"
-        android:icon="@drawable/ic_menu_settings_holo_light"
-        android:title="@string/menu_renameGroup" />
-
-    <item
-        android:id="@+id/menu_delete_group"
-        android:icon="@drawable/ic_menu_trash_holo_light"
-        android:title="@string/menu_deleteGroup" />
 </menu>
diff --git a/res/menu/view_contact.xml b/res/menu/view_contact.xml
new file mode 100644
index 0000000..7cf17d6
--- /dev/null
+++ b/res/menu/view_contact.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+    <item
+        android:id="@+id/menu_edit"
+        android:icon="@drawable/ic_menu_compose_holo_light"
+        android:title="@string/menu_editContact"
+        android:alphabeticShortcut="e" />
+
+    <item
+        android:id="@+id/menu_share"
+        android:icon="@drawable/ic_menu_share_holo_light"
+        android:title="@string/menu_share"
+        android:alphabeticShortcut="s" />
+
+    <item
+        android:id="@+id/menu_options"
+        android:icon="@drawable/ic_menu_mark"
+        android:title="@string/menu_contactOptions" />
+
+    <item
+        android:id="@+id/menu_delete"
+        android:icon="@drawable/ic_menu_trash_holo_light"
+        android:title="@string/menu_deleteContact" />
+</menu>
diff --git a/res/menu/view_group.xml b/res/menu/view_group.xml
new file mode 100644
index 0000000..3ff6ac6
--- /dev/null
+++ b/res/menu/view_group.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+    <item
+        android:id="@+id/menu_edit_group"
+        android:icon="@drawable/ic_menu_compose_holo_light"
+        android:title="@string/menu_editGroup"
+        android:alphabeticShortcut="e" />
+
+    <item
+        android:id="@+id/menu_rename_group"
+        android:icon="@drawable/ic_menu_settings_holo_light"
+        android:title="@string/menu_renameGroup" />
+
+    <item
+        android:id="@+id/menu_delete_group"
+        android:icon="@drawable/ic_menu_trash_holo_light"
+        android:title="@string/menu_deleteGroup" />
+</menu>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 52facac..52eab2f 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -118,6 +118,9 @@
     <!-- Menu item that splits an item from the contact detail into a separate aggregate -->
     <string name="menu_splitAggregate">Separate</string>
 
+    <!-- Menu item that edits the currently selected group [CHAR LIMIT=30] -->
+    <string name="menu_editGroup">Edit group</string>
+
     <!-- Menu item that renames the currently selected group [CHAR LIMIT=30] -->
     <string name="menu_renameGroup">Rename group</string>
 
diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java
index 4b0f0e4..9e325cf 100644
--- a/src/com/android/contacts/activities/PeopleActivity.java
+++ b/src/com/android/contacts/activities/PeopleActivity.java
@@ -133,19 +133,22 @@
 
     private ContactListFilterController mContactListFilterController;
 
-    private View mAddContactImageView;
-
     private ContactsUnavailableFragment mContactsUnavailableFragment;
     private ProviderStatusLoader mProviderStatusLoader;
     private int mProviderStatus = -1;
 
     private boolean mOptionsMenuContactsAvailable;
-    private boolean mOptionsMenuGroupActionsEnabled;
 
     private DefaultContactBrowseListFragment mContactsFragment;
     private StrequentContactListFragment mFavoritesFragment;
     private GroupBrowseListFragment mGroupsFragment;
 
+    private enum TabState {
+        FAVORITES, CONTACTS, GROUPS
+    }
+
+    private TabState mSelectedTab;
+
     public PeopleActivity() {
         mIntentResolver = new ContactsIntentResolver(this);
         // TODO: Get rid of the ContactListFilterController class because there aren't any
@@ -190,17 +193,6 @@
     protected void onCreate(Bundle savedState) {
         super.onCreate(savedState);
 
-        mAddContactImageView = getLayoutInflater().inflate(
-                R.layout.add_contact_menu_item, null, false);
-        View item = mAddContactImageView.findViewById(R.id.menu_item);
-        item.setOnClickListener(new OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                final Intent intent = new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI);
-                startActivityForResult(intent, SUBACTIVITY_NEW_CONTACT);
-            }
-        });
-
         configureContentView(true, savedState);
     }
 
@@ -273,19 +265,19 @@
             Tab favoritesTab = actionBar.newTab();
             favoritesTab.setText(getString(R.string.strequentList));
             favoritesTab.setTabListener(new TabChangeListener(mFavoritesFragment,
-                    mContactDetailFragment));
+                    mContactDetailFragment, TabState.FAVORITES));
             actionBar.addTab(favoritesTab);
 
             Tab peopleTab = actionBar.newTab();
             peopleTab.setText(getString(R.string.people));
             peopleTab.setTabListener(new TabChangeListener(mContactsFragment,
-                    mContactDetailFragment));
+                    mContactDetailFragment, TabState.CONTACTS));
             actionBar.addTab(peopleTab);
 
             Tab groupsTab = actionBar.newTab();
             groupsTab.setText(getString(R.string.contactsGroupsLabel));
             groupsTab.setTabListener(new TabChangeListener(mGroupsFragment,
-                    mGroupDetailFragment));
+                    mGroupDetailFragment, TabState.GROUPS));
             actionBar.addTab(groupsTab);
             actionBar.setDisplayShowTitleEnabled(true);
 
@@ -293,7 +285,7 @@
             boolean showHomeIcon = a.getBoolean(R.styleable.ActionBarHomeIcon_show_home_icon, true);
             actionBar.setDisplayShowHomeEnabled(showHomeIcon);
 
-            invalidateOptionsMenu();
+            invalidateOptionsMenuIfNeeded();
         }
 
         configureFragments(savedState == null);
@@ -312,10 +304,12 @@
          * null for smaller screen sizes).
          */
         private final Fragment mDetailFragment;
+        private final TabState mTabState;
 
-        public TabChangeListener(Fragment listFragment, Fragment detailFragment) {
+        public TabChangeListener(Fragment listFragment, Fragment detailFragment, TabState state) {
             mBrowseListFragment = listFragment;
             mDetailFragment = detailFragment;
+            mTabState = state;
         }
 
         @Override
@@ -332,6 +326,8 @@
             if (mDetailFragment != null) {
                 ft.show(mDetailFragment);
             }
+            setSelectedTab(mTabState);
+            invalidateOptionsMenu();
         }
 
         @Override
@@ -339,6 +335,10 @@
         }
     }
 
+    private void setSelectedTab(TabState tab) {
+        mSelectedTab = tab;
+    }
+
     @Override
     protected void onPause() {
         if (mActionBarAdapter != null) {
@@ -346,7 +346,6 @@
         }
 
         mOptionsMenuContactsAvailable = false;
-        mOptionsMenuGroupActionsEnabled = false;
 
         mProviderStatus = -1;
         mProviderStatusLoader.setProviderStatusListener(null);
@@ -417,7 +416,7 @@
         configureContactListFragment();
         configureGroupListFragment();
 
-        invalidateOptionsMenu();
+        invalidateOptionsMenuIfNeeded();
     }
 
     @Override
@@ -428,7 +427,7 @@
 
         mListFragment.setFilter(mContactListFilterController.getFilter());
 
-        invalidateOptionsMenu();
+        invalidateOptionsMenuIfNeeded();
     }
 
     @Override
@@ -439,7 +438,7 @@
 
         mListFragment.setFilter(mContactListFilterController.getFilter());
 
-        invalidateOptionsMenu();
+        invalidateOptionsMenuIfNeeded();
     }
 
     @Override
@@ -450,10 +449,12 @@
 
     private void setupContactDetailFragment(final Uri contactLookupUri) {
         mContactDetailFragment.loadUri(contactLookupUri);
+        invalidateOptionsMenuIfNeeded();
     }
 
     private void setupGroupDetailFragment(Uri groupUri) {
         mGroupDetailFragment.loadGroup(groupUri);
+        invalidateOptionsMenuIfNeeded();
     }
 
     /**
@@ -463,22 +464,44 @@
     public void onAction(Action action) {
         switch (action) {
             case START_SEARCH_MODE:
-                // Bring the contact list fragment to the front.
+                // Bring the contact list fragment (and detail fragment if applicable) to the front
                 FragmentTransaction ft = getFragmentManager().beginTransaction();
                 ft.show(mContactsFragment);
+                if (mContactDetailFragment != null) ft.show(mContactDetailFragment);
                 ft.commit();
+                clearSearch();
                 break;
             case STOP_SEARCH_MODE:
+                // Refresh the fragments because search mode was using them to display search
+                // results.
+                clearSearch();
+
+                // If the last selected tab was not the "All contacts" tab, then hide these
+                // fragments because we need to show favorites or groups.
+                if (mSelectedTab != null && !mSelectedTab.equals(TabState.CONTACTS)) {
+                    FragmentTransaction transaction = getFragmentManager().beginTransaction();
+                    transaction.hide(mContactsFragment);
+                    if (mContactDetailFragment != null) transaction.hide(mContactDetailFragment);
+                    transaction.commit();
+                }
+                break;
             case CHANGE_SEARCH_QUERY:
-                // Refresh the contact list fragment.
-                configureFragments(false /* from request */);
-                mListFragment.setQueryString(mActionBarAdapter.getQueryString(), true);
+                loadSearch(mActionBarAdapter.getQueryString());
                 break;
             default:
                 throw new IllegalStateException("Unkonwn ActionBarAdapter action: " + action);
         }
     }
 
+    private void clearSearch() {
+        loadSearch("");
+    }
+
+    private void loadSearch(String query) {
+        configureFragments(false /* from request */);
+        mListFragment.setQueryString(query, true);
+    }
+
     private void configureContactListFragmentForRequest() {
         Uri contactUri = mRequest.getContactUri();
         if (contactUri != null) {
@@ -564,7 +587,7 @@
             }
         }
 
-        invalidateOptionsMenu();
+        invalidateOptionsMenuIfNeeded();
     }
 
     private final class ContactBrowserActionListener implements OnContactBrowserActionListener {
@@ -789,18 +812,12 @@
                 mActionBarAdapter.setSearchView(searchView);
             }
         }
-
-        // TODO: Can remove this as a custom view because the account selector is in the editor now.
-        // Change add contact button to button with a custom view
-        final MenuItem addContact = menu.findItem(R.id.menu_add);
-        addContact.setActionView(mAddContactImageView);
         return true;
     }
 
-    @Override
-    public void invalidateOptionsMenu() {
+    private void invalidateOptionsMenuIfNeeded() {
         if (isOptionsMenuChanged()) {
-            super.invalidateOptionsMenu();
+            invalidateOptionsMenu();
         }
     }
 
@@ -809,10 +826,6 @@
             return true;
         }
 
-        if (mOptionsMenuGroupActionsEnabled != areGroupActionsEnabled()) {
-            return true;
-        }
-
         if (mListFragment != null && mListFragment.isOptionsMenuChanged()) {
             return true;
         }
@@ -821,6 +834,10 @@
             return true;
         }
 
+        if (mGroupDetailFragment != null && mGroupDetailFragment.isOptionsMenuChanged()) {
+            return true;
+        }
+
         return false;
     }
 
@@ -831,39 +848,36 @@
             return false;
         }
 
+        final MenuItem addContactMenu = menu.findItem(R.id.menu_add_contact);
+        final MenuItem addGroupMenu = menu.findItem(R.id.menu_add_group);
+
+        if (mActionBarAdapter.isSearchMode()) {
+            addContactMenu.setVisible(false);
+            addGroupMenu.setVisible(false);
+        } else {
+            switch (mSelectedTab) {
+                case FAVORITES:
+                    // TODO: Fall through until we determine what the menu items should be for
+                    // this tab
+                case CONTACTS:
+                    addContactMenu.setVisible(true);
+                    addGroupMenu.setVisible(false);
+                    break;
+                case GROUPS:
+                    addContactMenu.setVisible(false);
+                    addGroupMenu.setVisible(true);
+                    break;
+            }
+        }
+
         MenuItem settings = menu.findItem(R.id.menu_settings);
         if (settings != null) {
             settings.setVisible(!ContactsPreferenceActivity.isEmpty(this));
         }
 
-        mOptionsMenuGroupActionsEnabled = areGroupActionsEnabled();
-
-        MenuItem renameGroup = menu.findItem(R.id.menu_rename_group);
-        if (renameGroup != null) {
-            renameGroup.setVisible(mOptionsMenuGroupActionsEnabled);
-        }
-
-        MenuItem deleteGroup = menu.findItem(R.id.menu_delete_group);
-        if (deleteGroup != null) {
-            deleteGroup.setVisible(mOptionsMenuGroupActionsEnabled);
-        }
-
         return true;
     }
 
-    private boolean areGroupActionsEnabled() {
-        boolean groupActionsEnabled = false;
-        if (mListFragment != null) {
-            ContactListFilter filter = mListFragment.getFilter();
-            if (filter != null
-                    && filter.filterType == ContactListFilter.FILTER_TYPE_GROUP
-                    && !filter.groupReadOnly) {
-                groupActionsEnabled = true;
-            }
-        }
-        return groupActionsEnabled;
-    }
-
     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
         switch (item.getItemId()) {
@@ -881,11 +895,16 @@
                 onSearchRequested();
                 return true;
             }
-            case R.id.menu_add: {
+            case R.id.menu_add_contact: {
                 final Intent intent = new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI);
                 startActivityForResult(intent, SUBACTIVITY_NEW_CONTACT);
                 return true;
             }
+            case R.id.menu_add_group: {
+                // TODO: Hook up "new group" functionality
+                Toast.makeText(this, "NEW GROUP", Toast.LENGTH_SHORT).show();
+                return true;
+            }
             case R.id.menu_import_export: {
                 ImportExportDialogFragment.show(getFragmentManager());
                 return true;
@@ -899,18 +918,6 @@
                 startActivity(intent);
                 return true;
             }
-            case R.id.menu_rename_group: {
-                ContactListFilter filter = mListFragment.getFilter();
-                GroupRenamingDialogFragment.show(getFragmentManager(), filter.groupId,
-                        filter.title);
-                return true;
-            }
-            case R.id.menu_delete_group: {
-                ContactListFilter filter = mListFragment.getFilter();
-                GroupDeletionDialogFragment.show(getFragmentManager(), filter.groupId,
-                        filter.title);
-                return true;
-            }
         }
         return false;
     }
diff --git a/src/com/android/contacts/detail/ContactDetailFragment.java b/src/com/android/contacts/detail/ContactDetailFragment.java
index f3a4805..41ac0ad 100644
--- a/src/com/android/contacts/detail/ContactDetailFragment.java
+++ b/src/com/android/contacts/detail/ContactDetailFragment.java
@@ -1159,7 +1159,7 @@
 
     @Override
     public void onCreateOptionsMenu(Menu menu, final MenuInflater inflater) {
-        inflater.inflate(R.menu.view, menu);
+        inflater.inflate(R.menu.view_contact, menu);
     }
 
     public boolean isOptionsMenuChanged() {
diff --git a/src/com/android/contacts/group/GroupBrowseListAdapter.java b/src/com/android/contacts/group/GroupBrowseListAdapter.java
index b836ab9..f530186 100644
--- a/src/com/android/contacts/group/GroupBrowseListAdapter.java
+++ b/src/com/android/contacts/group/GroupBrowseListAdapter.java
@@ -185,7 +185,7 @@
 
         public static GroupListEntry createEntryForGroup(GroupMetaData groupMetaData) {
             if (groupMetaData == null) {
-                throw new IllegalStateException("Cannot create list entry for a hull group");
+                throw new IllegalStateException("Cannot create list entry for a null group");
             }
             return new GroupListEntry(ViewType.ITEM, null, 0, groupMetaData,
                     groupMetaData.getGroupId());
diff --git a/src/com/android/contacts/group/GroupDetailFragment.java b/src/com/android/contacts/group/GroupDetailFragment.java
index 8cffd05..8d049d5 100644
--- a/src/com/android/contacts/group/GroupDetailFragment.java
+++ b/src/com/android/contacts/group/GroupDetailFragment.java
@@ -17,23 +17,21 @@
 package com.android.contacts.group;
 
 import com.android.contacts.ContactPhotoManager;
-import com.android.contacts.GroupMetaData;
 import com.android.contacts.GroupMetaDataLoader;
 import com.android.contacts.R;
-import com.android.contacts.activities.GroupDetailActivity;
+import com.android.contacts.interactions.GroupDeletionDialogFragment;
+import com.android.contacts.interactions.GroupRenamingDialogFragment;
 import com.android.contacts.list.ContactListAdapter;
 import com.android.contacts.list.ContactListFilter;
 import com.android.contacts.list.DefaultContactListAdapter;
+import com.android.contacts.util.PhoneCapabilityTester;
 
-import android.accounts.Account;
 import android.app.Activity;
 import android.app.Fragment;
 import android.app.LoaderManager;
 import android.app.LoaderManager.LoaderCallbacks;
-import android.content.ContentValues;
 import android.content.Context;
 import android.content.CursorLoader;
-import android.content.Intent;
 import android.content.Loader;
 import android.database.Cursor;
 import android.net.Uri;
@@ -41,6 +39,9 @@
 import android.provider.ContactsContract;
 import android.provider.ContactsContract.Directory;
 import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.AbsListView;
@@ -49,8 +50,7 @@
 import android.widget.AdapterView.OnItemClickListener;
 import android.widget.ListView;
 import android.widget.TextView;
-
-import java.util.ArrayList;
+import android.widget.Toast;
 
 /**
  * Displays the details of a group and shows a list of actions possible for the group.
@@ -88,6 +88,9 @@
 
     private Uri mGroupUri;
     private long mGroupId;
+    private String mGroupName;
+
+    private boolean mOptionsMenuEditable;
 
     public GroupDetailFragment() {
     }
@@ -107,6 +110,7 @@
 
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedState) {
+        setHasOptionsMenu(true);
         mRootView = inflater.inflate(R.layout.group_detail_fragment, container, false);
         mGroupTitle = (TextView) mRootView.findViewById(R.id.group_title);
         mGroupSize = (TextView) mRootView.findViewById(R.id.group_size);
@@ -224,7 +228,8 @@
         cursor.moveToPosition(-1);
         if (cursor.moveToNext()) {
             mGroupId = cursor.getLong(GroupMetaDataLoader.GROUP_ID);
-            updateTitle(cursor.getString(GroupMetaDataLoader.TITLE));
+            mGroupName = cursor.getString(GroupMetaDataLoader.TITLE);
+            updateTitle(mGroupName);
         }
     }
 
@@ -257,4 +262,53 @@
             mPhotoManager.resume();
         }
     }
+
+    @Override
+    public void onCreateOptionsMenu(Menu menu, final MenuInflater inflater) {
+        inflater.inflate(R.menu.view_group, menu);
+    }
+
+    public boolean isOptionsMenuChanged() {
+        return mOptionsMenuEditable != isGroupEditable();
+    }
+
+    public boolean isGroupEditable() {
+        // TODO: This should check the group_is_read_only flag. Modify GroupMetaDataLoader.
+        // Bug: 4601729.
+        return mGroupUri != null;
+    }
+
+    @Override
+    public void onPrepareOptionsMenu(Menu menu) {
+        mOptionsMenuEditable = isGroupEditable();
+
+        final MenuItem editMenu = menu.findItem(R.id.menu_edit_group);
+        editMenu.setVisible(mOptionsMenuEditable);
+
+        final MenuItem renameMenu = menu.findItem(R.id.menu_rename_group);
+        renameMenu.setVisible(mOptionsMenuEditable);
+
+        final MenuItem deleteMenu = menu.findItem(R.id.menu_delete_group);
+        deleteMenu.setVisible(mOptionsMenuEditable);
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        switch (item.getItemId()) {
+            case R.id.menu_edit_group: {
+                // TODO: Open group editor
+                Toast.makeText(mContext, "EDIT GROUP", Toast.LENGTH_SHORT).show();
+                break;
+            }
+            case R.id.menu_rename_group: {
+                GroupRenamingDialogFragment.show(getFragmentManager(), mGroupId, mGroupName);
+                return true;
+            }
+            case R.id.menu_delete_group: {
+                GroupDeletionDialogFragment.show(getFragmentManager(), mGroupId, mGroupName);
+                return true;
+            }
+        }
+        return false;
+    }
 }
