Index: nodequeue.module
===================================================================
--- nodequeue.module	(revision 1917)
+++ nodequeue.module	(working copy)
@@ -1097,8 +1097,10 @@
 
   // prepare the main part of the form which will be themed as a table
   $count = count($nodes);
+  $position = 0;
   foreach ($nodes as $node) {
     $form[$node->nid]['#node'] = (array) $node;
+    $position++;
     if ($node->visible) {
       $form[$node->nid]['#node'] = (array) $node;
       $form[$node->nid]['title'] = array('#value' => l($node->title, 'node/'. $node->nid));
@@ -1115,7 +1117,7 @@
     $form[$node->nid]['position'] = array(
       '#type' => 'position',
       '#delta' => $count,
-      '#default_value' => $node->position,
+      '#default_value' => $position,
       '#attributes' => array(
         'class' => 'node-position',
       ),
@@ -1225,18 +1227,25 @@
   }
 
   $message = t('The queue has been updated.');
+  $admin_reverse = $form['#queue']['reverse'];
+
+  // Order the nodes by their current position.
+  ksort($nodes);
 
-  if ($reverse || $shuffle) {
+  // Adjust the node order based on reversing or shuffling.
+  if ($admin_reverse || $reverse || $shuffle) {
     $keys = array_keys($nodes);
     $values = array_values($nodes);
 
-    // reverse the list if the reverse button was pressed
-    if ($reverse) {
+    // Reverse if the reverse button was pressed or the list is admin-reversed.
+    if ($admin_reverse || $reverse) {
       $values = array_reverse($values);
-      $message = t('The queue has been reversed.');
+      if ($reverse) {
+        $message = t('The queue has been reversed.');
+      }
     }
 
-    // shuffle the list if the shuffle button was pressed.
+    // Shuffle the list if the shuffle button was pressed.
     if ($shuffle) {
       shuffle($values);
       $message = t('The queue has been shuffled.');
