diff --git a/oauth_common.authorizations.inc b/oauth_common.authorizations.inc
index 55bf8e7..3c9dd45 100644
--- a/oauth_common.authorizations.inc
+++ b/oauth_common.authorizations.inc
@@ -82,19 +82,20 @@ function oauth_common_page_user_authorizations($account) {
 function oauth_common_authorization_add($account, $consumer) {
   $token = new DrupalOAuthToken(user_password(32), user_password(32), $consumer, array(
     'uid' => $account->uid,
+    'type' => OAUTH_COMMON_TOKEN_TYPE_ACCESS,
   ));
   return drupal_get_form('oauth_common_form_authorization', $token);
 }
 
 /**
- * Provide a form to edit and add authorizations. 
+ * Provide a form to edit and add authorizations.
  *
- * Despite what appears above, this function is actually invoked by 
- * `drupal_retrieve_form` (by way of `drupal_build_form`, by way of 
- * `drupal_get_form`), so the second argument isn't the token, but a reference 
- * to the form state. Luckily, PHP made that incredibly non-obvious by 
- * neglecting to notify me that this function was being called with one too few 
- * arguments. Go team.
+ * Despite what appears above, this function is actually invoked by
+ * `drupal_retrieve_form` (by way of `drupal_build_form`, by way of
+ * `drupal_get_form`), so the second argument isn't the token, but a reference
+ * to the form state. Luckily, PHP made that incredibly non-obvious by
+ * neglecting to notify me that this function was being called with one too few
+ * Provide a form to edit and add authorizations.
  */
 function oauth_common_form_authorization($form_id, &$form_state, $token) {
   $form = array();
@@ -159,13 +160,14 @@ function oauth_common_form_authorization($form_id, &$form_state, $token) {
     );
   }
 
-  $form['allowed'] = array(
+  $form['levels'] = array(
     '#type' => 'fieldset',
     '#title' => t('Permissions'),
+    '#tree' => TRUE,
   );
 
   global $user;
-  oauth_common_permissions_form($user, $form['allowed'], $consumer, $context, $token->services);
+  oauth_common_permissions_form($user, $form['levels'], $consumer, $context, $token->services);
 
   $form['actions'] = array('#type' => 'actions');
   $form['actions']['submit'] = array(
@@ -194,6 +196,13 @@ function oauth_common_permissions_form($account, &$form, $consumer, $context, $d
     '@sitename' => variable_get('site_name', ''),
   );
 
+  $form['*'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('All'),
+    '#description' => t('Grant access to all services provided by @appname.', $tvars),
+    '#default_value' => in_array('*', $default_services),
+  );
+
   if ($context) {
     foreach ($context->authorization_levels as $name => $level) {
       $auth_opt = array(
@@ -201,8 +210,13 @@ function oauth_common_permissions_form($account, &$form, $consumer, $context, $d
         '#title' => t($level['title'], $tvars),
         '#description' => t($level['description'], $tvars),
         '#default_value' => in_array($name, $default_services),
+        '#states' => array(
+          'disabled' => array(
+            ':input[name="levels[*]"]' => array('checked' => TRUE),
+          ),
+        ),
       );
-      $form['authorization']['levels'][$name] = $auth_opt;
+      $form[$name] = $auth_opt;
     }
   }
 }
@@ -214,7 +228,12 @@ function oauth_common_form_authorization_submit($form, &$form_state) {
 
   // Collect the authorization levels
   if (isset($values['levels'])) {
-    $token->services = array_keys(array_filter($values['levels']));
+    if ($values['levels']['*']) {
+      $token->services = array('*');
+    }
+    else {
+      $token->services = array_keys(array_filter($values['levels']));
+    }
   }
 
   $token->authorized = $values['authorized'];
@@ -224,7 +243,7 @@ function oauth_common_form_authorization_submit($form, &$form_state) {
     '@consumer' => $consumer->name,
     '@token' => $token->key)));
 
-  drupal_goto(sprintf('user/%d/applications', $token->uid));
+  drupal_goto(sprintf('user/%d/oauth/authorizations', $token->uid));
 }
 
 /**
@@ -293,4 +312,5 @@ function oauth_common_form_authorization_delete_submit($form, &$form_state) {
   drupal_set_message(t('The @consumer token @token was deleted.', array(
     '@consumer' => $consumer->name,
     '@token' => $token->key)));
+  $form_state['redirect'] = sprintf('user/%d/oauth/authorizations', $token->uid);
 }
