diff --git a/nodequeue.module b/nodequeue.module
index eab7411..c979fb6 100644
--- a/nodequeue.module
+++ b/nodequeue.module
@@ -1219,7 +1219,10 @@ function nodequeue_arrange_subqueue_form_submit($form, &$form_state, $reverse =
   $nodes = array();
   foreach ($form_state['values'] as $nid => $element) {
     if (is_numeric($nid)) {
-      $nodes[$form_state['values'][$nid]['position']] = $nid;
+      $nodes[$form_state['values'][$nid]['position']] = array(
+        'nid' => $nid,
+        'data' => $form_state['values'][$nid]
+      );
     }
   }
 
@@ -1275,17 +1278,18 @@ function nodequeue_save_subqueue_order($nodes, $qid, $sqid) {
   $clean = array();
   $count = 1;
   ksort($nodes);
-  foreach ($nodes as $pos => $nid) {
-    if (!is_numeric($nid) || $nid < 1) {
+  module_invoke_all('nodequeue_sort_alter', $sqid, $nodes);
+  foreach ($nodes as $pos => $node) {
+    if (!is_numeric($node['nid']) || $node['nid'] < 1) {
       return array(NODEQUEUE_INVALID_NID, 'Invalid nid value. New subqueue order not saved.');
     }
     if (is_numeric($pos)) {
-      $clean[$count] = $nid;
+      $clean[$count] = $node;
       $count++;
     }
     else if ($pos == 'r') {
       // call nodequeue_remove hook
-      module_invoke_all('nodequeue_remove', $sqid, $nid);
+      module_invoke_all('nodequeue_remove', $sqid, $node['nid']);
     }
     else {
       return array(NODEQUEUE_INVALID_POSITION, 'Invalid position value. New subqueue order not saved.');
@@ -1293,18 +1297,23 @@ function nodequeue_save_subqueue_order($nodes, $qid, $sqid) {
   }
   $nodes = $clean;
 
-  if (count(array_unique($nodes)) < count($nodes)) {
+  if (count(array_unique($nodes, SORT_REGULAR)) < count($nodes)) {
     return array(NODEQUEUE_DUPLICATE_POSITION, 'Duplicate position values are not allowed. New subqueue order not saved.');
   }
+  // Allow other modules to alter the order of nodes.
+  foreach (module_implements('nodequeue_save_subqueue_order_alter') as $module) {
+    $function = $module . '_nodequeue_save_subqueue_order_alter';
+    $function($sqid, $nodes);
+  }
 
   // clear the queue and save the new positions
   db_query('DELETE FROM {nodequeue_nodes} WHERE sqid = %d', $sqid);
-  foreach ($nodes as $pos => $nid) {
+  foreach ($nodes as $pos => $node) {
     $args = array();
     if ($pos != 'r') {
       $positions[] = $pos;
       $placeholders = ' (%d, %d, %d, %d, %d)';
-      $args = array($sqid, $qid, $nid, $pos, $now);
+      $args = array($sqid, $qid, $node['nid'], $pos, $now);
     }
 
     if (!empty($args)) {
