diff --git a/commons_groups.features.field_base.inc b/commons_groups.features.field_base.inc
index cd8b2c0..11ecbfc 100644
--- a/commons_groups.features.field_base.inc
+++ b/commons_groups.features.field_base.inc
@@ -10,6 +10,116 @@
 function commons_groups_field_default_field_bases() {
   $field_bases = array();
 
+  if (module_exists('og_access')) {
+    // Exported field_base: 'group_access'
+    $field_bases['group_access'] = array(
+      'active' => '1',
+      'cardinality' => '1',
+      'deleted' => '0',
+      'entity_types' => array(),
+      'field_name' => 'group_access',
+      'foreign keys' => array(),
+      'indexes' => array(
+        'value' => array(
+          0 => 'value',
+        ),
+      ),
+      'locked' => '0',
+      'module' => 'list',
+      'no_ui' => TRUE,
+      'settings' => array(
+        'allowed_values' => array(
+          0 => 'Public - accessible to all site users',
+          1 => 'Private - accessible only to group members',
+        ),
+        'allowed_values_function' => '',
+      ),
+      'translatable' => '0',
+      'type' => 'list_boolean',
+    );
+
+    // Exported field_base: 'group_content_access'
+    $field_bases['group_content_access'] = array(
+      'active' => '1',
+      'cardinality' => '1',
+      'deleted' => '0',
+      'entity_types' => array(),
+      'field_name' => 'group_content_access',
+      'foreign keys' => array(),
+      'indexes' => array(
+        'value' => array(
+          0 => 'value',
+        ),
+      ),
+      'locked' => '0',
+      'module' => 'list',
+      'no_ui' => TRUE,
+      'settings' => array(
+        'allowed_values' => array(
+          0 => 'Use group defaults',
+          1 => 'Public - accessible to all site users',
+          2 => 'Private - accessible only to group members',
+        ),
+        'allowed_values_function' => '',
+      ),
+      'translatable' => '0',
+      'type' => 'list_integer',
+    );
+  }
+
+  // Exported field_base: 'field_og_subscribe_settings'
+  $field_bases['field_og_subscribe_settings'] = array(
+    'active' => '1',
+    'cardinality' => '1',
+    'deleted' => '0',
+    'entity_types' => array(),
+    'field_name' => 'field_og_subscribe_settings',
+    'foreign keys' => array(),
+    'indexes' => array(
+      'value' => array(
+        0 => 'value',
+      ),
+    ),
+    'locked' => '0',
+    'module' => 'list',
+    'settings' => array(
+      '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.',
+      ),
+      'allowed_values_function' => '',
+    ),
+    'translatable' => '0',
+    'type' => 'list_text',
+  );
+
+  // Exported field_base: 'field_og_access_default_value'
+  $field_bases['field_og_access_default_value'] = array(
+    'active' => '1',
+    'cardinality' => '1',
+    'deleted' => '0',
+    'entity_types' => array(),
+    'field_name' => 'field_og_access_default_value',
+    'foreign keys' => array(),
+    'indexes' => array(
+      'value' => array(
+        0 => 'value',
+      ),
+    ),
+    'locked' => '0',
+    'module' => 'list',
+    'settings' => array(
+      'allowed_values' => array(
+        0 => '',
+        1 => '',
+      ),
+      'allowed_values_function' => '',
+    ),
+    'translatable' => '0',
+    'type' => 'list_boolean',
+  );
+
   // Exported field_base: 'group_group'
   $field_bases['group_group'] = array(
     'active' => '1',
@@ -60,7 +170,7 @@ function commons_groups_field_default_field_bases() {
     'locked' => '0',
     'module' => 'entityreference',
     'settings' => array(
-      'handler' => 'og',
+      'handler' => 'og_commons',
       'handler_settings' => array(
         'behaviors' => array(
           'og_behavior' => array(
@@ -137,7 +247,7 @@ function commons_groups_field_default_field_bases() {
     'locked' => '0',
     'module' => 'entityreference',
     'settings' => array(
-      'handler' => 'og',
+      'handler' => 'og_commons',
       'handler_settings' => array(
         'behaviors' => array(
           'og_behavior' => array(
@@ -186,5 +296,31 @@ function commons_groups_field_default_field_bases() {
     'type' => 'image',
   );
 
+  // Exported field_base: 'og_roles_permissions'
+  $field_bases['og_roles_permissions'] = array(
+    'active' => '1',
+    'cardinality' => '1',
+    'deleted' => '0',
+    'entity_types' => array(),
+    'field_name' => 'og_roles_permissions',
+    'foreign keys' => array(),
+    'indexes' => array(
+      'value' => array(
+        0 => 'value',
+      ),
+    ),
+    'locked' => '0',
+    'module' => 'list',
+    'settings' => array(
+      'allowed_values' => array(
+        0 => 'Use default roles and permissions',
+        1 => 'Override default roles and permissions',
+      ),
+      'allowed_values_function' => '',
+    ),
+    'translatable' => '0',
+    'type' => 'list_boolean',
+  );
+
   return $field_bases;
 }
diff --git a/commons_groups.features.field_instance.inc b/commons_groups.features.field_instance.inc
index 653dfdf..b821802 100644
--- a/commons_groups.features.field_instance.inc
+++ b/commons_groups.features.field_instance.inc
@@ -61,6 +61,59 @@ function commons_groups_field_default_field_instances() {
     ),
   );
 
+  if (module_exists('og_access')) {
+    // Exported field_instance: 'node-group-group_access'
+    $field_instances['node-group-group_access'] = array(
+      'bundle' => 'group',
+      'default_value' => array(
+        0 => array(
+          'value' => 0,
+        ),
+      ),
+      'deleted' => '0',
+      'description' => '',
+      'display' => array(
+        'default' => array(
+          'label' => 'above',
+          'module' => 'list',
+          'settings' => array(),
+          'type' => 'list_default',
+          'weight' => 4,
+        ),
+        'teaser' => array(
+          'label' => 'above',
+          'settings' => array(),
+          'type' => 'hidden',
+          'weight' => 0,
+        ),
+      ),
+      'entity_type' => 'node',
+      'field_name' => 'group_access',
+      'label' => 'Group visibility',
+      'required' => TRUE,
+      'settings' => array(
+        'user_register_form' => FALSE,
+      ),
+      'view modes' => array(
+        'full' => array(
+          'label' => 'above',
+          'type' => 'options_onoff',
+        ),
+        'teaser' => array(
+          'label' => 'above',
+          'type' => 'options_onoff',
+        ),
+      ),
+      'widget' => array(
+        'module' => 'options',
+        'settings' => array(),
+        'type' => 'options_buttons',
+        'weight' => 41,
+      ),
+      'widget_type' => 'options_select',
+    );
+  }
+
    // Exported field_instance: 'node-group-group_group'
   $field_instances['node-group-group_group'] = array(
     'bundle' => 'group',
@@ -190,14 +243,153 @@ function commons_groups_field_default_field_instances() {
     ),
   );
 
+  // Exported field_instance: 'node-group-field_og_subscribe_settings'
+  $field_instances['node-group-field_og_subscribe_settings'] = array(
+    'bundle' => 'group',
+    'default_value' => array(
+      0 => array(
+        'value' => 'anyone',
+      ),
+    ),
+    'deleted' => '0',
+    'description' => '',
+    'display' => array(
+      'default' => array(
+        'label' => 'above',
+        'module' => 'list',
+        'settings' => array(),
+        'type' => 'list_default',
+        'weight' => 4,
+      ),
+      'teaser' => array(
+        'label' => 'above',
+        'settings' => array(),
+        'type' => 'hidden',
+        'weight' => 0,
+      ),
+    ),
+    'entity_type' => 'node',
+    'field_name' => 'field_og_subscribe_settings',
+    'label' => 'Privacy settings',
+    'required' => 1,
+    'settings' => array(
+      'user_register_form' => FALSE,
+    ),
+    'widget' => array(
+      'active' => 1,
+      'module' => 'options',
+      'settings' => array(),
+      'type' => 'options_buttons',
+      'weight' => '41',
+    ),
+  );
+
+  // Exported field_instance: 'node-group-field_og_access_default_value'
+  $field_instances['node-group-field_og_access_default_value'] = array(
+    'bundle' => 'group',
+    'default_value' => array(
+      0 => array(
+        'value' => 0,
+      ),
+    ),
+    'deleted' => '0',
+    'description' => '',
+    'display' => array(
+      'default' => array(
+        'label' => 'above',
+        'module' => 'list',
+        'settings' => array(),
+        'type' => 'list_default',
+        'weight' => 5,
+      ),
+      'teaser' => array(
+        'label' => 'above',
+        'settings' => array(),
+        'type' => 'hidden',
+        'weight' => 0,
+      ),
+    ),
+    'entity_type' => 'node',
+    'field_name' => 'field_og_access_default_value',
+    'label' => 'Hide contributed content from non-members',
+    'required' => 0,
+    'settings' => array(
+      'user_register_form' => FALSE,
+    ),
+    'widget' => array(
+      'active' => 1,
+      'module' => 'options',
+      'settings' => array(
+        'display_label' => 1,
+      ),
+      'type' => 'options_onoff',
+      'weight' => '42',
+    ),
+  );
+
+  // Exported field_instance: 'node-group-og_roles_permissions'
+  $field_instances['node-group-og_roles_permissions'] = array(
+    'bundle' => 'group',
+    'default_value' => array(
+      0 => array(
+        'value' => 1,
+      ),
+    ),
+    'deleted' => '0',
+    'description' => '',
+    'display' => array(
+      'default' => array(
+        'label' => 'above',
+        'module' => 'list',
+        'settings' => array(),
+        'type' => 'list_default',
+        'weight' => 1,
+      ),
+      'teaser' => array(
+        'label' => 'above',
+        'settings' => array(),
+        'type' => 'hidden',
+        'weight' => 0,
+      ),
+    ),
+    'entity_type' => 'node',
+    'field_name' => 'og_roles_permissions',
+    'label' => 'Group roles and permissions',
+    'required' => TRUE,
+    'settings' => array(
+      'user_register_form' => FALSE,
+    ),
+    'view modes' => array(
+      'full' => array(
+        'custom settings' => FALSE,
+        'label' => 'Full',
+        'type' => 'list_default',
+      ),
+      'teaser' => array(
+        'custom settings' => FALSE,
+        'label' => 'Teaser',
+        'type' => 'list_default',
+      ),
+    ),
+    'widget' => array(
+      'module' => 'options',
+      'settings' => array(),
+      'type' => 'options_select',
+      'weight' => 1,
+    ),
+  );
+
   // Translatables
   // Included for use with string extractors like potx.
   t('Determine if this is an OG group.');
   t('Group');
   t('Group membership');
+  t('Group visibility');
   t('Request message');
   t('This is the text a user may send to the group administrators.');
   t('Group Logo');
+  t('Hide contributed content from non-members');
+  t('Privacy settings');
   return $field_instances;
 }
 
@@ -271,6 +463,59 @@ function commons_groups_field_definition(&$field_instances, $entity_type, $bundl
     ),
   );
 
+  if (module_exists('og_access')) {
+    // Exported field_instance: '[entity]-[bundle]-group_content_access'
+    $field_instances["$entity_type-$bundle-group_content_access"] = array(
+      'bundle' => $bundle,
+      'default_value' => array(
+        0 => array(
+          'value' => 0,
+        ),
+      ),
+      'deleted' => '0',
+      'description' => '',
+      'display' => array(
+        'default' => array(
+          'label' => 'above',
+          'module' => 'list',
+          'settings' => array(),
+          'type' => 'list_default',
+          'weight' => 13,
+        ),
+        'teaser' => array(
+          'label' => 'above',
+          'settings' => array(),
+          'type' => 'hidden',
+          'weight' => 0,
+        ),
+      ),
+      'entity_type' => $entity_type,
+      'field_name' => 'group_content_access',
+      'label' => 'Group content visibility',
+      'required' => TRUE,
+      'settings' => array(
+        'user_register_form' => FALSE,
+      ),
+      'view modes' => array(
+        'full' => array(
+          'label' => 'above',
+          'type' => 'list_default',
+        ),
+        'teaser' => array(
+          'label' => 'above',
+          'type' => 'list_default',
+        ),
+      ),
+      'widget' => array(
+        'module' => 'options',
+        'settings' => array(),
+        'type' => 'options_select',
+        'weight' => 16,
+      ),
+      'widget_type' => 'options_select',
+    );
+  }
+
   // Exported field_instance: 'node-group-field_group_logo'
   $field_instances['node-group-field_group_logo'] = array(
     'bundle' => 'group',
diff --git a/commons_groups.info b/commons_groups.info
index 9e1ea47..2d43154 100644
--- a/commons_groups.info
+++ b/commons_groups.info
@@ -21,6 +21,8 @@ dependencies[] = views_load_more
 features[ctools][] = strongarm:strongarm:1
 features[ctools][] = views:views_default:3.0
 features[features_api][] = api:1
+features[field_base][] = group_access
+features[field_base][] = group_content_access
 features[field_base][] = group_group
 features[field_base][] = og_group_ref
 features[field_base][] = og_membership_request
@@ -58,4 +60,6 @@ features[views_view][] = commons_group_moderation
 features[views_view][] = commons_groups_contributors
 features[views_view][] = commons_groups_directory
 features[views_view][] = commons_groups_recent_content
-features[views_view][] = commons_groups_user_groups
\ No newline at end of file
+features[views_view][] = commons_groups_user_groups
+features_exclude[field][node-group-group_group] = node-group-group_group
+features_exclude[field][node-group-group_access] = node-group-group_access
diff --git a/commons_groups.install b/commons_groups.install
index 23b8375..1f74383 100644
--- a/commons_groups.install
+++ b/commons_groups.install
@@ -62,7 +62,7 @@ function commons_groups_update_3105() {
  * (http://drupal.org/node/1821808).
  */
 function commons_groups_update_3106() {
-    $revert = array(
+  $revert = array(
       'commons_groups' => array('views_view'),
   );
   features_revert($revert);
@@ -92,4 +92,16 @@ function commons_groups_update_3107() {
     }
   }
   return array();
+}
+
+/**
+ * Update the og_group_ref and group privacy fields per
+ * http://drupal.org/node/1961296.
+ */
+function commons_groups_update_3108() {
+  $revert = array(
+      'commons_groups' => array('field_base', 'field_instance'),
+  );
+  features_revert($revert);
+  return array();
 }
\ No newline at end of file
diff --git a/commons_groups.module b/commons_groups.module
index 0802a8e..74482dd 100644
--- a/commons_groups.module
+++ b/commons_groups.module
@@ -6,6 +6,14 @@
 
 include_once 'commons_groups.features.inc';
 
+/**
+ * Implements hook_ctools_plugin_directory().
+ */
+function commons_groups_ctools_plugin_directory($module, $plugin) {
+  if ($module == 'entityreference') {
+    return "plugins/entityreference/$plugin";
+  }
+}
 
 /**
  * Implements hook_entity_view().
@@ -24,6 +32,64 @@ function commons_groups_entity_view($entity, $type, $view_mode, $langcode) {
     drupal_set_breadcrumb($breadcrumb);
   }
 }
+
+/**
+ * Implements hook_form_FORM_ID_alter().
+ *
+ * Alter the privacy settings fields.
+ */
+function commons_groups_form_group_node_form_alter(&$form, &$form_state) {
+  if (!module_exists('og_access')) {
+    $form['field_og_subscribe_settings']['#access'] = FALSE;
+    $form['field_og_access_default_value']['#access'] = FALSE;
+    return;
+  }
+
+  // Wrap the privacy fields with a fieldset.
+  $form['privacy_settings'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Privacy settings'),
+    '#weight' => 20,
+  );
+  $form['privacy_settings']['field_og_subscribe_settings'] = $form['field_og_subscribe_settings'];
+  $form['privacy_settings']['field_og_access_default_value'] = $form['field_og_access_default_value'];
+  unset($form['field_og_subscribe_settings'], $form['field_og_access_default_value']);
+
+  // Hide the settings label.
+  $form['privacy_settings']['field_og_subscribe_settings'][LANGUAGE_NONE]['#title'] = '';
+  $form['privacy_settings']['field_og_subscribe_settings'][LANGUAGE_NONE]['#required'] = FALSE;
+
+  // Display the private content checkbox only when "Joining requires approval"
+  // is selected.
+  $form['privacy_settings']['field_og_access_default_value']['#states'] = array(
+    'visible' => array(
+      ':input[name="field_og_subscribe_settings[' . LANGUAGE_NONE . ']"]' => array('value' => 'approval'),
+    ),
+  );
+
+  $form['#after_build'] = array('commons_groups_form_group_node_after_build');
+  $form['#attached']['css'] = array(
+    drupal_get_path('module', 'commons_groups') . '/css/commons_groups.css',
+  );
+
+  // Block the subscription field when editing an existing group since there's
+  // currently no hook for changing the actual permissions.
+  if ($form['nid']['#value']) {
+    $form['privacy_settings']['field_og_subscribe_settings']['#disabled'] = TRUE;
+  }
+}
+
+/**
+ * After build callback for the group node form.
+ *
+ * Display the private content checkbox inside the privacy settings field.
+ */
+function commons_groups_form_group_node_after_build($form, $form_state) {
+  $form['privacy_settings']['field_og_subscribe_settings'][LANGUAGE_NONE]['approval']['#suffix'] = render($form['privacy_settings']['field_og_access_default_value']);
+
+  return $form;
+}
+
 /**
  * Implements hook_menu_alter().
  */
@@ -217,6 +283,11 @@ function commons_groups_system_info_alter(&$info, $file, $type) {
       foreach ($group_content_entity_types as $entity_type => $bundles) {
         foreach(array_keys($bundles) as $bundle) {
           $info['features']['field_instance'][] = "$entity_type-$bundle-og_group_ref";
+          if (module_exists('og_access')) {
+            $info['features']['field_instance'][] = "$entity_type-$bundle-field_og_subscribe_settings";
+            $info['features']['field_instance'][] = "$entity_type-$bundle-field_og_access_default_value";
+            $info['features']['field_instance'][] = "$entity_type-$bundle-group-group_access";
+          }
         }
       }
     }
@@ -456,19 +527,88 @@ function commons_groups_default_rules_configuration_alter(&$configs) {
 }
 
 /**
-* Implements hook_node_update().
-*/
+ * Implements hook_node_presave().
+ *
+ * When the node's group is private, force the group content to be private.
+ */
+function commons_groups_node_presave($node) {
+  if (!module_exists('og_access')) {
+    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;
+  foreach (array_keys(og_get_group_audience_fields('node', $node->type)) as $field) {
+    if (empty($node->$field)) {
+      continue;
+    }
+
+    foreach ($wrapper->$field as $group_wrapper) {
+      if (empty($group_wrapper->field_og_access_default_value)) {
+        continue;
+      }
+
+      if ($group_wrapper->field_og_access_default_value->value() == TRUE) {
+        // Once a private group was found, there's no need to continue.
+        $private = TRUE;
+        break 2;
+      }
+    }
+  }
+
+  if ($private) {
+    $wrapper->{OG_CONTENT_ACCESS_FIELD}->set(OG_CONTENT_ACCESS_PRIVATE);
+  }
+}
+
+/**
+ * Implements hook_node_update().
+ */
 function commons_groups_node_update($node) {
   $account = user_load($node->uid);
   commons_groups_first_contribution($account, $node);
+
+  if (og_is_group('node', $node)) {
+    commons_groups_set_group_permissions($node);
+  }
 }
 
 /**
-* Implements hook_node_insert().
-*/
+ * Implements hook_node_insert().
+ */
 function commons_groups_node_insert($node) {
   $account = user_load($node->uid);
   commons_groups_first_contribution($account, $node);
+
+  if (og_is_group('node', $node)) {
+    commons_groups_set_group_permissions($node);
+  }
+}
+
+/**
+ * Set the group's permnissions according to field_og_subscribe_settings.
+ *
+ * @param $node
+ *   A group node.
+ */
+function commons_groups_set_group_permissions($node) {
+  $wrapper = entity_metadata_wrapper('node', $node);
+  $permission = $wrapper->field_og_subscribe_settings->value();
+  $og_roles = og_roles('node', $node->type);
+  $anon_rid = array_search(OG_ANONYMOUS_ROLE, $og_roles);
+
+  $permissions = array(
+    'subscribe' => $permission == 'approval',
+    'subscribe without approval' => $permission == 'anyone',
+  );
+
+  og_role_change_permissions($anon_rid, $permissions);
 }
 
 /**
@@ -550,4 +690,13 @@ function commons_groups_preprocess_views_view_grid(&$variables, $hook) {
   if ($variables['view']->name == 'commons_contributors_group' && !empty($variables['title']) && $variables['title'] == 'administrator member') {
     $variables['title'] = t('Organizers');
   }
-}
\ No newline at end of file
+}
+
+/**
+ * Implements hook_field_access().
+ */
+function commons_groups_field_access($op, $field, $entity_type, $entity, $account) {
+  if ($field['field_name'] == 'og_roles_permissions') {
+    return FALSE;
+  }
+}
