diff --git a/src/com/android/contacts/ContactsDrawerActivity.java b/src/com/android/contacts/ContactsDrawerActivity.java
index 2d7bb34..45898fb 100644
--- a/src/com/android/contacts/ContactsDrawerActivity.java
+++ b/src/com/android/contacts/ContactsDrawerActivity.java
@@ -59,7 +59,7 @@
 import com.android.contacts.editor.SelectAccountDialogFragment;
 import com.android.contacts.group.GroupListItem;
 import com.android.contacts.group.GroupMembersFragment;
-import com.android.contacts.group.GroupMetadata;
+import com.android.contacts.group.GroupMetaData;
 import com.android.contacts.group.GroupNameEditDialogFragment;
 import com.android.contacts.group.GroupUtil;
 import com.android.contacts.group.GroupsFragment;
@@ -343,7 +343,7 @@
         subMenu.removeGroup(R.id.nav_groups_items);
         mGroupMenuMap = new HashMap<>();
 
-        final GroupMetadata groupMetaData = getGroupMetadata();
+        final GroupMetaData groupMetaData = getGroupMetaData();
 
         if (groupListItems != null) {
             // Add each group
@@ -406,15 +406,15 @@
         }
     }
 
-    public void updateGroupMenu(GroupMetadata groupMetadata) {
+    public void updateGroupMenu(GroupMetaData groupMetaData) {
         clearCheckedMenus();
-        if (groupMetadata != null && mGroupMenuMap != null
-                && mGroupMenuMap.get(groupMetadata.groupId) != null) {
-            setMenuChecked(mGroupMenuMap.get(groupMetadata.groupId), true);
+        if (groupMetaData != null && mGroupMenuMap != null
+                && mGroupMenuMap.get(groupMetaData.groupId) != null) {
+            setMenuChecked(mGroupMenuMap.get(groupMetaData.groupId), true);
         }
     }
 
-    protected GroupMetadata getGroupMetadata() {
+    protected GroupMetaData getGroupMetaData() {
         return null;
     }
 
diff --git a/src/com/android/contacts/GroupMetaDataLoader.java b/src/com/android/contacts/GroupMetaDataLoader.java
index 4c78c0c..57aa67b 100644
--- a/src/com/android/contacts/GroupMetaDataLoader.java
+++ b/src/com/android/contacts/GroupMetaDataLoader.java
@@ -28,7 +28,7 @@
  */
 public final class GroupMetaDataLoader extends CursorLoader {
 
-    private final static String[] COLUMNS = new String[] {
+    public final static String[] COLUMNS = new String[] {
         Groups.ACCOUNT_NAME,
         Groups.ACCOUNT_TYPE,
         Groups.DATA_SET,
diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java
index 726c288..5e957e7 100644
--- a/src/com/android/contacts/activities/PeopleActivity.java
+++ b/src/com/android/contacts/activities/PeopleActivity.java
@@ -69,7 +69,7 @@
 import com.android.contacts.common.widget.FloatingActionButtonController;
 import com.android.contacts.editor.EditorIntents;
 import com.android.contacts.group.GroupMembersFragment;
-import com.android.contacts.group.GroupMetadata;
+import com.android.contacts.group.GroupMetaData;
 import com.android.contacts.group.GroupUtil;
 import com.android.contacts.list.ContactsIntentResolver;
 import com.android.contacts.list.ContactsRequest;
@@ -921,7 +921,7 @@
     }
 
     @Override
-    protected GroupMetadata getGroupMetadata() {
-        return mMembersFragment == null ? null : mMembersFragment.getGroupMetadata();
+    protected GroupMetaData getGroupMetaData() {
+        return mMembersFragment == null ? null : mMembersFragment.getGroupMetaData();
     }
 }
diff --git a/src/com/android/contacts/common/GroupMetaData.java b/src/com/android/contacts/common/GroupMetaData.java
deleted file mode 100644
index fa86ae2..0000000
--- a/src/com/android/contacts/common/GroupMetaData.java
+++ /dev/null
@@ -1,69 +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.common;
-
-/**
- * Meta-data for a contact group.  We load all groups associated with the contact's
- * constituent accounts.
- */
-public final class GroupMetaData {
-    private String mAccountName;
-    private String mAccountType;
-    private String mDataSet;
-    private long mGroupId;
-    private String mTitle;
-    private boolean mDefaultGroup;
-    private boolean mFavorites;
-
-    public GroupMetaData(String accountName, String accountType, String dataSet, long groupId,
-            String title, boolean defaultGroup, boolean favorites) {
-        this.mAccountName = accountName;
-        this.mAccountType = accountType;
-        this.mDataSet = dataSet;
-        this.mGroupId = groupId;
-        this.mTitle = title;
-        this.mDefaultGroup = defaultGroup;
-        this.mFavorites = favorites;
-    }
-
-    public String getAccountName() {
-        return mAccountName;
-    }
-
-    public String getAccountType() {
-        return mAccountType;
-    }
-
-    public String getDataSet() {
-        return mDataSet;
-    }
-
-    public long getGroupId() {
-        return mGroupId;
-    }
-
-    public String getTitle() {
-        return mTitle;
-    }
-
-    public boolean isDefaultGroup() {
-        return mDefaultGroup;
-    }
-
-    public boolean isFavorites() {
-        return mFavorites;
-    }
-}
\ No newline at end of file
diff --git a/src/com/android/contacts/common/model/Contact.java b/src/com/android/contacts/common/model/Contact.java
index 27bf13e..2187b1d 100644
--- a/src/com/android/contacts/common/model/Contact.java
+++ b/src/com/android/contacts/common/model/Contact.java
@@ -24,16 +24,15 @@
 import android.provider.ContactsContract.Directory;
 import android.provider.ContactsContract.DisplayNameSources;
 
-import com.android.contacts.common.GroupMetaData;
 import com.android.contacts.common.model.account.AccountType;
 import com.android.contacts.common.util.DataStatus;
+import com.android.contacts.group.GroupMetaData;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 
 import java.util.ArrayList;
-import java.util.Collections;
 
 /**
  * A Contact represents a single person or logical entity as perceived by the user.  The information
diff --git a/src/com/android/contacts/common/model/ContactLoader.java b/src/com/android/contacts/common/model/ContactLoader.java
index f721379..a8deff4 100644
--- a/src/com/android/contacts/common/model/ContactLoader.java
+++ b/src/com/android/contacts/common/model/ContactLoader.java
@@ -38,8 +38,8 @@
 import android.text.TextUtils;
 import android.util.Log;
 
+import com.android.contacts.GroupMetaDataLoader;
 import com.android.contacts.common.GeoUtil;
-import com.android.contacts.common.GroupMetaData;
 import com.android.contacts.common.compat.CompatUtils;
 import com.android.contacts.common.model.account.AccountType;
 import com.android.contacts.common.model.account.AccountTypeWithDataSet;
@@ -50,6 +50,8 @@
 import com.android.contacts.common.model.dataitem.DataItem;
 import com.android.contacts.common.model.dataitem.PhoneDataItem;
 import com.android.contacts.common.model.dataitem.PhotoDataItem;
+import com.android.contacts.group.GroupMetaData;
+
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Lists;
@@ -292,26 +294,6 @@
         public static final int EXPORT_SUPPORT = 5;
     }
 
-    private static class GroupQuery {
-        static final String[] COLUMNS = new String[] {
-            Groups.ACCOUNT_NAME,
-            Groups.ACCOUNT_TYPE,
-            Groups.DATA_SET,
-            Groups._ID,
-            Groups.TITLE,
-            Groups.AUTO_ADD,
-            Groups.FAVORITES,
-        };
-
-        public static final int ACCOUNT_NAME = 0;
-        public static final int ACCOUNT_TYPE = 1;
-        public static final int DATA_SET = 2;
-        public static final int ID = 3;
-        public static final int TITLE = 4;
-        public static final int AUTO_ADD = 5;
-        public static final int FAVORITES = 6;
-    }
-
     public void setLookupUri(Uri lookupUri) {
         mLookupUri = lookupUri;
     }
@@ -859,29 +841,14 @@
                 selection.append(")");
             }
         }
-        final ImmutableList.Builder<GroupMetaData> groupListBuilder =
-                new ImmutableList.Builder<GroupMetaData>();
+        final ImmutableList.Builder<GroupMetaData> groupListBuilder = new ImmutableList.Builder<>();
         final Cursor cursor = getContext().getContentResolver().query(Groups.CONTENT_URI,
-                GroupQuery.COLUMNS, selection.toString(), selectionArgs.toArray(new String[0]),
-                null);
+                GroupMetaDataLoader.COLUMNS, selection.toString(),
+                selectionArgs.toArray(new String[0]), null);
         if (cursor != null) {
             try {
                 while (cursor.moveToNext()) {
-                    final String accountName = cursor.getString(GroupQuery.ACCOUNT_NAME);
-                    final String accountType = cursor.getString(GroupQuery.ACCOUNT_TYPE);
-                    final String dataSet = cursor.getString(GroupQuery.DATA_SET);
-                    final long groupId = cursor.getLong(GroupQuery.ID);
-                    final String title = cursor.getString(GroupQuery.TITLE);
-                    final boolean defaultGroup = cursor.isNull(GroupQuery.AUTO_ADD)
-                            ? false
-                            : cursor.getInt(GroupQuery.AUTO_ADD) != 0;
-                    final boolean favorites = cursor.isNull(GroupQuery.FAVORITES)
-                            ? false
-                            : cursor.getInt(GroupQuery.FAVORITES) != 0;
-
-                    groupListBuilder.add(new GroupMetaData(
-                                    accountName, accountType, dataSet, groupId, title, defaultGroup,
-                                    favorites));
+                    groupListBuilder.add(new GroupMetaData(getContext(), cursor));
                 }
             } finally {
                 cursor.close();
diff --git a/src/com/android/contacts/group/GroupMembersFragment.java b/src/com/android/contacts/group/GroupMembersFragment.java
index 26560d6..66bd509 100644
--- a/src/com/android/contacts/group/GroupMembersFragment.java
+++ b/src/com/android/contacts/group/GroupMembersFragment.java
@@ -51,8 +51,6 @@
 import com.android.contacts.common.logging.ListEvent.ListType;
 import com.android.contacts.common.logging.Logger;
 import com.android.contacts.common.logging.ScreenEvent;
-import com.android.contacts.common.model.AccountTypeManager;
-import com.android.contacts.common.model.account.AccountType;
 import com.android.contacts.common.model.account.AccountWithDataSet;
 import com.android.contacts.common.util.ImplicitIntentsUtil;
 import com.android.contacts.group.GroupMembersAdapter.GroupMembersQuery;
@@ -81,6 +79,7 @@
     private static final String ARG_GROUP_URI = "groupUri";
 
     private static final int LOADER_GROUP_METADATA = 0;
+
     private static final int RESULT_GROUP_ADD_MEMBER = 100;
 
     /** Filters out duplicate contacts. */
@@ -183,7 +182,7 @@
         }
     }
 
-    private final LoaderCallbacks<Cursor> mGroupMetadataCallbacks = new LoaderCallbacks<Cursor>() {
+    private final LoaderCallbacks<Cursor> mGroupMetaDataCallbacks = new LoaderCallbacks<Cursor>() {
 
         @Override
         public CursorLoader onCreateLoader(int id, Bundle args) {
@@ -200,21 +199,7 @@
                 mActivity.finish();
                 return;
             }
-            mGroupMetadata = new GroupMetadata();
-            mGroupMetadata.uri = mGroupUri;
-            mGroupMetadata.accountName = cursor.getString(GroupMetaDataLoader.ACCOUNT_NAME);
-            mGroupMetadata.accountType = cursor.getString(GroupMetaDataLoader.ACCOUNT_TYPE);
-            mGroupMetadata.dataSet = cursor.getString(GroupMetaDataLoader.DATA_SET);
-            mGroupMetadata.groupId = cursor.getLong(GroupMetaDataLoader.GROUP_ID);
-            mGroupMetadata.groupName = cursor.getString(GroupMetaDataLoader.TITLE);
-            mGroupMetadata.readOnly = cursor.getInt(GroupMetaDataLoader.IS_READ_ONLY) == 1;
-
-            final AccountTypeManager accountTypeManager =
-                    AccountTypeManager.getInstance(mActivity);
-            final AccountType accountType = accountTypeManager.getAccountType(
-                    mGroupMetadata.accountType, mGroupMetadata.dataSet);
-            mGroupMetadata.editable = accountType.isGroupMembershipEditable();
-
+            mGroupMetaData = new GroupMetaData(getActivity(), cursor);
             onGroupMetadataLoaded();
         }
 
@@ -230,7 +215,7 @@
 
     private boolean mIsEditMode;
 
-    private GroupMetadata mGroupMetadata;
+    private GroupMetaData mGroupMetaData;
 
     private Set<String> mGroupMemberContactIds = new HashSet();
 
@@ -252,7 +237,7 @@
 
     @Override
     public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
-        if (mGroupMetadata == null) {
+        if (mGroupMetaData == null) {
             // Hide menu options until metadata is fully loaded
             return;
         }
@@ -262,8 +247,8 @@
     @Override
     public void onPrepareOptionsMenu(Menu menu) {
         final boolean isSelectionMode = mActionBarAdapter.isSelectionMode();
-        final boolean isGroupEditable = mGroupMetadata != null && mGroupMetadata.editable;
-        final boolean isGroupReadOnly = mGroupMetadata != null && mGroupMetadata.readOnly;
+        final boolean isGroupEditable = mGroupMetaData != null && mGroupMetaData.editable;
+        final boolean isGroupReadOnly = mGroupMetaData != null && mGroupMetaData.readOnly;
 
         setVisible(menu, R.id.menu_add, isGroupEditable && !isSelectionMode);
         setVisible(menu, R.id.menu_rename_group, !isGroupReadOnly && !isSelectionMode);
@@ -286,7 +271,7 @@
     }
 
     private void startGroupAddMemberActivity() {
-        startActivityForResult(GroupUtil.createPickMemberIntent(getContext(), mGroupMetadata,
+        startActivityForResult(GroupUtil.createPickMemberIntent(getContext(), mGroupMetaData,
                 getMemberContactIds()), RESULT_GROUP_ADD_MEMBER);
     }
 
@@ -303,10 +288,10 @@
             }
             case R.id.menu_rename_group: {
                 GroupNameEditDialogFragment.newInstanceForUpdate(
-                        new AccountWithDataSet(mGroupMetadata.accountName,
-                                mGroupMetadata.accountType, mGroupMetadata.dataSet),
-                        GroupUtil.ACTION_UPDATE_GROUP, mGroupMetadata.groupId,
-                        mGroupMetadata.groupName).show(getFragmentManager(),
+                        new AccountWithDataSet(mGroupMetaData.accountName,
+                                mGroupMetaData.accountType, mGroupMetaData.dataSet),
+                        GroupUtil.ACTION_UPDATE_GROUP, mGroupMetaData.groupId,
+                        mGroupMetaData.groupName).show(getFragmentManager(),
                         TAG_GROUP_NAME_EDIT_DIALOG);
                 return true;
             }
@@ -332,8 +317,8 @@
     private void removeSelectedContacts() {
         final long[] contactIds = getAdapter().getSelectedContactIdsArray();
         new UpdateGroupMembersAsyncTask(UpdateGroupMembersAsyncTask.TYPE_REMOVE,
-                getContext(), contactIds, mGroupMetadata.groupId, mGroupMetadata.accountName,
-                mGroupMetadata.accountType).execute();
+                getContext(), contactIds, mGroupMetaData.groupId, mGroupMetaData.accountName,
+                mGroupMetaData.accountType).execute();
 
         mActionBarAdapter.setSelectionMode(false);
     }
@@ -354,8 +339,8 @@
             }
             new UpdateGroupMembersAsyncTask(
                     UpdateGroupMembersAsyncTask.TYPE_ADD,
-                    getContext(), contactIds, mGroupMetadata.groupId, mGroupMetadata.accountName,
-                    mGroupMetadata.accountType).execute();
+                    getContext(), contactIds, mGroupMetaData.groupId, mGroupMetaData.accountName,
+                    mGroupMetaData.accountType).execute();
         }
     }
 
@@ -429,12 +414,12 @@
     private void deleteGroup() {
         if (getMemberCount() == 0) {
             final Intent intent = ContactSaveService.createGroupDeletionIntent(
-                    getContext(), mGroupMetadata.groupId);
+                    getContext(), mGroupMetaData.groupId);
             getContext().startService(intent);
             mActivity.switchToAllContacts();
         } else {
-            GroupDeletionDialogFragment.show(getFragmentManager(), mGroupMetadata.groupId,
-                    mGroupMetadata.groupName);
+            GroupDeletionDialogFragment.show(getFragmentManager(), mGroupMetaData.groupId,
+                    mGroupMetaData.groupName);
         }
     }
 
@@ -448,9 +433,9 @@
         final ContactsRequest contactsRequest = new ContactsRequest();
         contactsRequest.setActionCode(ContactsRequest.ACTION_GROUP);
         mActionBarAdapter.initialize(savedInstanceState, contactsRequest);
-        if (mGroupMetadata != null) {
-            mActivity.setTitle(mGroupMetadata.groupName);
-            if (mGroupMetadata.editable) {
+        if (mGroupMetaData != null) {
+            mActivity.setTitle(mGroupMetaData.groupName);
+            if (mGroupMetaData.editable) {
                 setCheckBoxListListener(mCheckBoxListener);
             }
         }
@@ -485,7 +470,7 @@
         } else {
             mIsEditMode = savedState.getBoolean(KEY_IS_EDIT_MODE);
             mGroupUri = savedState.getParcelable(KEY_GROUP_URI);
-            mGroupMetadata = savedState.getParcelable(KEY_GROUP_METADATA);
+            mGroupMetaData = savedState.getParcelable(KEY_GROUP_METADATA);
         }
         maybeAttachCheckBoxListener();
     }
@@ -500,8 +485,8 @@
 
     @Override
     protected void startLoading() {
-        if (mGroupMetadata == null || !mGroupMetadata.isValid()) {
-            getLoaderManager().restartLoader(LOADER_GROUP_METADATA, null, mGroupMetadataCallbacks);
+        if (mGroupMetaData == null || !mGroupMetaData.isValid()) {
+            getLoaderManager().restartLoader(LOADER_GROUP_METADATA, null, mGroupMetaDataCallbacks);
         } else {
             onGroupMetadataLoaded();
         }
@@ -527,7 +512,7 @@
         final View emptyGroupView = getView().findViewById(R.id.empty_group);
         if (memberCount > 0) {
             final AccountWithDataSet accountWithDataSet = new AccountWithDataSet(
-                    mGroupMetadata.accountName, mGroupMetadata.accountType, mGroupMetadata.dataSet);
+                    mGroupMetaData.accountName, mGroupMetaData.accountType, mGroupMetaData.dataSet);
             bindListHeader(getContext(), getListView(), accountFilterContainer,
                     accountWithDataSet, memberCount);
             emptyGroupView.setVisibility(View.GONE);
@@ -546,16 +531,16 @@
         }
         outState.putBoolean(KEY_IS_EDIT_MODE, mIsEditMode);
         outState.putParcelable(KEY_GROUP_URI, mGroupUri);
-        outState.putParcelable(KEY_GROUP_METADATA, mGroupMetadata);
+        outState.putParcelable(KEY_GROUP_METADATA, mGroupMetaData);
     }
 
     private void onGroupMetadataLoaded() {
-        if (Log.isLoggable(TAG, Log.VERBOSE)) Log.v(TAG, "Loaded " + mGroupMetadata);
+        if (Log.isLoggable(TAG, Log.VERBOSE)) Log.v(TAG, "Loaded " + mGroupMetaData);
 
         maybeAttachCheckBoxListener();
 
-        mActivity.setTitle(mGroupMetadata.groupName);
-        mActivity.updateGroupMenu(mGroupMetadata);
+        mActivity.setTitle(mGroupMetaData.groupName);
+        mActivity.updateGroupMenu(mGroupMetaData);
         mActivity.invalidateOptionsMenu();
 
         // Start loading the group members
@@ -564,7 +549,7 @@
 
     private void maybeAttachCheckBoxListener() {
         // Don't attach the multi select check box listener if we can't edit the group
-        if (mGroupMetadata != null && mGroupMetadata.editable) {
+        if (mGroupMetaData != null && mGroupMetaData.editable) {
             setCheckBoxListListener(mCheckBoxListener);
         }
     }
@@ -581,8 +566,8 @@
     @Override
     protected void configureAdapter() {
         super.configureAdapter();
-        if (mGroupMetadata != null) {
-            getAdapter().setGroupId(mGroupMetadata.groupId);
+        if (mGroupMetaData != null) {
+            getAdapter().setGroupId(mGroupMetaData.groupId);
         }
     }
 
@@ -609,7 +594,7 @@
             @Override
             public void onClick(View v) {
                 startActivityForResult(GroupUtil.createPickMemberIntent(getContext(),
-                        mGroupMetadata, getMemberContactIds()), RESULT_GROUP_ADD_MEMBER);
+                        mGroupMetaData, getMemberContactIds()), RESULT_GROUP_ADD_MEMBER);
             }
         });
         return view;
@@ -650,17 +635,17 @@
             final long[] contactIds = new long[1];
             contactIds[0] = contactId;
             new UpdateGroupMembersAsyncTask(UpdateGroupMembersAsyncTask.TYPE_REMOVE,
-                    getContext(), contactIds, mGroupMetadata.groupId, mGroupMetadata.accountName,
-                    mGroupMetadata.accountType).execute();
+                    getContext(), contactIds, mGroupMetaData.groupId, mGroupMetaData.accountName,
+                    mGroupMetaData.accountType).execute();
         }
     }
 
-    public GroupMetadata getGroupMetadata() {
-        return mGroupMetadata;
+    public GroupMetaData getGroupMetaData() {
+        return mGroupMetaData;
     }
 
     public boolean isCurrentGroup(long groupId) {
-        return mGroupMetadata != null && mGroupMetadata.groupId == groupId;
+        return mGroupMetaData != null && mGroupMetaData.groupId == groupId;
     }
 
     @Override
@@ -681,7 +666,7 @@
             exitEditMode();
         } else if (!GroupUtil.ACTION_REMOVE_FROM_GROUP.equals(action)) {
             mGroupUri = newGroupUri;
-            mGroupMetadata = null; // Clear mGroupMetadata to trigger a new load.
+            mGroupMetaData = null; // Clear mGroupMetaData to trigger a new load.
             reloadData();
             mActivity.invalidateOptionsMenu();
         }
diff --git a/src/com/android/contacts/group/GroupMetaData.java b/src/com/android/contacts/group/GroupMetaData.java
new file mode 100644
index 0000000..3fe87d8
--- /dev/null
+++ b/src/com/android/contacts/group/GroupMetaData.java
@@ -0,0 +1,143 @@
+/*
+ * Copyright (C) 2016 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.group;
+
+import android.content.ContentUris;
+import android.content.Context;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.provider.ContactsContract;
+import android.text.TextUtils;
+
+import com.android.contacts.GroupMetaDataLoader;
+import com.android.contacts.common.model.AccountTypeManager;
+import com.android.contacts.common.model.account.AccountType;
+
+import com.google.common.base.Objects;
+
+/** Meta data for a contact group. */
+public final class GroupMetaData implements Parcelable {
+
+    public static final Creator<GroupMetaData> CREATOR = new Creator<GroupMetaData>() {
+
+        public GroupMetaData createFromParcel(Parcel in) {
+            return new GroupMetaData(in);
+        }
+
+        public GroupMetaData[] newArray(int size) {
+            return new GroupMetaData[size];
+        }
+    };
+
+    public final Uri uri;
+    public final String accountName;
+    public final String accountType;
+    public final String dataSet;
+    public final long groupId;
+    public final String groupName;
+    public final boolean readOnly;
+    public final boolean defaultGroup;
+    public final boolean favorites;
+    public final boolean editable;
+
+    /**
+     * @param cursor Cursor loaded with {@link GroupMetaDataLoader#COLUMNS} as the projection.
+     */
+    public GroupMetaData(Context context, Cursor cursor) {
+        final AccountTypeManager accountTypeManager = AccountTypeManager.getInstance(context);
+        final long groupId = cursor.getLong(GroupMetaDataLoader.GROUP_ID);
+        final Uri groupUri = ContentUris.withAppendedId(
+                ContactsContract.Groups.CONTENT_URI, groupId);
+        final AccountType accountType = accountTypeManager.getAccountType(
+                cursor.getString(GroupMetaDataLoader.ACCOUNT_TYPE),
+                cursor.getString(GroupMetaDataLoader.DATA_SET));
+        final boolean editable = accountType == null
+                ? false : accountType.isGroupMembershipEditable();
+
+        this.uri = groupUri;
+        this.accountName = cursor.getString(GroupMetaDataLoader.ACCOUNT_NAME);
+        this.accountType = cursor.getString(GroupMetaDataLoader.ACCOUNT_TYPE);
+        this.dataSet = cursor.getString(GroupMetaDataLoader.DATA_SET);
+        this.groupId = groupId;
+        this.groupName = cursor.getString(GroupMetaDataLoader.TITLE);
+        this.readOnly = getBoolean(cursor, GroupMetaDataLoader.IS_READ_ONLY);
+        this.defaultGroup = getBoolean(cursor, GroupMetaDataLoader.AUTO_ADD);
+        this.favorites = getBoolean(cursor, GroupMetaDataLoader.FAVORITES);
+        this.editable = editable;
+    }
+
+    private static boolean getBoolean(Cursor cursor, int columnIndex) {
+         return cursor.isNull(columnIndex) ? false : cursor.getInt(columnIndex) != 0;
+    }
+
+    private GroupMetaData(Parcel source) {
+        uri = source.readParcelable(Uri.class.getClassLoader());
+        accountName = source.readString();
+        accountType = source.readString();
+        dataSet = source.readString();
+        groupId = source.readLong();
+        groupName = source.readString();
+        readOnly = source.readInt() == 1;
+        defaultGroup = source.readInt() == 1;
+        favorites = source.readInt() == 1;
+        editable = source.readInt() == 1;
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeParcelable(uri, 0);
+        dest.writeString(accountName);
+        dest.writeString(accountType);
+        dest.writeString(dataSet);
+        dest.writeLong(groupId);
+        dest.writeString(groupName);
+        dest.writeInt(readOnly ? 1 : 0);
+        dest.writeInt(defaultGroup ? 1 : 0);
+        dest.writeInt(favorites ? 1 : 0);
+        dest.writeInt(editable ? 1 : 0);
+    }
+
+    /** Whether all metadata fields are set. */
+    public boolean isValid() {
+        return uri != null
+                && !TextUtils.isEmpty(accountName)
+                && !TextUtils.isEmpty(groupName)
+                && groupId > 0;
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public String toString() {
+        return Objects.toStringHelper(this)
+                .add("accountName", accountName)
+                .add("accountType", accountType)
+                .add("dataSet", dataSet)
+                .add("groupId", groupId)
+                .add("groupName", groupName)
+                .add("readOnly", readOnly)
+                .add("defaultGroup", defaultGroup)
+                .add("favorites", favorites)
+                .add("editable", editable)
+                .add("isValid", isValid())
+                .toString();
+    }
+}
\ No newline at end of file
diff --git a/src/com/android/contacts/group/GroupMetadata.java b/src/com/android/contacts/group/GroupMetadata.java
deleted file mode 100644
index f3dfec24..0000000
--- a/src/com/android/contacts/group/GroupMetadata.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright (C) 2016 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.group;
-
-import android.net.Uri;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.text.TextUtils;
-
-import com.android.contacts.common.model.account.AccountWithDataSet;
-
-/** Meta data for a contact group. */
-// TODO(wjang): consolidate with com.android.contacts.common.GroupMetaData;
-public final class GroupMetadata implements Parcelable {
-
-    public static final Creator<GroupMetadata> CREATOR = new Creator<GroupMetadata>() {
-
-        public GroupMetadata createFromParcel(Parcel in) {
-            return new GroupMetadata(in);
-        }
-
-        public GroupMetadata[] newArray(int size) {
-            return new GroupMetadata[size];
-        }
-    };
-
-    // TODO(wjang): make them all final and add getters
-    public Uri uri;
-    public String accountName;
-    public String accountType;
-    public String dataSet;
-    public long groupId = -1;
-    public String groupName;
-    public boolean readOnly;
-    public boolean editable;
-
-    public GroupMetadata() {
-    }
-
-    private GroupMetadata(Parcel source) {
-        readFromParcel(source);
-    }
-
-    private void readFromParcel(Parcel source) {
-        uri = source.readParcelable(Uri.class.getClassLoader());
-        accountName = source.readString();
-        accountType = source.readString();
-        dataSet = source.readString();
-        groupId = source.readLong();
-        groupName = source.readString();
-        readOnly = source.readInt() == 1;
-        editable = source.readInt() == 1;
-    }
-
-    @Override
-    public void writeToParcel(Parcel dest, int flags) {
-        dest.writeParcelable(uri, 0);
-        dest.writeString(accountName);
-        dest.writeString(accountType);
-        dest.writeString(dataSet);
-        dest.writeLong(groupId);
-        dest.writeString(groupName);
-        dest.writeInt(readOnly ? 1 : 0);
-        dest.writeInt(editable ? 1 : 0);
-    }
-
-    /** Whether all metadata fields are set. */
-    public boolean isValid() {
-        return uri != null
-                && !TextUtils.isEmpty(accountName)
-                && !TextUtils.isEmpty(groupName)
-                && groupId > 0;
-    }
-
-    @Override
-    public int describeContents() {
-        return 0;
-    }
-
-    @Override
-    public String toString() {
-        return "GroupMetadata[uri=" + uri +
-                " accountName=" + accountName +
-                " accountType=" + accountType +
-                " dataSet=" + dataSet +
-                " groupId=" + groupId +
-                " groupName=" + groupName +
-                " readOnly=" + readOnly +
-                " editable=" + editable +
-                " isValid=" + isValid() +
-                "]";
-    }
-}
\ No newline at end of file
diff --git a/src/com/android/contacts/group/GroupUtil.java b/src/com/android/contacts/group/GroupUtil.java
index e01cc30..8976270 100644
--- a/src/com/android/contacts/group/GroupUtil.java
+++ b/src/com/android/contacts/group/GroupUtil.java
@@ -93,13 +93,13 @@
 
     /** Returns an Intent to pick contacts to add to a group. */
     public static Intent createPickMemberIntent(Context context,
-            GroupMetadata groupMetadata, ArrayList<String> memberContactIds) {
+            GroupMetaData groupMetaData, ArrayList<String> memberContactIds) {
         final Intent intent = new Intent(context, ContactSelectionActivity.class);
         intent.setAction(Intent.ACTION_PICK);
         intent.setType(Groups.CONTENT_TYPE);
-        intent.putExtra(UiIntentActions.GROUP_ACCOUNT_NAME, groupMetadata.accountName);
-        intent.putExtra(UiIntentActions.GROUP_ACCOUNT_TYPE, groupMetadata.accountType);
-        intent.putExtra(UiIntentActions.GROUP_ACCOUNT_DATA_SET, groupMetadata.dataSet);
+        intent.putExtra(UiIntentActions.GROUP_ACCOUNT_NAME, groupMetaData.accountName);
+        intent.putExtra(UiIntentActions.GROUP_ACCOUNT_TYPE, groupMetaData.accountType);
+        intent.putExtra(UiIntentActions.GROUP_ACCOUNT_DATA_SET, groupMetaData.dataSet);
         intent.putExtra(UiIntentActions.GROUP_CONTACT_IDS, memberContactIds);
         return intent;
     }
diff --git a/src/com/android/contacts/quickcontact/InvisibleContactUtil.java b/src/com/android/contacts/quickcontact/InvisibleContactUtil.java
index fa1132b..c8bb98d 100644
--- a/src/com/android/contacts/quickcontact/InvisibleContactUtil.java
+++ b/src/com/android/contacts/quickcontact/InvisibleContactUtil.java
@@ -4,7 +4,6 @@
 import com.google.common.collect.Iterables;
 
 import com.android.contacts.ContactSaveService;
-import com.android.contacts.common.GroupMetaData;
 import com.android.contacts.common.model.AccountTypeManager;
 import com.android.contacts.common.model.Contact;
 import com.android.contacts.common.model.RawContact;
@@ -16,6 +15,7 @@
 import com.android.contacts.common.model.dataitem.DataItem;
 import com.android.contacts.common.model.dataitem.DataKind;
 import com.android.contacts.common.model.dataitem.GroupMembershipDataItem;
+import com.android.contacts.group.GroupMetaData;
 
 import android.content.Context;
 import android.content.Intent;
@@ -103,10 +103,10 @@
     private static long getDefaultGroupId(List<GroupMetaData> groups) {
         long defaultGroupId = -1;
         for (GroupMetaData group : groups) {
-            if (group.isDefaultGroup()) {
+            if (group.defaultGroup) {
                 // two default groups? return neither
                 if (defaultGroupId != -1) return -1;
-                defaultGroupId = group.getGroupId();
+                defaultGroupId = group.groupId;
             }
         }
         return defaultGroupId;
