diff --git a/includes/nodequeue.admin.inc b/includes/nodequeue.admin.inc
index 2f483c1..a95ec38 100644
--- a/includes/nodequeue.admin.inc
+++ b/includes/nodequeue.admin.inc
@@ -322,25 +322,39 @@ function nodequeue_view_queues() {
  * Display a list of subqueues for a queue and their sizes
  */
 function nodequeue_view_subqueues($queue) {
+  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);
+  $attributes = array(
+    'id' => 'nodequeue-subqueues',
+  );
+  $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
index 5142cbf..8b26039 100644
--- 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;
 }

index e69de29..30ff0b5 100644
--- a/js/nodequeue_order_subqueue.js
+++ b/js/nodequeue_order_subqueue.js
@@ -0,0 +1,44 @@
+(function ($) {
+
+  /**
+   * Change the order of the subqueue with an ajax call.
+   *
+   * @param context
+   */
+  Drupal.behaviors.nodequeue_order_subqueue = function(context) {
+
+    if ($('.subqueue_select', context).length > 0) {
+      $('.subqueue_select', context).change(function() {
+        $('.messages_tmp', context).remove();
+        var id = $(this).attr('id');
+        var n = id.indexOf("_sqid_");
+        var quid = id.substring(4, n);
+        var sqid = id.substring(n + 6);
+        var url = Drupal.settings.basePath + 'admin/ahah/order-subqueue';
+        var data =  '/' + $(this).val() + '/' + quid + '/' + sqid;
+        $.ajax({
+          dataType: "json",
+          url: url + data,
+          success: function(back) {
+            if (back.status) {
+              location.reload(true);
+            }
+            else {
+              $('#nodequeue-subqueues', context).parent().before('<div class="messages_tmp messages error">' + Drupal.t('Error: Query was not executed correctly.') + '</div>');
+              setInterval(function() {
+                $('.messages_tmp', context).fadeOut();
+              }, 1000);
+            }
+          },
+          error: function() {
+            $('#nodequeue-subqueues', context).parent().before('<div class="messages_tmp messages error">' + Drupal.t('Error: something wrong with the Ajax request.') + '</div>');
+            setInterval(function() {
+              $('.messages_tmp', context).fadeOut();
+            }, 1000);
+          }
+        });
+      });
+    }
+  }
+
+})(jQuery);
diff --git a/nodequeue.install b/nodequeue.install
index 4e595ab..7f7c014 100644
--- a/nodequeue.install
+++ b/nodequeue.install
@@ -561,3 +561,19 @@ 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(
+    'type' => 'int',
+    'not null' => TRUE,
+    'default' => '0',
+  );
+  // Add a new column to the nodequeue_subqueue table.
+  db_add_field($ret, 'nodequeue_subqueue', 'position', $attributes);
+}
diff --git a/nodequeue.module b/nodequeue.module
index 32603dc..3ca67ef 100644
--- a/nodequeue.module
+++ b/nodequeue.module
@@ -158,6 +158,15 @@ function nodequeue_menu() {
     '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;
 }
 
@@ -824,7 +833,7 @@ function nodequeue_load_subqueues_by_queue($qids, $page_size = 0) {
     return array();
   }
 
-  $query = "SELECT s.*, COUNT(n.position) AS count FROM {nodequeue_subqueue} s LEFT JOIN {nodequeue_nodes} n ON n.sqid = s.sqid WHERE s.qid IN (". db_placeholders($qids, 'int') .") GROUP BY s.sqid";
+  $query = "SELECT s.*, COUNT(n.position) AS count FROM {nodequeue_subqueue} s LEFT JOIN {nodequeue_nodes} n ON n.sqid = s.sqid WHERE s.qid IN (". db_placeholders($qids, 'int') .") GROUP BY s.sqid ORDER BY s.position DESC, s.sqid ASC";
   if ($page_size) {
     $result = pager_query($query, $page_size, 0, $qids);
   }
@@ -2120,3 +2129,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. The change will appear when the cache is cleared or expired.'));
+    drupal_json(array('status' => TRUE));
+  }
+  else {
+    drupal_json(array('status' => FALSE));
+  }
+}
