diff --git a/override_node_options.info b/override_node_options.info
index 6c56826..2e26787 100755
--- a/override_node_options.info
+++ b/override_node_options.info
@@ -2,4 +2,5 @@ name = Override node options
 description = "Allow non-admins to override the default publishing options for nodes they can edit."
 core = 7.x
 package = Permissions
+configure = admin/config/content/override-node-options
 files[] = override_node_options.test
diff --git a/override_node_options.module b/override_node_options.module
index a4e13c0..449b46a 100644
--- a/override_node_options.module
+++ b/override_node_options.module
@@ -10,11 +10,52 @@
  * Implements hook_permission().
  */
 function override_node_options_permission() {
-  $permissions = array();
+  // Global permissions which apply to all node types.
+  $permissions = array(
+    'administer override node options' => array(
+      'title' => t('Administer override node options.'),
+    ),
+  );
+
+  $show_perms = variable_get('override_node_options_permissions', array('general', 'specific'));
+  if (in_array('general', $show_perms, TRUE)) {
+    $permissions += array(
+      'override all published option' => array(
+        'title' => t('Override published option for all node types.'),
+      ),
+      'override all promote to front page option' => array(
+        'title' => t('Override promote to front page option for all node types.'),
+      ),
+      'override all sticky option' => array(
+        'title' => t('Override sticky option for all node types.'),
+      ),
+      'override all revision option' => array(
+        'title' => t('Override revision option for all node types.'),
+      ),
+      'enter all revision log entry' => array(
+        'title' => t('Enter revision log entry for all node types.'),
+      ),
+      'override all authored on option' => array(
+        'title' => t('Override authored on option for all node types.'),
+      ),
+      'override all authored by option' => array(
+        'title' => t('Override authored by option for all node types.'),
+      ),
+    );
+    if (module_exists('comment')) {
+      $permissions += array(
+        'override all comment setting option' => array(
+          'title' => t('Override comment setting option for all node types.'),
+        ),
+      );
+    }
+  }
 
-  // Generate override node permissions for all applicable node types.
-  foreach (node_permissions_get_configured_types() as $type) {
-    $permissions += override_node_options_list_permissions($type);
+  if (in_array('specific', $show_perms, TRUE)) {
+    // Generate override node permissions for all applicable node types.
+    foreach (node_permissions_get_configured_types() as $type) {
+      $permissions += override_node_options_list_permissions($type);
+    }
   }
 
   return $permissions;
@@ -29,37 +70,39 @@ function override_node_options_permission() {
  * @return array
  *   An array of permission names and description.
  */
-function override_node_options_list_permissions($type) {
-  $name = node_type_get_name($type);
+function override_node_options_list_permissions($type, $name = NULL) {
+  if (!$name) {
+    $name = node_type_get_name($type);
+  }
   $type = check_plain($type);
 
   $permissions = array(
-    sprintf('override %s published option', $type) => array(
+    "override $type published option" => array(
       'title' => t('Override %type_name published option.', array('%type_name' => $name)),
     ),
-    sprintf('override %s promote to front page option', $type) => array(
+    "override $type promote to front page option" => array(
       'title' => t('Override %type_name promote to front page option.', array('%type_name' => $name)),
     ),
-    sprintf('override %s sticky option', $type) => array(
+    "override $type sticky option" => array(
       'title' => t('Override %type_name sticky option.', array('%type_name' => $name)),
     ),
-    sprintf('override %s revision option', $type) => array(
+    "override $type revision option" => array(
       'title' => t('Override %type_name revision option.', array('%type_name' => $name)),
     ),
-    sprintf('enter %s revision log entry', $type) => array(
+    "enter $type revision log entry" => array(
       'title' => t('Enter %type_name revision log entry.', array('%type_name' => $name)),
     ),
-    sprintf('override %s authored on option', $type) => array(
+    "override $type authored on option" => array(
       'title' => t('Override %type_name authored on option.', array('%type_name' => $name)),
     ),
-    sprintf('override %s authored by option', $type) => array(
+    "override $type authored by option" => array(
       'title' => t('Override %type_name authored by option.', array('%type_name' => $name)),
     ),
   );
 
   if (module_exists('comment')) {
     $permissions += array(
-      sprintf('override %s comment setting option', $type) => array(
+      "override $type comment setting option" => array(
         'title' => t('Override %type_name comment setting option.', array('%type_name' => $name)),
       ),
     );
@@ -69,6 +112,112 @@ function override_node_options_list_permissions($type) {
 }
 
 /**
+ * Implements hook_menu().
+ */
+function override_node_options_menu() {
+  $items['admin/config/content/override-node-options'] = array(
+    'title' => 'Override Node Options Settings',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('override_node_options_settings_form'),
+    'access arguments' => array('administer override node options'),
+    'type' => MENU_NORMAL_ITEM,
+  );
+
+  return $items;
+}
+
+/**
+ * Settings form.
+ */
+function override_node_options_settings_form($form, &$form_values) {
+  $form = array();
+
+  $form['override_node_options_permissions'] = array(
+    '#type' => 'checkboxes',
+    '#title' => t('Provide the following permissions:'),
+    '#options' => array(
+      'general' => t('General permissions, accross all node types'),
+      'specific' => t('Specific permissions, for each individual node type'),
+    ),
+    '#default_value' => variable_get('override_node_options_permissions', array('general', 'specific')),
+  );
+
+  $form['#submit'][] = 'override_node_options_settings_form_submit';
+
+  return system_settings_form($form);
+}
+
+/**
+ * Submit handler for settings form.
+ */
+function override_node_options_settings_form_submit(&$form, &$form_state) {
+  // Get old perms to compare.
+  $old_perms = variable_get('override_node_options_permissions', array('general', 'specific'));
+  $new_perms = $form_state['values']['override_node_options_permissions'];
+
+  // Clean up saved permissions.
+  $role_names = user_roles();
+  $revoke = array();
+
+  if (!in_array('specific', $new_perms, TRUE) && in_array('specific', $old_perms, TRUE)) {
+    $alert = TRUE;
+    $permissions = array();
+    foreach (node_permissions_get_configured_types() as $type) {
+      $permissions += override_node_options_list_permissions($type);
+    }
+
+    foreach ($permissions as $permission => $description) {
+      $revoke[$permission] = FALSE;
+    }
+
+    // Be sure to clear the cache.
+    cache_clear_all();
+  }
+
+  if (!in_array('general', $new_perms, TRUE) && in_array('general', $old_perms, TRUE)) {
+    $alert = TRUE;
+    $revoke = array(
+      'override all published option' => FALSE,
+      'override all promote to front page option' => FALSE,
+      'override all sticky option' => FALSE,
+      'override all revision option' => FALSE,
+      'enter all revision log entry' => FALSE,
+      'override all authored on option' => FALSE,
+      'override all authored by option' => FALSE,
+    );
+    if (module_exists('comment')) {
+      $revoke['override all comment setting option'] = FALSE;
+    }
+  }
+
+  // Any specific grants not used anymore need to be deleted.
+  if (!empty($revoke)) {
+    foreach ($role_names as $rid => $name) {
+      user_role_change_permissions($rid, $revoke);
+    }
+  }
+
+  // Set a helpful message.
+  $message = 'Configuration saved.';
+  $arguments = array();
+  $status = 'status';
+
+  if ($alert) {
+    if (user_access('administer permissions')) {
+      $arguments = array('!permissions' => l(t('the permissions page'), 'admin/config/people/permissions', array('fragment' => 'module-override_node_options')));
+      $message .= t(' Please visit !permissions and double check access.');
+      $status = 'warning';
+    }
+    else {
+      $message .= t(' Please visit the permissions page and double check access.');
+    }
+  }
+
+  drupal_set_message(t($message, $arguments), $status);
+}
+
+
+/**
  * Implements hook_form_alter().
  */
 function override_node_options_form_alter(&$form, &$form_state, $form_id) {
@@ -76,17 +225,16 @@ function override_node_options_form_alter(&$form, &$form_state, $form_id) {
     // Get a copy of the current node object.
     $node = $form['#node'];
 
-    // Add access to the 'Revision information: log message' field.
-    $form['revision_information']['log']['#access'] = user_access(sprintf('enter %s revision log entry', $node->type));
+    // Add access to the 'Revision information: log message' field
+    $form['revision_information']['log']['#access'] = user_access('enter ' . $node->type . ' revision log entry') || user_access('enter all revision log entry');
 
     // Add access to the 'Revision information' fieldset.
-    $form['revision_information']['revision']['#access'] = user_access(sprintf('override %s revision option', $node->type));
+    $form['revision_information']['revision']['#access'] = user_access('override ' . $node->type . ' revision option') || user_access('override all revision option');
     $form['revision_information']['#access'] = element_get_visible_children($form['revision_information']);
 
     // Add access to the 'Authoring information' fieldset.
-    $form['author']['name']['#access'] = user_access(sprintf('override %s authored by option', $node->type));
-    $form['author']['date']['#access'] = user_access(sprintf('override %s authored on option', $node->type));
-
+    $form['author']['name']['#access'] = user_access('override ' . $node->type . ' authored by option') || user_access('override all authored by option');
+    $form['author']['date']['#access'] = user_access('override ' . $node->type . ' authored on option') || user_access('override all authored on option');
     if (array_key_exists('#access', $form['author'])) {
       $form['author']['#access'] |= element_get_visible_children($form['author']);
     }
@@ -106,6 +254,9 @@ function override_node_options_form_alter(&$form, &$form_state, $form_id) {
       $form['options']['status']['#disabled'] = TRUE;
     }
 
+    $form['options']['status']['#access'] = user_access('override ' . $node->type . ' published option') || user_access('override all published option');
+    $form['options']['promote']['#access'] = user_access('override ' . $node->type . ' promote to front page option') || user_access('override all promote to front page option');
+    $form['options']['sticky']['#access'] = user_access('override ' . $node->type . ' sticky option') || user_access('override all sticky option');
     if (array_key_exists('#access', $form['options'])) {
       $form['options']['#access'] |= element_get_visible_children($form['options']);
     }
@@ -115,7 +266,7 @@ function override_node_options_form_alter(&$form, &$form_state, $form_id) {
 
     // Add access to the 'Comment settings' fieldset.
     if (module_exists('comment') && isset($form['comment_settings'])) {
-      $form['comment_settings']['#access'] |= user_access(sprintf('override %s comment setting option', $node->type));
+      $form['comment_settings']['#access'] |= user_access('override ' . $node->type . ' comment setting option') || user_access('override all comment setting option');
     }
 
     // @todo Remove when http://drupal.org/node/683630 is fixed.
diff --git a/override_node_options.test b/override_node_options.test
index 9ca1d79..9f74f1a 100644
--- a/override_node_options.test
+++ b/override_node_options.test
@@ -10,8 +10,14 @@
  */
 class OverrideNodeOptionsTestCase extends DrupalWebTestCase {
 
+  /**
+   * @var stdClass
+   */
   protected $normalUser;
-  protected $adminUser;
+
+  /**
+   * @var stdClass
+   */
   protected $node;
 
   /**
@@ -30,6 +36,7 @@ class OverrideNodeOptionsTestCase extends DrupalWebTestCase {
    */
   public function setUp() {
     parent::setUp('override_node_options');
+
     $this->normalUser = $this->drupalCreateUser(array('create page content', 'edit any page content'));
     $this->node = $this->drupalCreateNode();
   }
@@ -83,7 +90,7 @@ class OverrideNodeOptionsTestCase extends DrupalWebTestCase {
    * Test the 'Authoring information' fieldset.
    */
   protected function testNodeOptions() {
-    $this->adminUser = $this->drupalCreateUser(array(
+    $specificUser = $this->drupalCreateUser(array(
       'create page content',
       'edit any page content',
       'override page published option',
@@ -91,16 +98,28 @@ class OverrideNodeOptionsTestCase extends DrupalWebTestCase {
       'override page sticky option',
       'override page comment setting option',
     ));
-    $this->drupalLogin($this->adminUser);
 
-    $fields = array(
-      'status' => (bool) !$this->node->status,
-      'promote' => (bool) !$this->node->promote,
-      'sticky' => (bool) !$this->node->sticky,
-      'comment' => COMMENT_NODE_OPEN,
-    );
-    $this->drupalPost('node/' . $this->node->nid . '/edit', $fields, t('Save'));
-    $this->assertNodeFieldsUpdated($this->node, $fields);
+    $generalUser = $this->drupalCreateUser(array(
+      'create page content',
+      'edit any page content',
+      'override all published option',
+      'override all promote to front page option',
+      'override all sticky option',
+      'override all comment setting option',
+    ));
+
+    foreach (array($specificUser, $generalUser) as $account) {
+      $this->drupalLogin($account);
+
+      $fields = array(
+        'status' => (bool) !$this->node->status,
+        'promote' => (bool) !$this->node->promote,
+        'sticky' => (bool) !$this->node->sticky,
+        'comment' => COMMENT_NODE_OPEN,
+      );
+      $this->drupalPost('node/' . $this->node->nid . '/edit', $fields, t('Save'));
+      $this->assertNodeFieldsUpdated($this->node, $fields);
+    }
 
     $this->drupalLogin($this->normalUser);
     $this->assertNodeFieldsNoAccess($this->node, array_keys($fields));
@@ -110,18 +129,30 @@ class OverrideNodeOptionsTestCase extends DrupalWebTestCase {
    * Test the 'Revision information' fieldset.
    */
   protected function testNodeRevisions() {
-    $this->adminUser = $this->drupalCreateUser(array(
+    $specificUser = $this->drupalCreateUser(array(
       'create page content',
       'edit any page content',
       'override page revision option',
     ));
-    $this->drupalLogin($this->adminUser);
 
-    $fields = array(
-      'revision' => TRUE,
-    );
-    $this->drupalPost('node/' . $this->node->nid . '/edit', $fields, t('Save'));
-    $this->assertNodeFieldsUpdated($this->node, array('vid' => $this->node->vid + 1));
+    $generalUser = $this->drupalCreateUser(array(
+      'create page content',
+      'edit any page content',
+      'override all revision option',
+    ));
+
+    foreach (array($specificUser, $generalUser) as $account) {
+      $this->drupalLogin($account);
+
+      // Ensure that we have the latest node data.
+      $node = node_load($this->node->nid, NULL, TRUE);
+
+      $fields = array(
+        'revision' => TRUE,
+      );
+      $this->drupalPost('node/' . $node->nid . '/edit', $fields, t('Save'));
+      $this->assertNodeFieldsUpdated($node, array('vid' => $node->vid + 1));
+    }
 
     $this->drupalLogin($this->normalUser);
     $this->assertNodeFieldsNoAccess($this->node, array_keys($fields));
@@ -131,27 +162,37 @@ class OverrideNodeOptionsTestCase extends DrupalWebTestCase {
    * Test the 'Authoring information' fieldset.
    */
   protected function testNodeAuthor() {
-    $this->adminUser = $this->drupalCreateUser(array(
+    $specificUser = $this->drupalCreateUser(array(
       'create page content',
       'edit any page content',
       'override page authored on option',
       'override page authored by option',
     ));
-    $this->drupalLogin($this->adminUser);
 
-    $this->drupalPost('node/' . $this->node->nid . '/edit', array('name' => 'invalid-user'), t('Save'));
-    $this->assertText('The username invalid-user does not exist.');
+    $generalUser = $this->drupalCreateUser(array(
+      'create page content',
+      'edit any page content',
+      'override all authored on option',
+      'override all authored by option',
+    ));
 
-    $this->drupalPost('node/' . $this->node->nid . '/edit', array('date' => 'invalid-date'), t('Save'));
-    $this->assertText('You have to specify a valid date.');
+    foreach (array($specificUser, $generalUser) as $account) {
+      $this->drupalLogin($account);
 
-    $time = time() + 500;
-    $fields = array(
-      'name' => '',
-      'date' => format_date($time, 'custom', 'Y-m-d H:i:s O'),
-    );
-    $this->drupalPost('node/' . $this->node->nid . '/edit', $fields, t('Save'));
-    $this->assertNodeFieldsUpdated($this->node, array('uid' => 0, 'created' => $time));
+      $this->drupalPost('node/' . $this->node->nid . '/edit', array('name' => 'invalid-user'), t('Save'));
+      $this->assertText('The username invalid-user does not exist.');
+
+      $this->drupalPost('node/' . $this->node->nid . '/edit', array('date' => 'invalid-date'), t('Save'));
+      $this->assertText('You have to specify a valid date.');
+
+      $time = time() + 500;
+      $fields = array(
+        'name' => '',
+        'date' => format_date($time, 'custom', 'Y-m-d H:i:s O'),
+      );
+      $this->drupalPost('node/' . $this->node->nid . '/edit', $fields, t('Save'));
+      $this->assertNodeFieldsUpdated($this->node, array('uid' => 0, 'created' => $time));
+    }
 
     $this->drupalLogin($this->normalUser);
     $this->assertNodeFieldsNoAccess($this->node, array_keys($fields));
