diff -urp --strip-trailing-cr ../category/category_menu/category_menu.module ./category_menu/category_menu.module
--- ../category/category_menu/category_menu.module	2009-05-31 12:24:23.000000000 +0200
+++ ./category_menu/category_menu.module	2009-06-05 00:37:40.000000000 +0200
@@ -127,6 +127,29 @@ function category_menu_nodeapi(&$node, $
 }
 
 /**
+ * Implementation of hook_menu_link_alter().
+ *
+ * Guards certain properties of existing maintained menu links against
+ * outside changes, so that we explain the flow immediately, rather than
+ * blowing the changes silently later on node edits.
+ */
+function category_menu_menu_link_alter(&$item, $menu) {
+  if ($item['module'] == 'category_menu' && empty($item['options']['category_menu_unlock']) && !empty($item['mlid']) && $old_item = db_fetch_array(db_query("SELECT * FROM {menu_links} WHERE mlid = %d", $item['mlid']))) {
+    $changed = FALSE;
+    foreach (array('expanded', 'plid', 'link_title', 'hidden') as $key) {
+      if ($item[$key] != $old_item[$key]) {
+        $item[$key] = $old_item[$key];
+        $changed = TRUE;
+      }
+    }
+    if ($changed) {
+      drupal_set_message(t('Your changes to the %title item may not be saved, because this item is maintained by the <em>category_menu</em> module. You need to !edit-link the node, in order to change this item.', array('%title' => $item['link_title'], '!edit-link' => l(t('edit'), $item['link_path'] .'/edit'))), 'error');
+    }
+  }
+  unset($item['options']['category_menu_unlock']);
+}
+
+/**
  * Implementation of hook_form_alter().
  *
  * Adds the category menu settings to the container node form.
@@ -301,6 +324,14 @@ function category_menu_form_alter(&$form
       }
     }
   }
+
+  // Menu items owned by category_menu module should not be edited from menu admin UI,
+  // as we can't keep the changes anyway. If someone hits the form, redirect to the
+  // corresponding node edit form instead.
+  if ($form_id == 'menu_edit_item' && $form['menu']['#item']['module'] == 'category_menu') {
+    drupal_set_message(t('The menu item %title may not be edited directly, because this item is maintained by the <em>category_menu</em> module. You have been redirected to edit the node instead, as this is where you can make changes to that item.', array('%title' => $form['menu']['#item']['link_title'])));
+    drupal_goto($form['menu']['#item']['link_path'] .'/edit', 'destination='. urlencode('admin/build/menu-customize/'. $form['menu']['#item']['menu_name']));
+  }
 }
 
 /**
@@ -585,7 +616,7 @@ function category_menu_map_load($mlid) {
  * during hook_nodeapi('load').
  */
 function category_menu_map_load_by_nid($nid) {
-  if ($item = db_fetch_array(db_query('SELECT ml.*, cmm.nid, m.* FROM {menu_links} ml INNER JOIN {category_menu_map} cmm ON cmm.mlid = ml.mlid LEFT JOIN {menu_router} m ON m.path = ml.router_path WHERE cmm.nid = %d', $nid))) {
+  if ($item = db_fetch_array(db_query('SELECT m.*, cmm.nid, ml.* FROM {menu_links} ml INNER JOIN {category_menu_map} cmm ON cmm.mlid = ml.mlid LEFT JOIN {menu_router} m ON m.path = ml.router_path WHERE cmm.nid = %d', $nid))) {
 
     $item['options'] = unserialize($item['options']);
     return $item;
@@ -650,6 +681,7 @@ function category_menu_map_save($node) {
     }
 
     $node->category_menu_map['expanded'] = $container_settings['expanded_for_cats'];
+    $node->category_menu_map['weight'] = $node->category['weight'];
   }
   // Logic for assigned node types.
   else {
@@ -700,8 +732,10 @@ function category_menu_map_save($node) {
   $node->category_menu_map['parent_mismatch'] = FALSE;
   $node->category_menu_map['module'] = 'category_menu';
   $node->category_menu_map['plid'] = $new_plid;
+  $node->category_menu_map['hidden'] = (int) !$node->status;
   $menu_name = $node->category_menu_map['menu_name'];
 
+  $node->category_menu_map['options']['category_menu_unlock'] = TRUE;
   if (menu_link_save($node->category_menu_map)) {
     if ($new) {
       // Insert new.
diff -urp --strip-trailing-cr ../category/category.module ./category.module
--- ../category/category.module	2009-05-31 12:06:26.000000000 +0200
+++ ./category.module	2009-06-05 00:40:24.000000000 +0200
@@ -1454,10 +1454,15 @@ function _category_add_form_elements(&$f
     }
   }
 
+  // When category_menu have an existing menu item, we have two weights here (to be synchronized
+  // later on submit). We want to keep the more recent one, to avoid reversal of user's changes.
+  // The menu weight may be changed outside of this form (via menu reordering on admin UI), while
+  // weight on node only changes later in this form. So, we use menu weight here.
+  $default_weight = empty($node->category_menu_map) ? $node->category['weight'] : $node->category_menu_map['weight'];
   $form['category']['hierarchy']['weight'] = array(
     '#type' => 'weight',
     '#title' => t('Weight'),
-    '#default_value' => $node->category['weight'],
+    '#default_value' => $default_weight,
     '#delta' => 15,
     '#weight' => 10,
     '#description' => t('Categories and containers at a given level are ordered first by weight and then by title.'),
