diff -up ./pathauto.inc ../pathauto6x/pathauto.inc
--- ./pathauto.inc	2008-06-08 00:53:31.000000000 +0200
+++ ../pathauto6x/pathauto.inc	2008-05-30 02:47:59.000000000 +0200
@@ -343,13 +343,11 @@ function pathauto_create_alias($module, 
  *   TRUE if the path already exists.
  */
 function _pathauto_path_is_callback($path) {
-  static $menu = NULL;
-  if (is_null($menu)) {
-    $menu = menu_get_menu();
+  $menu = menu_get_item($path);
+  if (isset($menu['path']) && $menu['path'] == $path) {
+    return TRUE;
   }
-
-  // Determine the menu item containing the callback.
-  return isset($menu["callbacks"][$path]);
+  return FALSE;
 }
 
 /**
diff -up ./pathauto.js ../pathauto6x/pathauto.js
--- ./pathauto.js	2008-06-07 12:53:41.000000000 +0200
+++ ../pathauto6x/pathauto.js	2008-03-06 03:56:05.000000000 +0100
@@ -2,21 +2,21 @@
 if (Drupal.jsEnabled) {
   $(document).ready(function() {
     if ($("#edit-pathauto-perform-alias").size() && $("#edit-pathauto-perform-alias").attr("checked")) {
       // Disable input and hide its description.
       $("#edit-path").attr("disabled","disabled");
-      $("//#edit-path ~ div[@class=description]").hide(0);
+      $("#edit-path-wrapper > div.description").hide(0);
     }
     $("#edit-pathauto-perform-alias").bind("click", function() {
       if ($("#edit-pathauto-perform-alias").attr("checked")) {
         // Auto-alias checked; disable input.
         $("#edit-path").attr("disabled","disabled");
-        $("//#edit-path ~ div[@class=description]").slideUp('slow');
+        $("#edit-path-wrapper > div[@class=description]").slideUp('fast');
       }
       else {
         // Auto-alias unchecked; enable input.
         $("#edit-path").removeAttr("disabled");
         $("#edit-path")[0].focus();
-        $("//#edit-path ~ div[@class=description]").slideDown('slow');
+        $("#edit-path-wrapper > div[@class=description]").slideDown('fast');
       }
     });
   });
diff -up ./pathauto.module ../pathauto6x/pathauto.module
--- ./pathauto.module	2008-06-08 00:53:31.000000000 +0200
+++ ../pathauto6x/pathauto.module	2008-06-08 00:57:10.000000000 +0200
@@ -134,16 +133,9 @@ function pathauto_token_values($type, $o
             }
             $values[$label .'path'] = $catpath .'/'. check_plain($category->name);
             $values[$label .'path-raw'] = $catpath_raw .'/'. $category->name;
-
-            // We only do this for taxonomy because token already provides the [term] value but has problem with [cat] TODO: fix that?
-            if ($type == 'taxonomy') {
-              $values[$label] = check_plain($category->name);
-              $values[$label .'-raw'] = $category->name;
-            }
-
             $values[$label .'alias'] = drupal_get_path_alias('taxonomy/term/'. $category->tid);
             if (!strncasecmp($values[$label .'alias'], 'taxonomy', 8)) {
-              $values[$label .'alias'] = $values[$label];
+              $values[$label .'alias'] = check_plain($category->name);
             }
           }
           else { // Provide some defaults if they aren't set.
@@ -215,12 +207,30 @@ function pathauto_nodeapi(&$node, $op, $
   _pathauto_include();
   if (module_exists('path')) {
     switch ($op) {
+      case 'presave':
+        // About to be saved (before insert/update)
+        if (isset($node->pathauto_perform_alias) && isset($node->old_alias)
+            && $node->pathauto_perform_alias && $node->path == '' && $node->old_alias != '') {
+          /**
+           * There was an old alias, but when pathauto_perform_alias was checked
+           * the javascript disabled the textbox which led to an empty value being
+           * submitted. Restoring the old path-value here prevents the Path module
+           * from deleting any old alias before Pathauto gets control.
+           */
+          $node->path = $node->old_alias;
+        }
+        break;
       case 'insert':
       case 'update':
         // Get the specific pattern or the default
-        $pattern = variable_get('pathauto_node_'. $node->type .'_pattern', FALSE);
-        if (!$pattern) {
-          $pattern = variable_get('pathauto_node_pattern', FALSE);
+        if (!empty($node->language)) {
+          $pattern = variable_get('pathauto_node_'. $node->type .'_'. $node->language .'_pattern', FALSE);
+        }
+        if (!trim($pattern)) {
+          $pattern = variable_get('pathauto_node_'. $node->type .'_pattern', FALSE);
+          if (!trim($pattern)) {
+            $pattern = variable_get('pathauto_node_pattern', FALSE);
+          }
         }
         // Only do work if there's a pattern
         if ($pattern) {
@@ -249,30 +259,41 @@ function pathauto_nodeapi(&$node, $op, $
  * own aliases (Pathauto will be invisible to other users). Inserted
  * into the path module's fieldset in the node form.
  */
-function pathauto_form_alter($formid, &$form) {
+function pathauto_form_alter(&$form, $form_state, $form_id) {
   // Only do this for node forms
   if (isset($form['#id']) && ($form['#id'] == 'node-form') && arg(0) == 'node') {
     // See if there is a pathauto pattern or default applicable
-    $pattern = variable_get('pathauto_node_'. $form['type']['#value'] .'_pattern', FALSE);
-    if (!$pattern) {
-      $pattern = variable_get('pathauto_node_pattern', FALSE);
+    if (isset($form['language'])) {
+      $language = isset($form['language']['#value']) ? $form['language']['#value'] : $form['language']['#default_value'];
+      $pattern = variable_get('pathauto_node_'. $form['type']['#value'] .'_'. $language .'_pattern', FALSE);
+    }
+    if (!trim($pattern)) {
+      $pattern = variable_get('pathauto_node_'. $form['type']['#value'] .'_pattern', FALSE);
+      if (!trim($pattern)) {
+        $pattern = variable_get('pathauto_node_pattern', FALSE);
+      }
     }
     // If there is a pattern AND the user is allowed to create aliases AND the path textbox is present on this form
     if ($pattern && user_access('create url aliases') && isset($form['path']['path'])) {
       $output = t('An alias will be generated for you. If you wish to create your own alias below, untick this option.');
       if (user_access('administer pathauto')) {
-        $output .= t(' To control the format of the generated aliases, see the <a href="@pathauto">Pathauto settings</a>.', array('@pathauto' => url('admin/settings/pathauto')));
+        $output .= t(' To control the format of the generated aliases, see the <a href="@pathauto">Pathauto settings</a>.', array('@pathauto' => url('admin/build/path/pathauto')));
       }
 
       drupal_add_js(drupal_get_path('module', 'pathauto') .'/pathauto.js');
+      $form['path']['#collapsed'] = FALSE;
 
       $form['path']['pathauto_perform_alias'] = array(
         '#type' => 'checkbox',
         '#title' => t('Automatic alias'),
         '#default_value' => TRUE,
         '#description' => $output,
-        '#weight' => 0
+        '#weight' => -1,
       );
+
+      //For Pathauto to remember the old alias and prevent the Path-module from deleteing it when Pathauto wants to preserve it
+      $old_alias = $form['path']['path']['#default_value'];
+      $form['path']['old_alias'] = array('#type' => 'value', '#value' => $old_alias);
     }
   }
 }
@@ -366,9 +387,9 @@ function pathauto_user($op, &$edit, &$us
 
         if (module_exists('blog')) {
           $new_user = $user;
-          $new_user->roles = isset($edit['roles']) ? $edit['roles'] : array();
+          $new_user->roles = isset($edit['roles']) ? $edit['roles']: array();
           $new_user->roles[DRUPAL_AUTHENTICATED_RID] = 'authenticated user'; // Add this back
-          if (user_access('edit own blog', $new_user)) {
+          if (user_access('create blog entries', $new_user)) {
             $src = 'blog/'. $user->uid;
             $alias = pathauto_create_alias('blog', $op, $placeholders, $src, $user->uid);
           }
@@ -602,7 +629,6 @@ function pathauto_admin_settings() {
     if (isset($settings->patternitems)) {
       foreach ($settings->patternitems as $itemname => $itemlabel) {
         $variable = 'pathauto_'. $module .'_'. $itemname .'_pattern';
-        $description = '';
         if (!count($_POST)) {
           $error = _pathauto_check_pattern(variable_get($variable, $patterndefault), $settings->token_type);
           if ($error) {
@@ -771,7 +797,7 @@ function pathauto_admin_settings_validat
 }
 
 /**
- * Menu callback: select certain alias types to delete.
+ * Menu callback; select certain alias types to delete.
  */
 function pathauto_admin_delete() {
   /* TODO:
diff -up ./pathauto_node.inc ../pathauto6x/pathauto_node.inc
--- ./pathauto_node.inc	2008-06-08 00:53:31.000000000 +0200
+++ ../pathauto6x/pathauto_node.inc	2008-05-28 18:04:35.000000000 +0200
@@ -32,9 +32,15 @@ function node_pathauto($op) {
         }
       }
       $settings['supportsfeeds'] = 'feed';
+
+      $languages = module_exists('locale') ? locale_language_list() : array();
       foreach (node_get_types('names') as $node_type => $node_name) {
         $fieldlabel = t('Pattern for all @node_type paths', array('@node_type' => $node_name));
         $settings['patternitems'][$node_type] = $fieldlabel;
+        foreach ($languages as $lang_code => $lang_name) {
+          $fieldlabel = t('Pattern for all @node_type paths in @language', array('@node_type' => $node_name, '@language' => $lang_name));
+          $settings['patternitems'][$node_type .'_'. $lang_code] = $fieldlabel;
+        }
       }
       return (object) $settings;
     default:
@@ -49,45 +55,49 @@ function node_pathauto_bulkupdate() {
 
   // From all node types, only attempt to update those with patterns
   $pattern_types = array();
-  $type_where = '';
-  foreach (node_get_types() as $type => $info) {
-    $pattern = '';
-    $pattern = variable_get('pathauto_node_'. $type .'_pattern', '');
-
-    // If it's not set, check the default
-    if (!trim($pattern)) {
-      $pattern = variable_get('pathauto_node_pattern', '');
-    }
-    if (trim($pattern)) {
-      $pattern_types[] = $type;
-      if (!trim($type_where)) {
-        $type_where = " AND (type = '%s' ";
+
+  // If there's a default pattern we assume all types might be updated.
+  if (trim(variable_get('pathauto_node_pattern', ''))) {
+    $pattern_types = array_keys(node_get_types('names'));
+  }
+  else {
+    // Check first for a node specific pattern...
+    $languages = module_exists('locale') ? locale_language_list() : array();
+    foreach (array_keys(node_get_types('names')) as $type) {
+      if (trim(variable_get('pathauto_node_'. $type .'_pattern', ''))) {
+        $pattern_types[$type] = $type;
+        continue;
       }
-      else {
-        $type_where .= " OR type = '%s'";
+      // ...then for a node-language pattern.
+      foreach ($languages as $lang_code => $lang_name) {
+        if (trim(variable_get('pathauto_node_'. $type .'_'. $lang_code .'_pattern', ''))) {
+          $pattern_types[$type] = $type;
+          continue 2;
+        }
       }
     }
   }
-  $type_where .= ')';
-
-  $query = "SELECT nid, type, title, uid, created, src, dst, vid FROM {node} LEFT JOIN {url_alias} ON CONCAT('node/', CAST(nid AS CHAR)) = src WHERE src IS NULL ". $type_where;
-  $result = db_query_range($query, $pattern_types, 0, variable_get('pathauto_max_bulk_update', 50));
 
   $count = 0;
-  $placeholders = array();
-  while ($node_ref = db_fetch_object($result)) {
-    $node = node_load($node_ref->nid, NULL, TRUE);
-    $node->src = $node_ref->src;
-    $node->dst = $node_ref->dst;
-    if (module_exists('taxonomy')) {
+  if (count($pattern_types)) {
+    $query = "SELECT n.nid, n.vid, n.type, n.title, n.uid, n.created, n.language, alias.src, alias.dst FROM {node} n LEFT JOIN {url_alias} alias ON CONCAT('node/', CAST(n.nid AS CHAR)) = alias.src WHERE alias.src IS NULL AND n.type IN (". db_placeholders($pattern_types, 'varchar') .')';
+    $result = db_query_range($query, $pattern_types, 0, variable_get('pathauto_max_bulk_update', 50));
+
+    $placeholders = array();
+    while ($node_ref = db_fetch_object($result)) {
+      $node = node_load($node_ref->nid, NULL, TRUE);
+      $node->src = $node_ref->src;
+      $node->dst = $node_ref->dst;
+      if (module_exists('taxonomy')) {
         // Must populate the terms for the node here for the category
         // placeholders to work
-        $node->taxonomy = array_keys(taxonomy_node_get_terms($node->nid));
-    }
-    $placeholders = pathauto_get_placeholders('node', $node);
-    $src = "node/$node->nid";
-    if ($alias = pathauto_create_alias('node', 'bulkupdate', $placeholders, $src, $node->nid, $node->type)) {
-      $count++;
+        $node->taxonomy = array_keys(taxonomy_node_get_terms($node));
+      }
+      $placeholders = pathauto_get_placeholders('node', $node);
+      $src = "node/$node->nid";
+      if ($alias = pathauto_create_alias('node', 'bulkupdate', $placeholders, $src, $node->nid, $node->type, $node->language)) {
+        $count++;
+      }
     }
   }
 
