=== modified file 'includes/menu.inc'
--- includes/menu.inc	2007-10-05 13:17:09 +0000
+++ includes/menu.inc	2007-10-07 21:34:02 +0000
@@ -1392,6 +1392,29 @@ function menu_link_load($mlid) {
   return FALSE;
 }
 
+
+/**
+ * Get an uncustomized menu link by its path.
+ *
+ * This function is usually used by modules that maintain a number of similar
+ * items (node types, aggregator categories, etc)  The returned link is access
+ * checked and translated. While there can be any number of menu items
+ * pointing to the same path, usually there is only that is not customized.
+ *
+ * @param $mlid
+ *   The mlid of the menu item.
+ * @return
+ *   A menu link, with $item['access'] filled and link translated for
+ *   rendering.
+ */
+function menu_uncustomized_link_load($path) {
+  if ($item = db_fetch_array(db_query("SELECT m.*, ml.* FROM {menu_links} ml LEFT JOIN {menu_router} m ON m.path = ml.router_path WHERE ml.customized = 0 AND ml.link_path = '%s'", $path))) {
+    _menu_link_translate($item);
+    return $item;
+  }
+  return FALSE;
+}
+
 /**
  * Clears the cached cached data for a single named menu.
  */

=== modified file 'modules/aggregator/aggregator.module'
--- modules/aggregator/aggregator.module	2007-09-13 08:02:38 +0000
+++ modules/aggregator/aggregator.module	2007-10-07 21:34:33 +0000
@@ -353,15 +353,32 @@ function aggregator_block($op = 'list', 
  * Add/edit/delete aggregator categories.
  */
 function aggregator_save_category($edit) {
-  if (!empty($edit['cid']) && !empty($edit['title'])) {
-    db_query("UPDATE {aggregator_category} SET title = '%s', description = '%s' WHERE cid = %d", $edit['title'], $edit['description'], $edit['cid']);
-  }
-  else if (!empty($edit['cid'])) {
-    db_query('DELETE FROM {aggregator_category} WHERE cid = %d', $edit['cid']);
+  $path = 'aggregator/categories/';
+  if (!empty($edit['cid'])) {
+    $menu_link = menu_uncustomized_link_load($path);
+    if (!empty($edit['title'])) {
+      db_query("UPDATE {aggregator_category} SET title = '%s', description = '%s' WHERE cid = %d", $edit['title'], $edit['description'], $edit['cid']);
+      if ($menu_link) {
+        $menu_link['link_title'] = $edit['title'];
+        menu_link_save($menu_link);
+      }
+    }
+    else {
+      db_query('DELETE FROM {aggregator_category} WHERE cid = %d', $edit['cid']);
+      if ($menu_link) {
+        menu_link_delete($menu_link['cid']);
+      }
+    }
   }
   else if (!empty($edit['title'])) {
     // A single unique id for bundles and feeds, to use in blocks.
     db_query("INSERT INTO {aggregator_category} (title, description, block) VALUES ('%s', '%s', 5)", $edit['title'], $edit['description']);
+    $cid = db_last_insert_id('aggregator', 'cid');
+    $menu_link = array(
+      'link_title' => $edit['title'],
+      'link_path' => $path . $cid,
+    );
+    menu_link_save($menu_link);
   }
 }
 

=== modified file 'modules/aggregator/aggregator.pages.inc'
--- modules/aggregator/aggregator.pages.inc	2007-10-02 16:03:17 +0000
+++ modules/aggregator/aggregator.pages.inc	2007-10-07 21:21:34 +0000
@@ -39,6 +39,7 @@ function aggregator_page_source($arg1, $
  * Menu callback; displays all the items aggregated in a particular category.
  */
 function aggregator_page_category($arg1, $arg2 = NULL) {
+  drupal_set_breadcrumb(array_merge(drupal_get_breadcrumb(), array(l(t('Categories'), 'aggregator/categories'))));
   // If there are two arguments then we are called as a form, $arg1 is
   // $form_state and $arg2 is $category. Otherwise, $arg1 is $category.
   $category = is_array($arg2) ? $arg2 : $arg1;

