--- activitystream.module (saved version)
+++ activitystream.module (current document)
@@ -92,6 +92,82 @@
 }
 
 /**
+ * Implementation of hook_pathauto().
+ * Support Pathauto by allowing access to user streams at alternate URLs
+ */
+function activitystrea_pathauto($op) {
+  switch ($op) {
+    case 'settings':
+      $settings = array();
+      $settings['module'] = 'activitystrea';
+      $settings['token_type'] = 'user';
+      $settings['groupheader'] = t('Activity Stream path settings');
+      $settings['patterndescr'] = t('Pattern for activity stream paths');
+      $settings['patterndefault'] = t('blogs/[user-raw]');
+      $patterns = token_get_list('user');
+      foreach ($patterns['user'] as $pattern => $description) {
+        $settings['placeholders'][t('['. $pattern .']')] = t($description);
+      }
+      $settings['bulkname'] = t('Bulk generate aliases for streams that are not aliased');
+      $settings['bulkdescr'] = t('Generate aliases for all existing stream pages which do not already have aliases. Note: Bulk Update may not complete on large or slow sites. See the pathauto README.txt for more information.');
+      return (object) $settings;
+    default:
+      break;
+  }
+}
+
+/**
+ * Bulk generate aliases for all blogs without aliases 
+ */
+function blog_pathauto_bulkupdate() {
+  $query = "SELECT uid, name, src, dst FROM {users} LEFT JOIN {url_alias} ON CONCAT('stream/', uid) = src WHERE uid > 0 AND src IS NULL";
+  $result = db_query_range($query, 0, variable_get('pathauto_max_bulk_update', 50));
+  
+  $count = 0;
+  $placeholders = array();
+  while ($user = db_fetch_object($result)) {
+    $placeholders = pathauto_get_placeholders('user', $user);
+    $src = 'stream/'. $user->uid;
+    if ($alias = pathauto_create_alias('activitystream', 'bulkupdate', $placeholders, $src)) {
+      $count++;
+    }
+  }
+  
+  drupal_set_message(format_plural($count,
+    "Bulk generation of user streams completed, one alias generated.",
+    "Bulk generation of user streams completed, @count aliases generated."));
+}
+
+/**
+ * Implementation of hook_user() to set and delete aliases via pathauto
+ */
+function activitystream_user($op, &$edit, &$user, $category = FALSE) {
+  switch ($op) {
+    case 'insert':
+    case 'update':
+      _pathauto_include();
+      /*
+      ** Use the username to automatically create an alias
+      */
+      $pathauto_user = (object) array_merge((array) $user, $edit);
+      if ($user->name) {
+        $placeholders = pathauto_get_placeholders('user', $pathauto_user);
+        $src = 'stream/'. $user->uid;
+        $alias = pathauto_create_alias('user', $op, $placeholders, $src);
+      }
+      break;
+    case 'delete':
+      _pathauto_include();
+      $user = (object) $user;
+      path_set_alias('stream/'. $user->uid);
+      break;
+    default:
+      break;
+  }
+}
+
+
+/**
  * Implementation of hook_form().
  * Build the node edit form for a Activity Stream node.
  */
