diff -up /home/skhaladzinski/Desktop/Downloads/nodequeue/nodequeue_dragdrop.js ./nodequeue_dragdrop.js
--- /home/skhaladzinski/Desktop/Downloads/nodequeue/nodequeue_dragdrop.js	2009-08-17 17:37:06.000000000 -0400
+++ ./nodequeue_dragdrop.js	2010-06-30 12:49:54.000000000 -0400
@@ -31,6 +31,13 @@ Drupal.behaviors.nodequeueReverse = func
   });
 };
 
+Drupal.behaviors.Sticky = function(context) {
+  $('input.sticky').click(function() {
+    nodequeueInsertChangedWarning();
+    nodequeueRestripeTable();
+  });
+}
+
 Drupal.behaviors.nodequeueShuffle = function(context) {
   $('#edit-shuffle').click(function(){
     // randomize table rows...
@@ -40,14 +47,10 @@ Drupal.behaviors.nodequeueShuffle = func
       $('.nodequeue-dragdrop tbody').prepend(this);
     });
 
-    var reverse = Drupal.settings.nodequeue.reverse;
- 
     // ...and update node positions
-    var size = reverse ? $('.node-position').size() : 1;
-    $('.node-position').each(function(i){
-      var val = $(this).val();
-      $(this).val(size);
-      reverse ? size-- : size++;
+    var i = 1;
+    $('.node-position').each(function(){
+      $(this).val(i++);
     });
 
     nodequeueInsertChangedWarning();
diff -up /home/skhaladzinski/Desktop/Downloads/nodequeue/nodequeue.install ./nodequeue.install
--- /home/skhaladzinski/Desktop/Downloads/nodequeue/nodequeue.install	2010-03-14 20:49:31.000000000 -0400
+++ ./nodequeue.install	2010-06-30 12:38:19.000000000 -0400
@@ -424,6 +424,20 @@ function nodequeue_update_6005() {
   return $ret;
 }
 
+/*
+ * Add sticky functionality 
+ */
+function nodequeue_update_6006() {
+  $ret = array();
+  db_add_field($ret, "nodequeue_nodes", "sticky", array(
+        'description' => t('New field to support stick to position functionality'),
+        'type' => 'int',
+        'size' => 'tiny',
+        'default' => 0,
+        ));
+  return $ret;
+}
+
 function nodequeue_install() {
   drupal_install_schema('nodequeue');
 }
diff -up /home/skhaladzinski/Desktop/Downloads/nodequeue/nodequeue.module ./nodequeue.module
--- /home/skhaladzinski/Desktop/Downloads/nodequeue/nodequeue.module	2010-03-16 18:10:45.000000000 -0400
+++ ./nodequeue.module	2010-06-30 12:12:28.000000000 -0400
@@ -6,10 +6,6 @@
  * Maintains queues of nodes in arbitrary order.
  */
 
-define('NODEQUEUE_OK', 0);
-define('NODEQUEUE_INVALID_POSITION', 1);
-define('NODEQUEUE_INVALID_NID', 2);
-define('NODEQUEUE_DUPLICATE_POSITION', 3);
 
 /* --- HOOKS ---------------------------------------------------------------- */
 
@@ -1032,7 +1028,7 @@ function _nodequeue_dragdrop_get_nodes($
   $visible = nodequeue_nids_visible($subqueue->sqid);
 
   // get a list of all nodes in the subqueue, regardless of access restrictions
-  $result = db_query('SELECT DISTINCT(n.nid), n.title, n.uid, u.name, n.created, nq.position FROM {node} n LEFT JOIN {users} u on n.uid = u.uid LEFT JOIN {nodequeue_nodes} nq ON nq.nid = n.nid WHERE nq.sqid = %d ORDER BY nq.position '. $order, $subqueue->sqid);
+  $result = db_query('SELECT DISTINCT(n.nid), n.title, n.uid, u.name, n.created, nq.timestamp as queueadded, nq.position, nq.sticky FROM {node} n LEFT JOIN {users} u on n.uid = u.uid LEFT JOIN {nodequeue_nodes} nq ON nq.nid = n.nid WHERE nq.sqid = %d ORDER BY nq.position '. $order, $subqueue->sqid);
 
   $nodes = array();
   while ($node = db_fetch_object($result)) {
@@ -1055,6 +1051,7 @@ function nodequeue_arrange_subqueue_form
 
   // prepare the main part of the form which will be themed as a table
   $count = count($nodes);
+  $i = 1;
   foreach ($nodes as $node) {
     $form[$node->nid]['#node'] = (array) $node;
     if ($node->visible) {
@@ -1073,7 +1070,7 @@ function nodequeue_arrange_subqueue_form
     $form[$node->nid]['position'] = array(
       '#type' => 'position',
       '#delta' => $count,
-      '#default_value' => $node->position,
+      '#default_value' => $i,
       '#attributes' => array(
         'class' => 'node-position',
       ),
@@ -1088,6 +1085,8 @@ function nodequeue_arrange_subqueue_form
       ),
     );
     $form[$node->nid]['remove'] = array('#value' => l(t('remove'), '', $attr));
+    $form[$node->nid]['sticky'] = array('#type' => 'checkbox', '#default_value' => $node->sticky, '#attributes' => array('class' => 'sticky'));
+    $i++;
   }
 
   // add a textfield for adding nodes to the queue
@@ -1178,7 +1177,7 @@ function nodequeue_arrange_subqueue_form
   $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, 'sticky' => $form_state['values'][$nid]['sticky']);
     }
   }
 
@@ -1205,7 +1204,8 @@ function nodequeue_arrange_subqueue_form
 
   $qid  = $form['#queue']['qid'];
   $sqid = $form['#subqueue']['sqid'];
-  nodequeue_save_subqueue_order($nodes, $qid, $sqid);
+  if ($errorMsg = nodequeue_save_subqueue_order($nodes, $qid, $sqid))
+    $message = $errorMsg;
 
   drupal_set_message($message);
 }
@@ -1220,64 +1220,47 @@ function nodequeue_arrange_subqueue_form
  *   the queue id
  * @param unknown_type $sqid
  *   the subqueue id
- * @return An array where the first element is a numeric status code
- *   (0 means successfully saved) and the second element is a status message.
+ * @return Error message in case of error
  */
 function nodequeue_save_subqueue_order($nodes, $qid, $sqid) {
-  $positions = array();
   $now = time();
-
   $queue = nodequeue_load($qid);
   $subqueue = nodequeue_load_subqueue($sqid);
 
-  // cleanup the node array
-  $clean = array();
-  $count = 1;
+  if (count($nodes) != $subqueue->count)
+    return 'Duplicate position values are not allowed. New subqueue order not saved.';
+
   ksort($nodes);
-  foreach ($nodes as $pos => $nid) {
-    if (!is_numeric($nid) || $nid < 1) {
-      return array(NODEQUEUE_INVALID_NID, 'Invalid nid value. New subqueue order not saved.');
+  $dbPosition = $queue->reverse?count($nodes):1;
+  foreach ($nodes as $pos => $dataArr) {
+    if (!is_numeric($dataArr['nid']) || $dataArr['nid'] < 1) {
+      return 'Invalid nid value. New subqueue order not saved.';
     }
     if (is_numeric($pos)) {
-      $clean[$count] = $nid;
-      $count++;
-    }
-    else if ($pos == 'r') {
+      $sqlValuesArr[] = '('.$queue->qid.', '.$subqueue->sqid.', '.$dataArr['nid'].', '.$dbPosition.', '.$now.', '.$dataArr['sticky'].')';
+      $queue->reverse?$dbPosition--:$dbPosition++;
+    } elseif ($pos == 'r') {
       // call nodequeue_remove hook
-      module_invoke_all('nodequeue_remove', $sqid, $nid);
+      module_invoke_all('nodequeue_remove', $sqid, $dataArr['nid']);
+    } else {
+      return 'Invalid position value. New subqueue order not saved.';
     }
-    else {
-      return array(NODEQUEUE_INVALID_POSITION, 'Invalid position value. New subqueue order not saved.');
-    }
-  }
-  $nodes = $clean;
-
-  if (count(array_unique($nodes)) < count($nodes)) {
-    return array(NODEQUEUE_DUPLICATE_POSITION, 'Duplicate position values are not allowed. New subqueue order not saved.');
   }
 
   // clear the queue and save the new positions
   db_query('DELETE FROM {nodequeue_nodes} WHERE sqid = %d', $sqid);
-  foreach ($nodes as $pos => $nid) {
-    $args = array();
-    if ($pos != 'r') {
-      $positions[] = $pos;
-      $placeholders = ' (%d, %d, %d, %d, %d)';
-      $args = array($sqid, $qid, $nid, $pos, $now);
-    }
-
-    if (!empty($args)) {
-      $sql = 'INSERT INTO {nodequeue_nodes} (sqid, qid, nid, position, timestamp) VALUES '. $placeholders;
-      db_query($sql, $args);
-    }
+  if (count($sqlValuesArr)) {
+    db_query('INSERT INTO {nodequeue_nodes} (qid, sqid, nid, position, timestamp, sticky) VALUES '.implode(', ', $sqlValuesArr));
   }
 
   if ($queue->size) {
     // only necessary if the subqueue is of finite length
     nodequeue_check_subqueue_size($queue, $subqueue);
   }
+}
 
-  return array(NODEQUEUE_OK, 'The queue has been updated.');
+function _queueWasChanged($arr1, $arr2) {
+  return md5(serialize(array_keys($arr1))) != md5(serialize(array_keys($arr2)));
 }
 
 function nodequeue_arrange_subqueue_form_clear_submit($form, &$form_state) {
@@ -2009,7 +1992,9 @@ function nodequeue_remove_subqueue($sqid
  */
 function nodequeue_subqueue_add($queue, &$subqueue, $nid) {
   if (!empty($nid)) {
-    db_query("INSERT INTO {nodequeue_nodes} (sqid, qid, nid, position, timestamp) VALUES (%d, %d, %d, %d, %d)", $subqueue->sqid, $queue->qid, $nid, $subqueue->count + 1, time());
+    $sqlValuesArr = _getSQLArrForInsert($queue, $subqueue, $nid);
+    db_query("DELETE FROM {nodequeue_nodes} WHERE sqid = %d AND qid = %d", $subqueue->sqid, $queue->qid);
+    db_query("INSERT INTO {nodequeue_nodes} (sqid, qid, nid, position, timestamp, sticky) VALUES ".implode(', ', $sqlValuesArr));
     $subqueue->count++;
     // If adding this would make the queue too big, pop the front node
     // (or nodes) out.
@@ -2026,6 +2011,56 @@ function nodequeue_subqueue_add($queue, 
 }
 
 /**
+ * Returns list of SQL VALUES to insert into nodequeue_nodes table
+ * @param $queue
+ *   The parent queue of the subqueue. This is required so that we can
+ *   pop nodes out if the queue breaks size limits.
+ * @param $sqid
+ *   The subqueue ID to add the node to.
+ * @param $nid
+ *   The node ID
+ * @return 
+ *   List of SQL VALUES
+ **/
+function _getSQLArrForInsert($queue, $subqueue, $nid) {
+  $current_nodes = _nodequeue_dragdrop_get_nodes($queue, $subqueue);
+  $newQueueEntry = new stdClass();
+  $newQueueEntry->nid = $nid;
+  $newQueueEntry->queueadded = time();
+
+  // No item in the queue yet or we just need to add item to the end ( reverse = 0 )
+  if (!count($current_nodes) || empty($queue->reverse)) {
+    $current_nodes[] = $newQueueEntry;
+  } else {
+    // Filter out sticky items
+    $itemAdded = FALSE;
+    foreach ($current_nodes as $visualPosition => $itemObj) {
+      if (!empty($itemObj->sticky)) {
+        $finalArr[$visualPosition] = $itemObj;
+        unset($current_nodes[$visualPosition]);
+      } elseif (!$itemAdded) {
+        $finalArr[$visualPosition] = $newQueueEntry;
+        $itemAdded = TRUE;
+      } 
+    }
+  }
+
+  // Fill the gaps with non sticky items
+  reset($current_nodes);
+  $totalElementsNum = count($current_nodes) + count($finalArr);
+  for ($i = 0, $j = $totalElementsNum; $i < $totalElementsNum; $i++, $j--) {
+    if (!isset($finalArr[$i])) {
+      $finalArr[$i] = current($current_nodes);
+      next($current_nodes);
+    }
+    // Build SQL for one-query insert
+    $finalArr[$i] = '('.$subqueue->sqid.', '.$queue->qid.', '.$finalArr[$i]->nid.', '.($queue->reverse?$j:$i).', '.$finalArr[$i]->queueadded.', '.(int)$finalArr[$i]->sticky.')';
+  }
+
+  return $finalArr;
+}
+
+/**
  * Remove a node from the queue. If a node is in the queue more than once,
  * only the first (closest to 0 position, or the front of the queue) will
  * be removed.
@@ -2765,6 +2800,7 @@ function theme_nodequeue_arrange_subqueu
         'data' => $counter,
         'class' => 'position'
       );
+      $row[] = drupal_render($form[$key]['sticky']);
 
       $rows[] = array(
         'data'  => $row,
@@ -2779,7 +2815,7 @@ function theme_nodequeue_arrange_subqueu
   }
 
   // render the main nodequeue table
-  $header = array(t('Title'), t('Author'), t('Post Date'), t('Position'), array('data' => t('Operations'), 'colspan' => 2), t('Position'));
+  $header = array(t('Title'), t('Author'), t('Post Date'), t('Position'), array('data' => t('Operations'), 'colspan' => 2), t('Position'), t('Sticky'));
   $output .= theme('table', $header, $rows, array('id' => 'nodequeue-dragdrop', 'class' => 'nodequeue-dragdrop'));
 
   // render the autocomplete field for adding a node to the table
