Index: modules/menu/menu.admin.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/menu/menu.admin.inc,v
retrieving revision 1.6
diff -u -r1.6 menu.admin.inc
--- modules/menu/menu.admin.inc	11 Nov 2007 06:56:44 -0000	1.6
+++ modules/menu/menu.admin.inc	16 Nov 2007 00:46:13 -0000
@@ -27,7 +27,7 @@
  * relevant operations.
  */
 function menu_overview_form(&$form_state, $menu) {
-  $sql ="
+  $sql = "
     SELECT m.load_functions, m.to_arg_functions, m.access_callback, m.access_arguments, m.page_callback, m.page_arguments, m.title, m.title_callback, m.title_arguments, m.type, ml.*
     FROM {menu_links} ml LEFT JOIN {menu_router} m ON m.path = ml.router_path
     WHERE ml.menu_name = '%s'
@@ -74,6 +74,23 @@
         '#type' => 'checkbox',
         '#default_value' => $item['has_children'] && $item['expanded'],
       );
+      $form[$mlid]['weight'] = array(
+        '#type' => 'weight',
+        '#default_value' => isset($form_state[$mlid]['weight']) ? $form_state[$mlid]['weight'] : $item['weight'],
+      );
+      $form[$mlid]['depth'] = array(
+        '#type' => 'hidden',
+        '#value' => $item['depth'],
+      );
+      $form[$mlid]['mlid'] = array(
+        '#type' => 'hidden',
+        '#value' => $item['mlid'],
+      );
+      $form[$mlid]['plid'] = array(
+        '#type' => 'textfield',
+        '#default_value' => isset($form_state[$mlid]['plid']) ? $form_state[$mlid]['plid'] : $item['plid'],
+        '#size' => 6,
+      );
       // Build a list of operations.
       $operations = array();
       $operations['edit'] = l(t('edit'), 'admin/build/menu/item/'. $item['mlid'] .'/edit');
@@ -99,27 +116,49 @@
   return $form;
 }
 
-function menu_overview_form_submit($form) {
+function menu_overview_form_submit($form, &$form_state) {
+  $updated_items = array();
+  $fields = array('expanded', 'weight', 'plid', 'weight');
   foreach (element_children($form) as $mlid) {
     if (isset($form[$mlid]['hidden'])) {
-      $element = $form[$mlid];
+      $element = &$form[$mlid];
+      // Update any fields that have changed in this menu item.
+      foreach ($fields as $field) {
+        if ($element[$field]['#value'] != $element[$field]['#default_value']) {
+          $element['#item'][$field] = $element[$field]['#value'];
+          $updated_items[$mlid] = $element['#item'];
+        }
+      }
+      // Hidden is a special case, the value needs to be reversed.
       if ($element['hidden']['#value'] != $element['hidden']['#default_value']) {
         $element['#item']['hidden'] = !$element['hidden']['#value'];
-        menu_link_save($element['#item']);
-      }
-      if ($element['expanded']['#value'] != $element['expanded']['#default_value']) {
-        $element['#item']['expanded'] = $element['expanded']['#value'];
-        menu_link_save($element['#item']);
+        $updated_items[$mlid] = $element['#item'];
       }
     }
   }
+
+  // Save all our changed items to the database.
+  foreach ($updated_items as $item) {
+    menu_link_save($item);
+  }
 }
 
 /**
  * Theme the menu overview form into a table.
  */
 function theme_menu_overview_form($form) {
-  $header = array(t('Enabled'), t('Expanded'), t('Menu item'), array('data' => t('Operations'), 'colspan' => '3'));
+  drupal_add_tabledrag('menu-overview', 'match', 'parent', 'menu-plid', 'menu-plid', 'menu-mlid');
+  drupal_add_tabledrag('menu-overview', 'order', 'sibling', 'menu-weight');
+
+  $header = array(
+    t('Menu item'),
+    array('data' => t('Expanded'), 'class' => 'checkbox'),
+    array('data' => t('Enabled'), 'class' => 'checkbox'),
+    t('Parent'),
+    t('Weight'),
+    array('data' => t('Operations'), 'colspan' => '3'),
+  );
+
   $rows = array();
   foreach (element_children($form) as $mlid) {
     if (isset($form[$mlid]['hidden'])) {
@@ -133,15 +172,22 @@
         $operations[] = '';
       }
 
+      // Add special classes to be used for tabledrag.js.
+      $element['plid']['#attributes']['class'] = 'menu-plid menu-plid-'. $element['plid']['#value'];
+      $element['mlid']['#attributes']['class'] = 'menu-mlid menu-mlid-'. $element['plid']['#value'];
+      $element['weight']['#attributes']['class'] = 'menu-weight menu-weight-'. $element['plid']['#value'];
+
       $row = array();
-      $row[] = array('data' => drupal_render($element['hidden']), 'align' => 'center');
-      $row[] = array('data' => drupal_render($element['expanded']), 'align' => 'center');
-      $depth = $element['#item']['depth'];
-      $indentation = str_repeat('&nbsp;&nbsp;', $depth - 1) . ($depth > 1 ? '-&nbsp;' : '');
-      $row[] = $indentation . drupal_render($element['title']);
+
+      $row[] = theme('indentation', $element['depth']['#value'] - 1) . drupal_render($element['depth']) . drupal_render($element['title']);
+      $row[] = array('data' => drupal_render($element['expanded']), 'class' => 'checkbox');
+      $row[] = array('data' => drupal_render($element['hidden']), 'class' => 'checkbox');
+      $row[] = drupal_render($element['plid']) . drupal_render($element['mlid']);
+      $row[] = drupal_render($element['weight']);
       $row = array_merge($row, $operations);
 
       $row = array_merge(array('data' => $row), $element['#attributes']);
+      $row['class'] = !empty($row['class'])? $row['class'] .' draggable' : 'draggable';
       $rows[] = $row;
     }
   }
Index: includes/common.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/common.inc,v
retrieving revision 1.713
diff -u -r1.713 common.inc
--- includes/common.inc	14 Nov 2007 09:49:30 -0000	1.713
+++ includes/common.inc	16 Nov 2007 00:46:12 -0000
@@ -2920,6 +2920,9 @@
     'progress_bar' => array(
       'arguments' => array('percent' => NULL, 'message' => NULL),
     ),
+    'indentation' => array(
+      'arguments' => array('size' => 1),
+    ),
     // from pager.inc
     'pager' => array(
       'arguments' => array('tags' => array(), 'limit' => 10, 'element' => 0, 'parameters' => array()),
Index: includes/theme.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/theme.inc,v
retrieving revision 1.394
diff -u -r1.394 theme.inc
--- includes/theme.inc	11 Nov 2007 22:43:44 -0000	1.394
+++ includes/theme.inc	16 Nov 2007 00:46:13 -0000
@@ -1672,6 +1672,22 @@
 }
 
 /**
+ * Create a standard indentation div. Used for drag and drop tables.
+ * 
+ * @param $size
+ *   Optional. The number of indentations to create.
+ * @return
+ *   A string containing indentations.
+ */
+function theme_indentation($size = 1) {
+  $output = '';
+  for ($n = 0; $n < $size; $n++) {
+    $output .= '<div class="indentation">&nbsp;</div>';
+  }
+  return $output;
+}
+
+/**
  * @} End of "defgroup themeable".
  */
 
Index: modules/system/system.css
===================================================================
RCS file: /cvs/drupal/drupal/modules/system/system.css,v
retrieving revision 1.39
diff -u -r1.39 system.css
--- modules/system/system.css	14 Nov 2007 09:49:30 -0000	1.39
+++ modules/system/system.css	16 Nov 2007 00:46:13 -0000
@@ -23,6 +23,9 @@
 td.active {
   background-color: #ddd;
 }
+td.checkbox, th.checkbox {
+  text-align: center;
+}
 tbody {
   border-top: 1px solid #ccc;
 }
