diff --git a/commons_groups.features.field_base.inc b/commons_groups.features.field_base.inc
index 6ca4084..d3b99f5 100644
--- a/commons_groups.features.field_base.inc
+++ b/commons_groups.features.field_base.inc
@@ -112,7 +112,7 @@ function commons_groups_field_default_field_bases() {
       'allowed_values' => array(
         'anyone' => 'Anyone can join',
         'approval' => 'Joining requires admin approval',
-        'invitation' => 'Joining requires an invitation. The group and content is hidden from non-members.',
+        'invitation' => 'Joining requires an invitation',
       ),
       'allowed_values_function' => '',
     ),
@@ -120,6 +120,11 @@ function commons_groups_field_default_field_bases() {
     'type' => 'list_text',
   );
 
+  // Alter the "approval" description when og_access is on.
+  if (module_exists('og_access')) {
+    $field_bases['field_og_subscribe_settings']['settings']['allowed_values']['invitation'] = 'Joining requires an invitation. The group and content is hidden from non-members.';
+  }
+
   // Exported field_base: 'group_group'
   $field_bases['group_group'] = array(
     'active' => '1',
diff --git a/commons_groups.module b/commons_groups.module
index eae91c5..b594250 100644
--- a/commons_groups.module
+++ b/commons_groups.module
@@ -21,39 +21,9 @@ function commons_groups_ctools_plugin_directory($module, $plugin) {
  * Make sure the og access fields exist when og_access is enabled.
  */
 function commons_groups_modules_enabled($modules) {
-  if (!in_array('og_access', $modules)) {
-    return;
-  }
-
-  // Create access field on all group types.
-  foreach (og_get_all_group_bundle() as $entity_type => $bundles) {
-    foreach (array_keys($bundles) as $bundle) {
-      og_create_field(OG_ACCESS_FIELD, $entity_type, $bundle);
-    }
-  }
-
-  // Create access field on all group content node types.
-  $bundles = og_get_all_group_content_bundle();
-  if (empty($bundles['node'])) {
-    return;
-  }
-  foreach (array_keys($bundles['node']) as $bundle) {
-    og_create_field(OG_CONTENT_ACCESS_FIELD, 'node', $bundle);
-  }
-}
-
-/**
- * Implements hook_field_create_instance().
- *
- * Attach the og content access field to new content types when og_access is
- * enabled.
- */
-function commons_groups_field_create_instance($instance) {
-  if (!module_exists('og_access') || $instance['entity_type'] != 'node' || !og_is_group_audience_field($instance['field_name'])) {
-    return;
+  if (in_array('og_access', $modules)) {
+    features_revert(array('commons_groups' => array('field_base', 'field_instance')));
   }
-
-  og_create_field(OG_CONTENT_ACCESS_FIELD, 'node', $instance['bundle']);
 }
 
 /**
@@ -628,11 +598,20 @@ function commons_groups_node_presave($node) {
     return;
   }
 
+  $wrapper = entity_metadata_wrapper('node', $node);
+
+  if (og_is_group('node', $node)) {
+    // Determine whether the group is private according to the subscription
+    // field.
+    $private = $wrapper->field_og_subscribe_settings->value() == 'invitation';
+    $wrapper->{OG_ACCESS_FIELD}->set((int)$private);
+    return;
+  }
+
   if (!og_is_group_content_type('node', $node->type)) {
     return;
   }
 
-  $wrapper = entity_metadata_wrapper('node', $node);
 
   // Check whether any of the groups are private.
   $private = FALSE;
@@ -811,7 +790,8 @@ function commons_groups_preprocess_views_view_grid(&$variables, $hook) {
  * Implements hook_field_access().
  */
 function commons_groups_field_access($op, $field, $entity_type, $entity, $account) {
-  switch ($field['field_name']) {
+  $field_name = $field['field_name'];
+  switch ($field_name) {
     case 'og_roles_permissions':
       return FALSE;
 
@@ -820,8 +800,9 @@ function commons_groups_field_access($op, $field, $entity_type, $entity, $accoun
 
     case 'field_og_subscribe_settings':
       return $op == 'edit';
+  }
 
-    case OG_CONTENT_ACCESS_FIELD:
-      return FALSE;
+  if (module_exists('og_access') && in_array($field_name, array(OG_CONTENT_ACCESS_FIELD, OG_ACCESS_FIELD))) {
+    return FALSE;
   }
 }
