diff --git a/includes/nodequeue.admin.inc b/includes/nodequeue.admin.inc
old mode 100644
new mode 100755
index 2f483c1..1ef77af
--- a/includes/nodequeue.admin.inc
+++ b/includes/nodequeue.admin.inc
@@ -322,25 +322,41 @@ function nodequeue_view_queues() {
  * Display a list of subqueues for a queue and their sizes
  */
 function nodequeue_view_subqueues($queue) {
+  $attributes = array(
+    'id' => 'nodequeue-subqueues',
+  );
+
+  drupal_add_js(drupal_get_path('module', 'nodequeue') . '/js/nodequeue_order_subqueue.js');
+
   // Fetch all of the subqueues.
   $subqueues = nodequeue_load_subqueues_by_queue($queue->qid);
 
-  $header = array(t('Title'), t('In queue'), t('Operation'));
+  $header = array(t('Title'), t('In queue'), t('Position'), t('Operation'));
 
   $rows = array();
+  $option = array();
+  for ($i = count($subqueues) - 1; $i >= 0; $i--) : $option[$i] = $i; endfor;
   foreach ($subqueues as $subqueue) {
     if (nodequeue_api_subqueue_access($subqueue, NULL, $queue)) {
       $sub_text = nodequeue_subqueue_size_text($queue->size, $subqueue->count, FALSE);
+      $form['nodequeue']['qid_' . $queue->qid . '_sqid_' . $subqueue->sqid] = array(
+        '#type' => 'select',
+        '#options' => $option,
+        '#value' => $subqueue->position,
+        '#id' => 'qid_' . $queue->qid . '_sqid_' . $subqueue->sqid,
+        '#attributes' => array('class' => 'subqueue_select'),
+      );
       $rows[] = array(
         array('class' => 'nodequeue-title', 'data' => check_plain($subqueue->title)),
         array('class' => 'nodequeue-subqueues', 'data' => $sub_text),
+        array('class' => 'nodequeue-position row-weight', 'data' => drupal_render($form['nodequeue']['qid_' . $queue->qid . '_sqid_' . $subqueue->sqid])),
         array('class' => 'nodequeue-operation', 'data' => l(t('View'), "admin/content/nodequeue/$queue->qid/view/$subqueue->sqid"))
       );
     }
   }
 
   $output = '<p>'. t('Max nodes in queue: @size', array('@size' => $queue->size ? $queue->size : t("Infinite"))) .'</p>';
-  $output .= theme('table', $header, $rows);
+  $output .= theme('table', $header, $rows, $attributes);
   $output .= theme('pager', NULL, 20);
 
   return  $output;
diff --git a/includes/views/nodequeue.views.inc b/includes/views/nodequeue.views.inc
old mode 100644
new mode 100755
index 5142cbf..77256b3
--- a/includes/views/nodequeue.views.inc
+++ b/includes/views/nodequeue.views.inc
@@ -241,7 +241,26 @@ function nodequeue_views_data() {
       'handler' => 'views_handler_argument_string',
     ),
   );
-  
+
+  // position
+  $data['nodequeue_subqueue']['position'] = array(
+    'title' => t('Subqueue position'),
+    'help' => t('The position of the subqueue.'),
+    'field' => array(
+      'handler' => 'views_handler_field_numeric',
+      'click sortable' => TRUE,
+    ),
+    'sort' => array(
+      'handler' => 'views_handler_sort',
+    ),
+    'filter' => array(
+      'handler' => 'views_handler_filter_numeric',
+    ),
+    'argument' => array(
+      'handler' => 'views_handler_argument_numeric',
+    ),
+  );
+
   return $data;
 }
 
diff --git a/nodequeue.install b/nodequeue.install
old mode 100644
new mode 100755
index 4e595ab..2b31484
--- a/nodequeue.install
+++ b/nodequeue.install
@@ -561,3 +561,18 @@ function nodequeue_update_6007() {
   return $ret;
 
 }
+
+/**
+ * Provide a new column for nodequeue_subqueue table.
+ *
+ * The new field 'position' assigns a weight to the subqueues allowing to sort them by weight.
+ */
+function nodequeue_update_6008() {
+  $ret = array();
+  $attributes = array(
+    'not null' => TRUE,
+    'default' => '0',
+  );
+  // Add a new column to the nodequeue_subqueue table.
+  db_add_column($ret, 'nodequeue_subqueue', 'position', 'int', $attributes);
+}
diff --git a/nodequeue.module b/nodequeue.module
old mode 100644
new mode 100755
index 4bf267d..5e44ed9
--- a/nodequeue.module
+++ b/nodequeue.module
@@ -155,6 +155,14 @@ function nodequeue_menu() {
     'file' => 'includes/nodequeue.admin.inc',
     'type' => MENU_CALLBACK
   );
+  // Ahah callback to change the order of a subqueue.
+  $items['admin/ahah/order-subqueue/%/%/%'] = array(
+    'title' => 'Change order subqueue',
+    'page callback' => 'ahah_order_subqueue',
+    'access callback' => '_nodequeue_access_admin_or_manipulate',
+    'page arguments' => array(3, 4, 5),
+    'type' => MENU_CALLBACK,
+  );
 
   return $items;
 }
@@ -822,7 +830,7 @@ function nodequeue_load_subqueues_by_queue($qids, $page_size = 0) {
     return array();
   }
 
-  $query = "SELECT s.*, (SELECT count(*) FROM {nodequeue_nodes} n WHERE n.sqid = s.sqid) AS count FROM {nodequeue_subqueue} s WHERE s.qid IN (". db_placeholders($qids, 'int') .")";
+  $query = "SELECT s.*, (SELECT count(*) FROM {nodequeue_nodes} n WHERE n.sqid = s.sqid) AS count FROM {nodequeue_subqueue} s WHERE s.qid IN (". db_placeholders($qids, 'int') .") ORDER BY s.position DESC, s.sqid ASC";
   if ($page_size) {
     $result = pager_query($query, $page_size, 0, $qids);
   }
@@ -2131,3 +2139,21 @@ function theme_nodequeue_subqueue_full_text() {
 function theme_nodequeue_subqueue_count_text($count) {
   return t('@count in queue', array('@count' => $count));
 }
+
+/**
+  * Callback to change the order of a subqueue.
+  *
+  * @param int $position
+  * @param int $qid
+  * @param int $sqid
+  */
+function ahah_order_subqueue($position, $qid, $sqid) {
+  $query = "UPDATE {nodequeue_subqueue} SET position = %d WHERE qid = %d AND sqid = %d";
+  if (db_query($query, $position, $qid, $sqid)) {
+    drupal_set_message(t('Order changed successfully.'));
+    drupal_json(array('status' => TRUE));
+  }
+  else {
+    drupal_json(array('status' => FALSE));
+  }
+}
