diff --git a/admin_language.install b/admin_language.install
index 78c5901..f3d1cc4 100644
--- a/admin_language.install
+++ b/admin_language.install
@@ -17,6 +17,7 @@ function admin_language_install() {
  * Implements hook_uninstall().
  */
 function admin_language_uninstall() {
+  variable_del('admin_language_enabled');
   variable_del('admin_language_default');
   variable_del('admin_language_force_default');
   variable_del('admin_language_force_neutral');
diff --git a/admin_language.module b/admin_language.module
index 510cfdc..6ce2220 100644
--- a/admin_language.module
+++ b/admin_language.module
@@ -35,6 +35,10 @@ function admin_language_permission() {
       'title' => t('Use all enabled languages'),
       'description' => t('Select any enabled language for use as the administration language'),
     ),
+    'use all allowed languages' => array(
+      'title' => t('Use all allowed languages'),
+      'description' => t('Select any allowed language for use as the administration language'),
+    ),
   );
 }
 
@@ -106,8 +110,9 @@ function admin_language_init() {
     if (_admin_language_switch_language()) {
       global $user;
 
-      if (isset($user->admin_language)) {
-        switch ($user->admin_language) {
+      if (isset($user->data['admin_language'])) {
+        $user_admin_language = $user->data['admin_language'];
+        switch ($user_admin_language) {
           case 'admin':
             // nothing to do, use default value of $admin_language
             break;
@@ -116,8 +121,8 @@ function admin_language_init() {
             $admin_language = $default->language;
             break;
           default:
-            if (isset($languages[$user->admin_language])) {
-              $admin_language = $user->admin_language;
+            if (isset($languages[$user_admin_language])) {
+              $admin_language = $user_admin_language;
             }
         }
       }
@@ -132,7 +137,7 @@ function admin_language_init() {
  * Implements hook_node_presave().
  */
 function admin_language_node_presave($node) {
-  if (!user_access('use all enabled languages')) {
+  if (!user_access('use all enabled languages') && !user_access('use all allowed languages')) {
     if (variable_get('admin_language_force_default', 0)) {
       // force the use of the default site language
       $default = language_default();
@@ -160,6 +165,16 @@ function admin_language_node_update($node) {
 }
 
 /**
+* Implements hook_user_presave().
+*/
+function admin_language_user_presave(&$edit, $account, $category)
+{
+  if (isset($edit['admin_language'])) {
+    $edit['data']['admin_language'] = $edit['admin_language'];
+  }
+}
+
+/**
  * Implements hook_form_alter().
  */
 function admin_language_form_alter(&$form, $form_state, $form_id) {
@@ -208,6 +223,12 @@ function admin_language_form_locale_languages_overview_form_alter(&$form, &$form
     '#default_value' => variable_get('admin_language_default', 'en'),
   );
 
+  $form['admin_language_enabled'] = array(
+      '#type' => 'checkboxes',
+      '#options' => $options,
+      '#default_value' => variable_get('admin_language_enabled', array(variable_get('admin_language_default', 'en'))),
+  );
+  
   // override the default theme function to render the extra field
   $form['#theme'] = 'admin_language_languages_overview_form';
 
@@ -414,6 +435,14 @@ function admin_language_languages_overview_form_validate($form, &$form_state) {
   if (($admin_language != $default->language) && !$enabled) {
     form_set_error('', t('Only enabled languages can be chosen as the admin language.'));
   }
+  
+  $languages = language_list();
+  foreach ($languages as $langcode => $language) {
+    if($form_state['values']['admin_language_enabled'][$langcode] && !$form_state['values']['enabled'][$langcode])
+    {
+      form_set_error('', t('Only enabled languages can be chosen as the admin language.'));
+    }
+  }
 }
 
 /**
@@ -422,6 +451,22 @@ function admin_language_languages_overview_form_validate($form, &$form_state) {
 function admin_language_languages_overview_form_submit($form, &$form_state) {
   $admin_language = $form_state['values']['admin_language'];
   variable_set('admin_language_default', $admin_language);
+  
+  $admin_language_enabled = array();
+  $languages = language_list();
+  foreach ($languages as $langcode => $language) {
+    if ($admin_language == $langcode) {
+      // Automatically enable the default language and the language
+      // which was default previously (because we will not get the
+      // value from that disabled checkbox).
+      $form_state['values']['admin_language_enabled'][$langcode] = 1;
+    }
+    
+    if ($form_state['values']['admin_language_enabled'][$langcode]) {
+      $admin_language_enabled[]=$langcode;
+    }
+  }
+  variable_set('admin_language_enabled', $admin_language_enabled);
 }
 
 /**
@@ -429,7 +474,7 @@ function admin_language_languages_overview_form_submit($form, &$form_state) {
  * add/edit form.
  */
 function admin_language_modify_language_element($form, &$form_state) {
-  if (!user_access('use all enabled languages')) {
+  if (!user_access('use all enabled languages') && !user_access('use all allowed languages')) {
     // remove the administration language from the list of available languages
     if (isset($form['language']['#options']) && count($form['language']['#options']) > 2) {
       $language = variable_get('admin_language_default', 'en');
@@ -463,6 +508,9 @@ function theme_admin_language_languages_overview_form($variables) {
       if ($key == $default->language) {
         $form['enabled'][$key]['#attributes']['disabled'] = 'disabled';
       }
+      if ($key == variable_get('admin_language_default', 'en')) {
+        $form['admin_language_enabled'][$key]['#attributes']['disabled'] = 'disabled';
+      }
       $rows[] = array(
         'data' => array(
           '<strong>' . drupal_render($form['name'][$key]) . '</strong>',
@@ -471,6 +519,7 @@ function theme_admin_language_languages_overview_form($variables) {
           drupal_render($form['direction'][$key]),
           array('data' => drupal_render($form['enabled'][$key]), 'align' => 'center'),
           drupal_render($form['site_default'][$key]),
+          array('data' => drupal_render($form['admin_language_enabled'][$key]), 'align' => 'center'),
           drupal_render($form['admin_language'][$key]),
           drupal_render($form['weight'][$key]),
           l(t('edit'), 'admin/config/regional/language/edit/' . $key) . (($key != 'en' && $key != $default->language) ? ' ' . l(t('delete'), 'admin/config/regional/language/delete/' . $key) : '')
@@ -479,7 +528,7 @@ function theme_admin_language_languages_overview_form($variables) {
       );
     }
   }
-  $header = array(array('data' => t('English name')), array('data' => t('Native name')), array('data' => t('Code')), array('data' => t('Direction')), array('data' => t('Enabled')), array('data' => t('Default')), array('data' => t('Admin')), array('data' => t('Weight')), array('data' => t('Operations')));
+  $header = array(array('data' => t('English name')), array('data' => t('Native name')), array('data' => t('Code')), array('data' => t('Direction')), array('data' => t('Enabled')), array('data' => t('Default')), array('data' => t('Admin allowed')), array('data' => t('Admin default')), array('data' => t('Weight')), array('data' => t('Operations')));
   $output = theme('table', array('header' => $header, 'rows' => $rows, 'attributes' => array('id' => 'language-order')));
   $output .= drupal_render_children($form);
 
@@ -495,9 +544,9 @@ function theme_admin_language_languages_overview_form($variables) {
  */
 function admin_language_preferred($account) {
   $language_list = drupal_map_assoc(array('admin', 'default'));
-  $language_list += language_list();
-  if (isset($account->admin_language) && isset($language_list[$account->admin_language])) {
-    return $account->admin_language;
+  $language_list += language_list();  
+  if (isset($account->data['admin_language']) && isset($language_list[$account->data['admin_language']])) {
+    return $account->data['admin_language'];
   }
   else {
     return 'admin';
@@ -564,6 +613,14 @@ function _admin_language_user_form_add_language_select(&$form) {
       $name = t($item->name);
       $names[$langcode] = $name . ($item->native != $name ? ' (' . $item->native . ')' : '');
     }
+  } 
+  else if (user_access('use all allowed languages')) {
+    $allowed_languages = variable_get('admin_language_enabled', array(variable_get('admin_language_default', 'en')));
+    foreach ($allowed_languages as $langcode) {
+      $item = $languages[$langcode];
+      $name = t($item->name);
+      $names[$langcode] = $name . ($item->native != $name ? ' (' . $item->native . ')' : '');
+    }
   }
 
   $form['admin_language'] = array(
