diff --git a/menu_node.module b/menu_node.module
index 900a037..867e4b9 100644
--- a/menu_node.module
+++ b/menu_node.module
@@ -1,5 +1,6 @@
 <?php
 
+// $Id: menu_node.module,v 1.15 2011/01/13 22:36:05 agentken Exp $
 
 /**
  * @file
@@ -33,15 +34,7 @@ function menu_node_menu_link_update($link) {
  * Implements hook_menu_link_delete().
  */
 function menu_node_menu_link_delete($link) {
-  if ($node = menu_node_get_node($link['mlid'])) {
-    // TODO: If http://drupal.org/node/1012768 doesn't get in,
-    // then we must attach the $link to the node and format as an
-    // object, which is what our API expects.
-    if (empty($node->menu_node_links)) {
-      $node->menu_node_links[$link['mlid']] = (object) $link;
-    }
-    menu_node_record_delete($node);
-  }
+  menu_node_record_delete_by_link($link);
 }
 
 /**
@@ -74,11 +67,14 @@ function menu_node_node_update($node) {
 }
 
 /**
+ * Needless, menu_node_delete() delete each menu items.
  * Implements hook_node_delete().
  */
+/*
 function menu_node_node_delete($node) {
   menu_node_record_delete($node);
 }
+ */
 
 /**
  * Get the relevant node object for a menu link.
@@ -335,6 +331,7 @@ function menu_node_exists($mlid) {
 }
 
 /**
+ * (Deprecated)
  * Delete a record from {menu_node} and run hook_menu_node_record_delete().
  *
  * We deliberately run the hook before the delete, in case any module
@@ -346,6 +343,21 @@ function menu_node_exists($mlid) {
  *   No return. hook_menu_node_record_delete() is invoked.
  */
 function menu_node_record_delete($node) {
+  menu_node_record_delete_by_node($node);
+}
+
+/**
+ * Delete a record from {menu_node} by nid and run hook_menu_node_record_delete().
+ *
+ * We deliberately run the hook before the delete, in case any module
+ * wishes to run a JOIN on the {menu_node} table.
+ *
+ * @param $node
+ *   The node being deleted.
+ * @return
+ *   No return. hook_menu_node_record_delete() is invoked.
+ */
+function menu_node_record_delete_by_node($node) {
   if (!empty($node->menu_node_links)) {
     foreach ($node->menu_node_links as $link) {
       _menu_node_invoke($node, $link, 'delete');
@@ -356,3 +368,31 @@ function menu_node_record_delete($node) {
     ->condition('nid', $node->nid)
     ->execute();
 }
+
+/**
+ * Delete a record from {menu_node} by mlid and run hook_menu_node_record_delete().
+ *
+ * We deliberately run the hook before the delete, in case any module
+ * wishes to run a JOIN on the {menu_node} table.
+ *
+ * @param $link
+ *   The menu link being deleted.
+ * @return
+ *   No return. hook_menu_node_record_delete() is invoked.
+ */
+function menu_node_record_delete_by_link($link) {
+  $link = (object)$link;
+  if ($node = menu_node_get_node($link->mlid)) {
+    // TODO: If http://drupal.org/node/1012768 doesn't get in,
+    // then we must attach the $link to the node and format as an
+    // object, which is what our API expects.
+    if (empty($node->menu_node_links)) {
+      $node->menu_node_links[$link->mlid] = $link;
+    }
+      _menu_node_invoke($node, $link, 'delete');
+  }
+  // Now delete the record.
+  db_delete('menu_node')
+    ->condition('mlid', $link->mlid)
+    ->execute();
+}
