diff --git a/src/com/android/contacts/ContactSaveService.java b/src/com/android/contacts/ContactSaveService.java
index 08eb1c7..b9fc949 100755
--- a/src/com/android/contacts/ContactSaveService.java
+++ b/src/com/android/contacts/ContactSaveService.java
@@ -46,6 +46,7 @@
 import android.provider.ContactsContract.RawContacts;
 import android.provider.ContactsContract.RawContactsEntity;
 import android.support.v4.os.ResultReceiver;
+import android.text.TextUtils;
 import android.util.Log;
 import android.widget.Toast;
 
@@ -777,10 +778,19 @@
     /**
      * Creates an intent that can be sent to this service to delete a group.
      */
-    public static Intent createGroupDeletionIntent(Context context, long groupId) {
+    public static Intent createGroupDeletionIntent(Context context, long groupId,
+            Class<? extends Activity> callbackActivity, String callbackAction) {
         Intent serviceIntent = new Intent(context, ContactSaveService.class);
         serviceIntent.setAction(ContactSaveService.ACTION_DELETE_GROUP);
         serviceIntent.putExtra(ContactSaveService.EXTRA_GROUP_ID, groupId);
+
+        // Callback intent will be invoked by the service once the group is updated
+        if (callbackActivity != null && !TextUtils.isEmpty(callbackAction)) {
+            final Intent callbackIntent = new Intent(context, callbackActivity);
+            callbackIntent.setAction(callbackAction);
+            serviceIntent.putExtra(ContactSaveService.EXTRA_CALLBACK_INTENT, callbackIntent);
+        }
+
         return serviceIntent;
     }
 
@@ -793,6 +803,13 @@
 
         getContentResolver().delete(
                 ContentUris.withAppendedId(Groups.CONTENT_URI, groupId), null, null);
+
+        final Intent callbackIntent = intent.getParcelableExtra(EXTRA_CALLBACK_INTENT);
+        if (callbackIntent != null) {
+            final Uri groupUri = ContentUris.withAppendedId(Groups.CONTENT_URI, groupId);
+            callbackIntent.setData(groupUri);
+            deliverCallback(callbackIntent);
+        }
     }
 
     /**
diff --git a/src/com/android/contacts/GroupListLoader.java b/src/com/android/contacts/GroupListLoader.java
index d43f561..fbb68db 100644
--- a/src/com/android/contacts/GroupListLoader.java
+++ b/src/com/android/contacts/GroupListLoader.java
@@ -28,6 +28,11 @@
  */
 public final class GroupListLoader extends CursorLoader {
 
+    public final static String DEFAULT_SELECTION =
+            Groups.ACCOUNT_TYPE + " NOT NULL AND " +
+                    Groups.ACCOUNT_NAME + " NOT NULL AND " + Groups.AUTO_ADD + "=0 AND " +
+                    Groups.FAVORITES + "=0 AND " + Groups.DELETED + "=0";
+
     private final static String[] COLUMNS = new String[] {
         Groups.ACCOUNT_NAME,
         Groups.ACCOUNT_TYPE,
@@ -50,11 +55,9 @@
         super(context,
                 GROUP_LIST_URI,
                 COLUMNS,
-                Groups.ACCOUNT_TYPE + " NOT NULL AND " +
-                        Groups.ACCOUNT_NAME + " NOT NULL AND " + Groups.AUTO_ADD + "=0 AND " +
-                        Groups.FAVORITES + "=0 AND " + Groups.DELETED + "=0",
+                DEFAULT_SELECTION,
                 null,
                 Groups.ACCOUNT_TYPE + ", " + Groups.ACCOUNT_NAME + ", " + Groups.DATA_SET + ", " +
-                Groups.TITLE + " COLLATE LOCALIZED ASC");
+                Groups.TITLE + " COLLATE NOCASE ASC");
     }
 }
diff --git a/src/com/android/contacts/GroupMetaDataLoader.java b/src/com/android/contacts/GroupMetaDataLoader.java
index 9bfcd42..ad9b0f9 100644
--- a/src/com/android/contacts/GroupMetaDataLoader.java
+++ b/src/com/android/contacts/GroupMetaDataLoader.java
@@ -49,8 +49,10 @@
     public final static int DELETED = 8;
 
     public GroupMetaDataLoader(Context context, Uri groupUri) {
-        super(context, ensureIsGroupUri(groupUri), COLUMNS, Groups.ACCOUNT_TYPE + " NOT NULL AND "
-                + Groups.ACCOUNT_NAME + " NOT NULL", null, Groups.TITLE + " COLLATE NOCASE");
+        super(context, ensureIsGroupUri(groupUri), COLUMNS,
+                Groups.ACCOUNT_TYPE + " NOT NULL AND " + Groups.ACCOUNT_NAME + " NOT NULL AND "
+                        + Groups.DELETED + "=0",
+                null, Groups.TITLE + " COLLATE NOCASE ASC");
     }
 
     /**
diff --git a/src/com/android/contacts/activities/GroupEditorActivity.java b/src/com/android/contacts/activities/GroupEditorActivity.java
index e316902..58c593e 100644
--- a/src/com/android/contacts/activities/GroupEditorActivity.java
+++ b/src/com/android/contacts/activities/GroupEditorActivity.java
@@ -31,7 +31,7 @@
 import com.android.contacts.quickcontact.QuickContactActivity;
 import com.android.contacts.util.DialogManager;
 
-// TODO(wjang): it longer works. will be deleted shortly
+// TODO(wjang): it no longer works. will be deleted shortly
 public class GroupEditorActivity extends ContactsActivity
         implements DialogManager.DialogShowingViewActivity {
 
diff --git a/src/com/android/contacts/activities/GroupMembersActivity.java b/src/com/android/contacts/activities/GroupMembersActivity.java
index 9b9e8b0..c8d2c19 100644
--- a/src/com/android/contacts/activities/GroupMembersActivity.java
+++ b/src/com/android/contacts/activities/GroupMembersActivity.java
@@ -65,7 +65,6 @@
 /**
  * Displays the members of a group and allows the user to edit it.
  */
-// TODO(wjang): rename it to GroupActivity since it does both display and edit now.
 public class GroupMembersActivity extends AppCompatContactsActivity implements
         ActionBarAdapter.Listener,
         MultiSelectContactsListFragment.OnCheckBoxListActionListener,
@@ -85,6 +84,7 @@
 
     private static final int LOADER_GROUP_MEMBERS = 0;
 
+    private static final String ACTION_DELETE_GROUP = "deleteGroup";
     private static final String ACTION_CREATE_GROUP = "createGroup";
     private static final String ACTION_UPDATE_GROUP = "updateGroup";
     private static final String ACTION_ADD_TO_GROUP = "addToGroup";
@@ -241,7 +241,11 @@
     protected void onNewIntent(Intent newIntent) {
         super.onNewIntent(newIntent);
 
-        if (isSaveAction(newIntent.getAction())) {
+        if (isDeleteAction(newIntent.getAction())) {
+            Toast.makeText(this, R.string.groupDeletedToast, Toast.LENGTH_SHORT).show();
+            setResult(RESULT_OK);
+            finish();
+        } else if (isSaveAction(newIntent.getAction())) {
             final Uri groupUri = newIntent.getData();
             if (groupUri == null) {
                 Toast.makeText(this, R.string.groupSavedErrorToast, Toast.LENGTH_SHORT).show();
@@ -269,6 +273,10 @@
         }
     }
 
+    private static boolean isDeleteAction(String action) {
+        return ACTION_DELETE_GROUP.equals(action);
+    }
+
     private static boolean isSaveAction(String action) {
         return ACTION_CREATE_GROUP.equals(action)
                 || ACTION_UPDATE_GROUP.equals(action)
@@ -306,7 +314,7 @@
         setVisible(menu, R.id.menu_add,
                 isGroupEditable &&!isSelectionMode && !isSearchMode);
 
-        setVisible(menu, R.id.menu_edit_group,
+        setVisible(menu, R.id.menu_rename_group,
                 isGroupEditable && !isSelectionMode && !isSearchMode);
 
         setVisible(menu, R.id.menu_delete_group,
@@ -338,27 +346,20 @@
                 }
                 return true;
             }
-            case R.id.menu_edit_group: {
+            case R.id.menu_rename_group: {
                 GroupNameEditDialogFragment.showUpdateDialog(
                         getFragmentManager(), TAG_GROUP_NAME_EDIT_DIALOG, mGroupMetadata.groupName);
                 return true;
             }
             case R.id.menu_delete_group: {
-                // TODO(wjang): add a Toast after deletion after deleting the editor fragment
-                GroupDeletionDialogFragment.show(getFragmentManager(), mGroupMetadata.groupId,
-                        mGroupMetadata.groupName, /* endActivity */ true);
+                deleteGroup();
                 return true;
             }
             case R.id.menu_remove_from_group: {
                 if (mMembersListFragment == null) {
                     return false;
                 }
-                final int count = mMembersListFragment.getAdapter().getCount();
-                final int numSelected =
-                        mMembersListFragment.getAdapter().getSelectedContactIdsArray().length;
-                Logger.logListEvent(ListEvent.ActionType.REMOVE_LABEL,
-                        mMembersListFragment.getListType(), count, /* clickedIndex */ -1,
-                        numSelected);
+                logListEvent();
                 removeSelectedContacts();
                 return true;
             }
@@ -366,13 +367,35 @@
         return super.onOptionsItemSelected(item);
     }
 
+    private void deleteGroup() {
+        if (mGroupMetadata.memberCount == 0) {
+            final Intent intent = ContactSaveService.createGroupDeletionIntent(
+                    this, mGroupMetadata.groupId,
+                    GroupMembersActivity.class, ACTION_DELETE_GROUP);
+            startService(intent);
+        } else {
+            GroupDeletionDialogFragment.show(getFragmentManager(), mGroupMetadata.groupId,
+                    mGroupMetadata.groupName, /* endActivity */ false, ACTION_DELETE_GROUP);
+        }
+    }
+
+    // TODO(wjang): replace this with group events
+    private void logListEvent() {
+        Logger.logListEvent(
+                ListEvent.ActionType.REMOVE_LABEL,
+                mMembersListFragment.getListType(),
+                mMembersListFragment.getAdapter().getCount(),
+                /* clickedIndex */ -1,
+                mMembersListFragment.getAdapter().getSelectedContactIdsArray().length);
+    }
+
     private void removeSelectedContacts() {
         final long[] rawContactsToRemove =
                 mMembersListFragment.getAdapter().getSelectedContactIdsArray();
         final Intent intent = ContactSaveService.createGroupUpdateIntent(
                 this, mGroupMetadata.groupId, /* groupName */ null,
                 /* rawContactsToAdd */ null, rawContactsToRemove, getClass(),
-                GroupMembersActivity.ACTION_REMOVE_FROM_GROUP);
+                ACTION_REMOVE_FROM_GROUP);
         startService(intent);
 
         mActionBarAdapter.setSelectionMode(false);
@@ -498,11 +521,11 @@
             saveIntent = ContactSaveService.createNewGroupIntent(this,
                     mGroupMetadata.createAccountWithDataSet(), groupName,
                     /* rawContactsToAdd */ null, GroupMembersActivity.class,
-                    GroupMembersActivity.ACTION_CREATE_GROUP);
+                    ACTION_CREATE_GROUP);
         } else {
             saveIntent = ContactSaveService.createGroupRenameIntent(this,
                     mGroupMetadata.groupId, groupName, GroupMembersActivity.class,
-                    GroupMembersActivity.ACTION_UPDATE_GROUP);
+                    ACTION_UPDATE_GROUP);
         }
         startService(saveIntent);
     }
@@ -548,7 +571,7 @@
                 final Intent intent = ContactSaveService.createGroupUpdateIntent(
                         GroupMembersActivity.this, mGroupMetadata.groupId, /* newLabel */ null,
                         rawContactIdsToAdd, /* rawContactIdsToRemove */ null,
-                        GroupMembersActivity.class, GroupMembersActivity.ACTION_ADD_TO_GROUP);
+                        GroupMembersActivity.class, ACTION_ADD_TO_GROUP);
                 startService(intent);
 
                 // Update the autocomplete adapter so the contact doesn't get suggested again
diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java
index 2b96f5a..2a5f8fb 100644
--- a/src/com/android/contacts/activities/PeopleActivity.java
+++ b/src/com/android/contacts/activities/PeopleActivity.java
@@ -928,7 +928,8 @@
                 final String title = groupListItem.getTitle();
                 final MenuItem menuItem =
                         subMenu.add(R.id.nav_groups_items, Menu.NONE, Menu.NONE, title);
-                menuItem.setIntent(GroupUtil.createViewGroupIntent(this, groupListItem.getGroupId()));
+                menuItem.setIntent(GroupUtil.createViewGroupIntent(
+                        this, groupListItem.getGroupId()));
                 menuItem.setIcon(R.drawable.ic_menu_label);
             }
         }
diff --git a/src/com/android/contacts/group/GroupBrowseListAdapter.java b/src/com/android/contacts/group/GroupBrowseListAdapter.java
index 71b235c..5fa8770 100644
--- a/src/com/android/contacts/group/GroupBrowseListAdapter.java
+++ b/src/com/android/contacts/group/GroupBrowseListAdapter.java
@@ -61,7 +61,7 @@
         if (mSelectedGroupUri == null && cursor != null && cursor.getCount() > 0) {
             GroupListItem firstItem = getItem(0);
             long groupId = (firstItem == null) ? 0 : firstItem.getGroupId();
-            mSelectedGroupUri = GroupUtil.getGroupUriFromId(groupId);
+            mSelectedGroupUri = ContentUris.withAppendedId(Groups.CONTENT_URI, groupId);
         }
 
         notifyDataSetChanged();
@@ -76,7 +76,7 @@
         mCursor.moveToPosition(-1);
         while (mCursor.moveToNext()) {
             long groupId = mCursor.getLong(GroupListLoader.GROUP_ID);
-            Uri uri = GroupUtil.getGroupUriFromId(groupId);
+            final Uri uri = ContentUris.withAppendedId(Groups.CONTENT_URI, groupId);
             if (mSelectedGroupUri.equals(uri)) {
                   return index;
             }
@@ -152,7 +152,7 @@
         }
 
         // Bind the group data
-        Uri groupUri = GroupUtil.getGroupUriFromId(entry.getGroupId());
+        final Uri groupUri = ContentUris.withAppendedId(Groups.CONTENT_URI, entry.getGroupId());
         String memberCountString = mContext.getResources().getQuantityString(
                 R.plurals.group_list_num_contacts_in_group, entry.getMemberCount(),
                 entry.getMemberCount());
diff --git a/src/com/android/contacts/group/GroupDetailFragment.java b/src/com/android/contacts/group/GroupDetailFragment.java
index c9cf6bd..b75b82e 100644
--- a/src/com/android/contacts/group/GroupDetailFragment.java
+++ b/src/com/android/contacts/group/GroupDetailFragment.java
@@ -449,7 +449,7 @@
         mOptionsMenuGroupDeletable = isGroupDeletable() && isVisible();
         mOptionsMenuGroupEditable = isGroupEditableAndPresent() && isVisible();
 
-        final MenuItem editMenu = menu.findItem(R.id.menu_edit_group);
+        final MenuItem editMenu = menu.findItem(R.id.menu_rename_group);
         editMenu.setVisible(mOptionsMenuGroupEditable);
 
         final MenuItem deleteMenu = menu.findItem(R.id.menu_delete_group);
@@ -459,7 +459,7 @@
     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
         switch (item.getItemId()) {
-            case R.id.menu_edit_group: {
+            case R.id.menu_rename_group: {
                 if (mListener != null) mListener.onEditRequested(mGroupUri);
                 break;
             }
diff --git a/src/com/android/contacts/group/GroupMembersListAdapter.java b/src/com/android/contacts/group/GroupMembersListAdapter.java
index 167c014..fe692e7 100644
--- a/src/com/android/contacts/group/GroupMembersListAdapter.java
+++ b/src/com/android/contacts/group/GroupMembersListAdapter.java
@@ -72,7 +72,6 @@
     public GroupMembersListAdapter(Context context) {
         super(context, GroupMembersQuery.RAW_CONTACT_ID);
         mUnknownNameText = context.getText(android.R.string.unknownName);
-        setIndexedPartition(0);
     }
 
     /** Sets the ID of the group whose members will be displayed. */
@@ -133,7 +132,6 @@
                 super.newView(context, partition, cursor, position, parent);
         view.setUnknownNameText(mUnknownNameText);
         view.setQuickContactEnabled(isQuickContactEnabled());
-        view.setIsSectionHeaderEnabled(isSectionHeaderDisplayEnabled());
         return view;
     }
 
@@ -141,22 +139,11 @@
     protected void bindView(View v, int partition, Cursor cursor, int position) {
         super.bindView(v, partition, cursor, position);
         final ContactListItemView view = (ContactListItemView) v;
-        bindSectionHeaderAndDivider(view, position);
-        bindName(view, cursor);
         bindViewId(view, cursor, GroupMembersQuery.CONTACT_ID);
+        bindName(view, cursor);
         bindPhoto(view, cursor);
     }
 
-    private void bindSectionHeaderAndDivider(final ContactListItemView view, int position) {
-        final int section = getSectionForPosition(position);
-        if (getPositionForSection(section) == position) {
-            final String header = (String) getSections()[section];
-            view.setSectionHeader(header);
-        } else {
-            view.setSectionHeader(null);
-        }
-    }
-
     private void bindName(ContactListItemView view, Cursor cursor) {
         view.showDisplayName(cursor, GroupMembersQuery.CONTACT_DISPLAY_NAME,
                 getContactNameDisplayOrder());
diff --git a/src/com/android/contacts/group/GroupMembersListFragment.java b/src/com/android/contacts/group/GroupMembersListFragment.java
index 8553b9b..5c86d04 100644
--- a/src/com/android/contacts/group/GroupMembersListFragment.java
+++ b/src/com/android/contacts/group/GroupMembersListFragment.java
@@ -79,7 +79,6 @@
                 }
                 return;
             }
-            // TODO(wjang): how should we handle deleted groups
             mGroupMetadata = new GroupMetadata();
             mGroupMetadata.uri = mGroupUri;
             mGroupMetadata.accountName = cursor.getString(GroupMetaDataLoader.ACCOUNT_NAME);
@@ -109,8 +108,7 @@
         public CursorLoader onCreateLoader(int id, Bundle args) {
             final GroupListLoader groupListLoader = new GroupListLoader(getActivity());
 
-            // TODO(wjang): modify GroupListLoader to accept this selection criteria more naturally
-            groupListLoader.setSelection(groupListLoader.getSelection()
+            groupListLoader.setSelection(GroupListLoader.DEFAULT_SELECTION
                     + " AND " + ContactsContract.Groups._ID + "=?");
 
             final String[] selectionArgs = new String[1];
diff --git a/src/com/android/contacts/group/GroupNameEditDialogFragment.java b/src/com/android/contacts/group/GroupNameEditDialogFragment.java
index f7ee6bf..bc877a2 100644
--- a/src/com/android/contacts/group/GroupNameEditDialogFragment.java
+++ b/src/com/android/contacts/group/GroupNameEditDialogFragment.java
@@ -19,12 +19,16 @@
 import android.app.Dialog;
 import android.app.DialogFragment;
 import android.app.FragmentManager;
+import android.content.Context;
 import android.content.DialogInterface;
 import android.content.DialogInterface.OnClickListener;
 import android.os.Bundle;
 import android.text.Editable;
 import android.text.TextUtils;
 import android.text.TextWatcher;
+import android.view.ContextThemeWrapper;
+import android.view.View;
+import android.view.inputmethod.InputMethodManager;
 import android.widget.Button;
 import android.widget.EditText;
 
@@ -87,9 +91,12 @@
     @Override
     public Dialog onCreateDialog(Bundle savedInstanceState) {
         // Build a dialog with two buttons and a view of a single EditText input field
-        final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity())
-                .setTitle(mIsInsert ? R.string.insert_group_dialog_title
-                        : R.string.update_group_dialog_title)
+        final ContextThemeWrapper context = new ContextThemeWrapper(getActivity(),
+                android.R.style.Theme_Holo_Light_Dialog_MinWidth);
+        final AlertDialog.Builder builder = new AlertDialog.Builder(context)
+                .setTitle(mIsInsert
+                        ? R.string.group_name_dialog_insert_title
+                        : R.string.group_name_dialog_update_title)
                 .setView(R.layout.group_name_edit_dialog)
                 .setNegativeButton(android.R.string.cancel, new OnClickListener() {
                     @Override
@@ -132,6 +139,8 @@
                         createButton.setEnabled(!TextUtils.isEmpty(s));
                     }
                 });
+
+                showInputMethod(mGroupNameEditText);
             }
         });
         return alertDialog;
@@ -150,6 +159,14 @@
         outState.putString(KEY_GROUP_NAME, getGroupName());
     }
 
+    private void showInputMethod(View view) {
+        final InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(
+                Context.INPUT_METHOD_SERVICE);
+        if (imm != null) {
+            imm.showSoftInput(view, /* flags */ 0);
+        }
+    }
+
     private Listener getListener() {
         if (!(getActivity() instanceof Listener)) {
             throw new ClassCastException(getActivity() + " must implement " +
diff --git a/src/com/android/contacts/group/GroupUtil.java b/src/com/android/contacts/group/GroupUtil.java
index f9f5007..67df13a 100644
--- a/src/com/android/contacts/group/GroupUtil.java
+++ b/src/com/android/contacts/group/GroupUtil.java
@@ -80,16 +80,9 @@
 
     /** Returns an Intent to view the details of the group identified by the given ID. */
     public static Intent createViewGroupIntent(Context context, long groupId) {
-        return createViewGroupIntent(context, getGroupUriFromId(groupId));
-    }
-
-    /** Returns an Intent to view the details of the group identified by the given Uri. */
-    public static Intent createViewGroupIntent(Context context, Uri uri) {
         final Intent intent = new Intent(context, GroupMembersActivity.class);
         intent.setAction(Intent.ACTION_VIEW);
-        // TODO(wjang): do we still need it?
-        // intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
-        intent.setData(uri);
+        intent.setData(ContentUris.withAppendedId(Groups.CONTENT_URI, groupId));
         return intent;
     }
 
@@ -106,9 +99,4 @@
         final Uri legacyContentUri = Uri.parse(LEGACY_CONTACTS_URI);
         return ContentUris.withAppendedId(legacyContentUri, groupId);
     }
-
-    /** TODO: Make it private after {@link GroupBrowseListAdapter} is removed. */
-    static Uri getGroupUriFromId(long groupId) {
-        return ContentUris.withAppendedId(Groups.CONTENT_URI, groupId);
-    }
 }
\ No newline at end of file
diff --git a/src/com/android/contacts/group/Member.java b/src/com/android/contacts/group/Member.java
index f8c56fd..ad6f9b2 100644
--- a/src/com/android/contacts/group/Member.java
+++ b/src/com/android/contacts/group/Member.java
@@ -38,7 +38,6 @@
         }
     };
 
-    // TODO: Switch to just dealing with raw contact IDs everywhere if possible
     private final long mRawContactId;
     private final long mContactId;
     private final Uri mLookupUri;
diff --git a/src/com/android/contacts/interactions/GroupDeletionDialogFragment.java b/src/com/android/contacts/interactions/GroupDeletionDialogFragment.java
index 2df7fe2..752a89a 100644
--- a/src/com/android/contacts/interactions/GroupDeletionDialogFragment.java
+++ b/src/com/android/contacts/interactions/GroupDeletionDialogFragment.java
@@ -33,14 +33,21 @@
     private static final String ARG_GROUP_ID = "groupId";
     private static final String ARG_LABEL = "label";
     private static final String ARG_SHOULD_END_ACTIVITY = "endActivity";
+    private static final String ARG_CALLBACK_ACTION = "callbackAction";
 
     public static void show(FragmentManager fragmentManager, long groupId, String label,
             boolean endActivity) {
+        show(fragmentManager, groupId, label, endActivity, /* callbackAction */ null);
+    }
+
+    public static void show(FragmentManager fragmentManager, long groupId, String label,
+            boolean endActivity, String callbackAction) {
         GroupDeletionDialogFragment dialog = new GroupDeletionDialogFragment();
         Bundle args = new Bundle();
         args.putLong(ARG_GROUP_ID, groupId);
         args.putString(ARG_LABEL, label);
         args.putBoolean(ARG_SHOULD_END_ACTIVITY, endActivity);
+        args.putString(ARG_CALLBACK_ACTION, callbackAction);
         dialog.setArguments(args);
         dialog.show(fragmentManager, "deleteGroup");
     }
@@ -68,9 +75,10 @@
     protected void deleteGroup() {
         Bundle arguments = getArguments();
         long groupId = arguments.getLong(ARG_GROUP_ID);
+        final String callbackAction = arguments.getString(ARG_CALLBACK_ACTION);
 
         getActivity().startService(ContactSaveService.createGroupDeletionIntent(
-                getActivity(), groupId));
+                getActivity(), groupId, getActivity().getClass(), callbackAction));
         if (shouldEndActivity()) {
             getActivity().finish();
         }
