diff --git a/modules/menu/menu.admin.inc b/modules/menu/menu.admin.inc
index 66bd6f3..9757401 100644
--- a/modules/menu/menu.admin.inc
+++ b/modules/menu/menu.admin.inc
@@ -168,7 +168,7 @@ function menu_overview_form_submit($form, &$form_state) {
   $form = array_merge($order, $form); // Update our original form with the new order.
 
   $updated_items = array();
-  $fields = array('weight', 'plid');
+  $fields = array('plid', 'weight');
   foreach (element_children($form) as $mlid) {
     if (isset($form[$mlid]['#item'])) {
       $element = $form[$mlid];
@@ -176,6 +176,16 @@ function menu_overview_form_submit($form, &$form_state) {
       foreach ($fields as $field) {
         if ($element[$field]['#value'] != $element[$field]['#default_value']) {
           $element['#item'][$field] = $element[$field]['#value'];
+          // If the parent item itself has changed, make sure the original
+          // parent item will be saved before the child item. This prevents
+          // any changes to be overwritten by the original values of the
+          // parent item.
+          if ($field == 'plid') {
+            $original_plid = "mlid:{$element['plid']['#default_value']}";
+            if (!array_key_exists($original_plid, $updated_items) && array_key_exists($original_plid, $form)) {
+              $updated_items[$original_plid] = $form[$original_plid]['#item'];
+            }
+          }
           $updated_items[$mlid] = $element['#item'];
         }
       }
