Index: wp-includes/nav-menu.php
===================================================================
--- wp-includes/nav-menu.php	(revision 14262)
+++ wp-includes/nav-menu.php	(working copy)
@@ -35,9 +35,9 @@
 }
 
 /**
- * Check if navigation menu exists.
+ * Check if the given ID is a nav menu.
  *
- * Returns the menu object, or false if the term doesn't exist.
+ * Returns true if it is; false otherwise.
  *
  * @since 3.0.0
  *
@@ -57,6 +57,18 @@
 }
 
 /**
+ * Determine whether the given ID is a nav menu item.
+ *
+ * @since 3.0.0
+ *
+ * @param int $menu_item_id The ID of the potential nav menu item.
+ * @return bool Whether the given ID is that of a nav menu item.
+ */
+function is_nav_menu_item( $menu_item_id = 0 ) {
+	return ( ! is_wp_error( $menu_item_id ) && ( 'nav_menu_item' == get_post_type( $menu_item_id ) ) );
+}
+
+/**
  * Create a Navigation Menu.
  *
  * Optional args:
@@ -178,6 +190,11 @@
 	$menu_id = (int) $menu_id;
 	$menu_item_db_id = (int) $menu_item_db_id;
 
+	// make sure that we don't convert non-nav_menu_item objects into nav_menu_item objects
+	if ( ! empty( $menu_item_db_id ) && ! is_nav_menu_item( $menu_item_db_id ) ) {
+		return new WP_Error('update_nav_menu_item_failed', __('The given object ID is not that of a menu item.'));
+	}
+
 	$menu = wp_get_nav_menu_object( $menu_id );
 
 	if ( ! $menu || is_wp_error( $menu ) ) {
@@ -235,6 +252,7 @@
 
 	// New menu item
 	if ( 0 == $menu_item_db_id ) {
+		$post['ID'] = 0;
 		$menu_item_db_id = wp_insert_post( $post );
 
 	// Update existing menu item
Index: wp-admin/admin-ajax.php
===================================================================
--- wp-admin/admin-ajax.php	(revision 14262)
+++ wp-admin/admin-ajax.php	(working copy)
@@ -402,7 +402,7 @@
 	if ( ! current_user_can( 'switch_themes' ) ) 
 		die('-1');
 
-	if ( 'nav_menu_item' == get_post_type( $menu_item_id ) && wp_delete_post( $menu_item_id, true ) )
+	if ( is_nav_menu_item( $menu_item_id ) && wp_delete_post( $menu_item_id, true ) )
 		die('1');
 	else
 		die('0');
@@ -1466,33 +1466,7 @@
 		}
 	}
 	die( '0' );
-case 'save-custom-link':
-	if ( ! current_user_can('manage_links') )
-		die('-1');
-
-	$link_name = isset( $_POST['link_name'] ) ? esc_html($_POST['link_name']) : null;
-	$link_url = isset( $_POST['link_url'] ) ? esc_url_raw($_POST['link_url']) : null;
-
-	if ( !$link_name || !$link_url )
-		die('-1');
-
-	$post = array(
-		'post_status' => 'draft', 'post_type' => 'nav_menu_item', 'ping_status' => 0,
-		'post_author' => $user_ID, 'post_title' => $link_name, 'post_excerpt' => '',
-		'post_parent' => 0, 'menu_order' => 0, 'post_content' => '',
-	);
-
-	$link_id = wp_insert_post( $post );
-
-	update_post_meta( $link_id, '_menu_item_type', 'custom' );
-	update_post_meta( $link_id, '_menu_item_object_id', (int) $link_id );
-	update_post_meta( $link_id, '_menu_item_object', 'custom' );
-	update_post_meta( $link_id, '_menu_item_target', '' );
-	update_post_meta( $link_id, '_menu_item_classes', '' );
-	update_post_meta( $link_id, '_menu_item_xfn', '' );
-	update_post_meta( $link_id, '_menu_item_url', $link_url );
-
-	die( json_encode($link_id) );
+	break;
 default :
 	do_action( 'wp_ajax_' . $_POST['action'] );
 	die('0');
Index: wp-admin/nav-menus.php
===================================================================
--- wp-admin/nav-menus.php	(revision 14262)
+++ wp-admin/nav-menus.php	(working copy)
@@ -63,7 +63,7 @@
 		check_admin_referer( 'move-menu_item' );
 		$menu_item_id = (int) $_REQUEST['menu-item'];
 		$next_item_id = 0;
-		if ( 'nav_menu_item' == get_post_type( $menu_item_id ) ) {
+		if ( is_nav_menu_item( $menu_item_id ) ) {
 			$menus = isset( $_REQUEST['menu'] ) ? array( (int) $_REQUEST['menu'] ) : wp_get_object_terms( $menu_item_id, 'nav_menu', array( 'fields' => 'ids' ) );
 			if ( ! is_wp_error( $menus ) ) {
 				foreach( (array) $menus as $menu_id ) {
@@ -84,7 +84,7 @@
 	case 'move-up-menu-item' :
 		check_admin_referer( 'move-menu_item' );
 		$menu_item_id = empty( $next_item_id ) ? (int) $_REQUEST['menu-item'] : $next_item_id;
-		if ( 'nav_menu_item' == get_post_type( $menu_item_id ) ) {
+		if ( is_nav_menu_item( $menu_item_id ) ) {
 			$menus = isset( $_REQUEST['menu'] ) ? array( (int) $_REQUEST['menu'] ) : wp_get_object_terms( $menu_item_id, 'nav_menu', array( 'fields' => 'ids' ) );
 			if ( ! is_wp_error( $menus ) ) {
 				foreach( (array) $menus as $menu_id ) {
@@ -166,7 +166,7 @@
 		check_admin_referer( 'delete-menu_item_' . $menu_item_id );
 
 
-		if ( 'nav_menu_item' == get_post_type( $menu_item_id ) ) {
+		if ( is_nav_menu_item( $menu_item_id ) ) {
 			if ( wp_delete_post( $menu_item_id, true ) ) {
 				
 				$messages_div = '<div id="message" class="updated"><p>' . __('The menu item has been successfully deleted.') . '</p></div>';
@@ -260,9 +260,11 @@
 				}
 
 				// Remove menu items from the menu that weren't in $_POST
-				if ( !empty( $menu_items ) ) {
+				if ( ! empty( $menu_items ) ) {
 					foreach ( array_keys( $menu_items ) as $menu_item_id ) {
-						wp_delete_post( $menu_item_id );
+						if ( is_nav_menu_item( $menu_item_id ) ) {
+							wp_delete_post( $menu_item_id );
+						}
 					}
 				}
 
