diff --git a/pathauto.api.php b/pathauto.api.php
index 41f1154..0d640de 100644
--- a/pathauto.api.php
+++ b/pathauto.api.php
@@ -28,16 +28,18 @@ function hook_pathauto($op) {
  *     This can be altered by reference.
  *   - 'data': An array of keyed objects to pass to token_replace().
  *   - 'type': The sub-type or bundle of the object being aliased.
- *   - 'language': A string of the language code for the alias (e.g. 'en').
+ *   - 'langcode': A string of the language code for the alias (e.g. 'en').
  *     This can be altered by reference.
  *   - 'pattern': A string of the pattern used for aliasing the object.
+ *
+ * @see pathauto_create_alias()
  */
 function hook_pathauto_alias_alter(&$alias, array &$context) {
   // Add a suffix so that all aliases get saved as 'content/my-title.html'
   $alias .= '.html';
 
   // Force all aliases to be saved as language neutral.
-  $context['language'] = LANGUAGE_NONE;
+  $context['langcode'] = LANGUAGE_NONE;
 }
 
 /**
diff --git a/pathauto.inc b/pathauto.inc
index 9f98eec..fa9107f 100644
--- a/pathauto.inc
+++ b/pathauto.inc
@@ -59,16 +59,16 @@ define('PATHAUTO_PUNCTUATION_DO_NOTHING', 2);
  *   A string alias.
  * @param $source
  *   A string that is the internal path.
- * @param $language
- *   A string indicating the path's language.
+ * @param $langcode
+ *   (optional) The language code.
  * @return
  *   TRUE if an alias exists, FALSE if not.
  */
-function _pathauto_alias_exists($alias, $source, $language = LANGUAGE_NONE) {
+function _pathauto_alias_exists($alias, $source, $langcode = LANGUAGE_NONE) {
   $pid = db_query_range("SELECT pid FROM {url_alias} WHERE source <> :source AND alias = :alias AND language IN (:language, :language_none) ORDER BY language DESC, pid DESC", 0, 1, array(
     ':source' => $source,
     ':alias' => $alias,
-    ':language' => $language,
+    ':language' => $langcode,
     ':language_none' => LANGUAGE_NONE,
   ))->fetchField();
 
@@ -80,16 +80,16 @@ function _pathauto_alias_exists($alias, $source, $language = LANGUAGE_NONE) {
  *
  * @param $source
  *   An internal Drupal path.
- * @param $language
- *   An optional language code to look up the path in.
+ * @param $langcode
+ *   (optional) The language code.
  * @return
  *   FALSE if no alias was found or an associative array containing the
  *   following keys:
  *   - pid: Unique path alias identifier.
  *   - alias: The URL alias.
  */
-function _pathauto_existing_alias_data($source, $language = LANGUAGE_NONE) {
-  $pid = db_query_range("SELECT pid FROM {url_alias} WHERE source = :source AND language IN (:language, :language_none) ORDER BY language DESC, pid DESC", 0, 1, array(':source' => $source, ':language' => $language, ':language_none' => LANGUAGE_NONE))->fetchField();
+function _pathauto_existing_alias_data($source, $langcode = LANGUAGE_NONE) {
+  $pid = db_query_range("SELECT pid FROM {url_alias} WHERE source = :source AND language IN (:language, :language_none) ORDER BY language DESC, pid DESC", 0, 1, array(':source' => $source, ':language' => $langcode, ':language_none' => LANGUAGE_NONE))->fetchField();
   return path_load(array('pid' => $pid));
 }
 
@@ -326,17 +326,17 @@ function pathauto_clean_alias($alias) {
  *   For modules which provided pattern items in hook_pathauto(),
  *   the relevant identifier for the specific item to be aliased
  *   (e.g., $node->type).
- * @param $language
- *   A string specify the path's language.
+ * @param $langcode
+ *   (optional) The language code to use when saving the automatic alias.
  * @return
  *   The alias that was created.
  *
  * @see _pathauto_set_alias()
  * @see token_replace()
  */
-function pathauto_create_alias($module, $op, $source, $data, $type = NULL, $language = LANGUAGE_NONE) {
+function pathauto_create_alias($module, $op, $source, $data, $type = NULL, $langcode = LANGUAGE_NONE) {
   // Retrieve and apply the pattern for this content type.
-  $pattern = pathauto_pattern_load_by_entity($module, $type, $language);
+  $pattern = pathauto_pattern_load_by_entity($module, $type, $langcode);
   if (empty($pattern)) {
     // No pattern? Do nothing (otherwise we may blow away existing aliases...)
     return '';
@@ -345,7 +345,7 @@ function pathauto_create_alias($module, $op, $source, $data, $type = NULL, $lang
   // Special handling when updating an item which is already aliased.
   $existing_alias = NULL;
   if ($op == 'update' || $op == 'bulkupdate') {
-    if ($existing_alias = _pathauto_existing_alias_data($source, $language)) {
+    if ($existing_alias = _pathauto_existing_alias_data($source, $langcode)) {
       switch (variable_get('pathauto_update_action', PATHAUTO_UPDATE_ACTION_DELETE)) {
         case PATHAUTO_UPDATE_ACTION_NO_NEW:
           // If an alias already exists, and the update action is set to do nothing,
@@ -356,11 +356,12 @@ function pathauto_create_alias($module, $op, $source, $data, $type = NULL, $lang
   }
 
   // Replace any tokens in the pattern. Uses callback option to clean replacements. No sanitization.
+  $language = _pathauto_language_load($langcode);
   $alias = token_replace($pattern, $data, array(
     'sanitize' => FALSE,
     'clear' => TRUE,
     'callback' => 'pathauto_clean_token_values',
-    'language' => (object) array('language' => $language),
+    'language' => !empty($language) ? $language : NULL,
     'pathauto' => TRUE,
   ));
 
@@ -381,7 +382,8 @@ function pathauto_create_alias($module, $op, $source, $data, $type = NULL, $lang
     'source' => &$source,
     'data' => $data,
     'type' => $type,
-    'language' => &$language,
+    'language' => &$langcode, // Deprecated
+    'langcode' => &$langcode,
     'pattern' => $pattern,
   );
   drupal_alter('pathauto_alias', $alias, $context);
@@ -393,7 +395,7 @@ function pathauto_create_alias($module, $op, $source, $data, $type = NULL, $lang
 
   // If the alias already exists, generate a new, hopefully unique, variant.
   $original_alias = $alias;
-  pathauto_alias_uniquify($alias, $source, $language);
+  pathauto_alias_uniquify($alias, $source, $langcode);
   if ($original_alias != $alias) {
     // Alert the user why this happened.
     _pathauto_verbose(t('The automatically generated alias %original_alias conflicted with an existing alias. Alias changed to %alias.', array(
@@ -411,7 +413,7 @@ function pathauto_create_alias($module, $op, $source, $data, $type = NULL, $lang
   $path = array(
     'source' => $source,
     'alias' => $alias,
-    'language' => $language,
+    'language' => $langcode,
   );
   $path = _pathauto_set_alias($path, $existing_alias, $op);
   return $path;
@@ -687,3 +689,17 @@ function _pathauto_get_schema_alias_maxlength() {
   }
   return $maxlength;
 }
+
+/**
+ * Loads a language object from the database.
+ *
+ * @param $langcode
+ *   The language code.
+ *
+ * @return
+ *   A fully-populated language object or FALSE if the language was not found.
+ */
+function _pathauto_language_load($langcode) {
+  $languages = language_list();
+  return !empty($langcode) && isset($languages[$langcode]) ? $languages[$langcode] : FALSE;
+}
diff --git a/pathauto.module b/pathauto.module
index b827bc3..62f4ad0 100644
--- a/pathauto.module
+++ b/pathauto.module
@@ -137,17 +137,17 @@ function pathauto_menu() {
  *   An entity (e.g. node, taxonomy, user, etc.)
  * @param $bundle
  *   A bundle (e.g. content type, vocabulary ID, etc.)
- * @param $language
- *   A language code, defaults to the LANGUAGE_NONE constant.
+ * @param $langcode
+ *   (optional) The language code, defaults to LANGUAGE_NONE.
  */
-function pathauto_pattern_load_by_entity($entity, $bundle = '', $language = LANGUAGE_NONE) {
+function pathauto_pattern_load_by_entity($entity, $bundle = '', $langcode = LANGUAGE_NONE) {
   $patterns = &drupal_static(__FUNCTION__, array());
 
-  $pattern_id = "$entity:$bundle:$language";
+  $pattern_id = "$entity:$bundle:$langcode";
   if (!isset($patterns[$pattern_id])) {
     $variables = array();
-    if ($language != LANGUAGE_NONE) {
-      $variables[] = "pathauto_{$entity}_{$bundle}_{$language}_pattern";
+    if ($langcode != LANGUAGE_NONE) {
+      $variables[] = "pathauto_{$entity}_{$bundle}_{$langcode}_pattern";
     }
     if ($bundle) {
       $variables[] = "pathauto_{$entity}_{$bundle}_pattern";
@@ -462,17 +462,22 @@ function pathauto_node_update_alias(stdClass $node, $op, array $options = array(
   }
 
   $options += array(
-    'language' => isset($node->language) ? $node->language : LANGUAGE_NONE,
+    'langcode' => isset($node->language) ? $node->language : LANGUAGE_NONE,
   );
 
+  // The 'language' option is deprecated in favor of 'langcode'
+  if (isset($options['language'])) {
+    $options['langcode'] = $options['language'];
+  }
+
   // Skip processing if the node has no pattern.
-  if (!pathauto_pattern_load_by_entity('node', $node->type, $options['language'])) {
+  if (!pathauto_pattern_load_by_entity('node', $node->type, $options['langcode'])) {
     return;
   }
 
   module_load_include('inc', 'pathauto');
   $uri = entity_uri('node', $node);
-  pathauto_create_alias('node', $op, $uri['path'], array('node' => $node), $node->type, $options['language']);
+  pathauto_create_alias('node', $op, $uri['path'], array('node' => $node), $node->type, $options['langcode']);
 }
 
 /**
@@ -558,9 +563,14 @@ function pathauto_taxonomy_term_update_alias(stdClass $term, $op, array $options
 
   $options += array(
     'alias children' => FALSE,
-    'language' => isset($term->language) ? $term->language : LANGUAGE_NONE,
+    'langcode' => isset($term->language) ? $term->language : LANGUAGE_NONE,
   );
 
+  // The 'language' option is deprecated in favor of 'langcode'
+  if (isset($options['language'])) {
+    $options['langcode'] = $options['language'];
+  }
+
   $module = 'taxonomy_term';
   if ($term->vid == variable_get('forum_nav_vocabulary', '')) {
     if (module_exists('forum')) {
@@ -578,13 +588,13 @@ function pathauto_taxonomy_term_update_alias(stdClass $term, $op, array $options
   }
 
   // Skip processing if the term has no pattern.
-  if (!pathauto_pattern_load_by_entity($module, $term->vocabulary_machine_name)) {
+  if (!pathauto_pattern_load_by_entity($module, $term->vocabulary_machine_name, $options['langcode'])) {
     return;
   }
 
   module_load_include('inc', 'pathauto');
   $uri = entity_uri('taxonomy_term', $term);
-  pathauto_create_alias($module, $op, $uri['path'], array('term' => $term), $term->vocabulary_machine_name, $options['language']);
+  pathauto_create_alias($module, $op, $uri['path'], array('term' => $term), $term->vocabulary_machine_name, $options['langcode']);
 
   if (!empty($options['alias children'])) {
     // For all children generate new aliases.
@@ -682,17 +692,23 @@ function pathauto_user_update_alias(stdClass $account, $op, array $options = arr
 
   $options += array(
     'alias blog' => module_exists('blog'),
-    'language' => LANGUAGE_NONE,
+    'langcode' => LANGUAGE_NONE,
   );
 
+  // The 'language' option is deprecated in favor of 'langcode'
+  if (isset($options['language'])) {
+    $options['langcode'] = $options['language'];
+    unset($options['language']);
+  }
+
   // Skip processing if the account has no pattern.
-  if (!pathauto_pattern_load_by_entity('user', '', $options['language'])) {
+  if (!pathauto_pattern_load_by_entity('user', '', $options['langcode'])) {
     return;
   }
 
   module_load_include('inc', 'pathauto');
   $uri = entity_uri('user', $account);
-  pathauto_create_alias('user', $op, $uri['path'], array('user' => $account), NULL, $options['language']);
+  pathauto_create_alias('user', $op, $uri['path'], array('user' => $account), NULL, $options['langcode']);
 
   // Because blogs are also associated with users, also generate the blog paths.
   if (!empty($options['alias blog'])) {
@@ -736,18 +752,24 @@ function pathauto_user_update_alias_multiple(array $uids, $op, array $options =
  *   An optional array of additional options.
  */
 function pathauto_blog_update_alias(stdClass $account, $op, array $options = array()) {
+  $options += array(
+    'langcode' => LANGUAGE_NONE,
+  );
+
+  // The 'language' option is deprecated in favor of 'langcode'
+  if (isset($options['language'])) {
+    $options['langcode'] = $options['language'];
+    unset($options['language']);
+  }
+
   // Skip processing if the blog has no pattern.
-  if (!pathauto_pattern_load_by_entity('blog')) {
+  if (!pathauto_pattern_load_by_entity('blog', '', $options['langcode'])) {
     return;
   }
 
-  $options += array(
-    'language' => LANGUAGE_NONE,
-  );
-
   module_load_include('inc', 'pathauto');
   if (node_access('create', 'blog', $account)) {
-    pathauto_create_alias('blog', $op, "blog/{$account->uid}", array('user' => $account), NULL, $options['language']);
+    pathauto_create_alias('blog', $op, "blog/{$account->uid}", array('user' => $account), NULL, $options['langcode']);
   }
   else {
     pathauto_path_delete_all("blog/{$account->uid}");
