diff --git a/includes/nodequeue.admin.inc b/includes/nodequeue.admin.inc
index 2f483c1..0fa69ba 100644
--- a/includes/nodequeue.admin.inc
+++ b/includes/nodequeue.admin.inc
@@ -424,6 +424,12 @@ function nodequeue_edit_queue_form(&$form_state, $queue) {
     '#description' => t('Ordinarily queues are arranged with the front of the queue (where items will be removed) on top and the back (where items will be added) on the bottom. If checked, this will display the queue such that items will be added to the top and removed from the bottom.'),
   );
 
+  $form['insert_at_front'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Insert nodes at front of queue, and delete from the back.'),
+    '#default_value' => $queue->insert_at_front,
+  );
+
   $form['link'] = array(
     '#type' => 'textfield',
     '#title' => t('Link "add to queue" text'),
diff --git a/nodequeue.install b/nodequeue.install
index 4e595ab..0a29322 100644
--- a/nodequeue.install
+++ b/nodequeue.install
@@ -85,6 +85,12 @@ function nodequeue_schema() {
         'size' => 'tiny',
         'default' => 0,
       ),
+      'insert_at_front' => array(
+        'description' => '',
+        'type' => 'int',
+        'size' => 'tiny',
+        'default' => 0,
+      ),
       'i18n' => array(
         'description' => '',
         'type' => 'int',
@@ -561,3 +567,18 @@ function nodequeue_update_6007() {
   return $ret;
 
 }
+
+/**
+  * Add new field 'insert_at_front'.
+ */
+function nodequeue_update_6008() {
+  $field = array(
+    'description' => '',
+    'type' => 'int',
+    'size' => 'tiny',
+    'default' => 0,
+  );
+
+  $ret = array();
+  db_add_field($ret, 'nodequeue_queue', 'insert_at_front', $field);
+}
\ No newline at end of file
diff --git a/nodequeue.module b/nodequeue.module
index 4bf267d..2c25e63 100644
--- a/nodequeue.module
+++ b/nodequeue.module
@@ -484,6 +484,7 @@ class nodequeue_queue {
 
   var $subqueue_title = '';
   var $reverse = 0;
+  var $insert_at_front = 0;
 
   // runtime
   var $subqueues = array();
@@ -904,7 +905,7 @@ function nodequeue_load_subqueues_by_reference($references, $bypass_cache = FALS
  */
 function nodequeue_save(&$queue) {
   if (!isset($queue->qid)) {
-    db_query("INSERT INTO {nodequeue_queue} (title, name, subqueue_title, size, link, link_remove, owner, show_in_links, show_in_tab, show_in_ui, i18n, reverse, reference) VALUES ('%s', '%s', '%s', %d, '%s', '%s', '%s', %d, %d, %d, %d, %d, '%s')", $queue->title, $queue->name, $queue->subqueue_title, $queue->size, $queue->link, $queue->link_remove, $queue->owner, $queue->show_in_links, $queue->show_in_tab, $queue->show_in_ui, $queue->i18n, $queue->reverse, $queue->reference);
+    db_query("INSERT INTO {nodequeue_queue} (title, name, subqueue_title, size, link, link_remove, owner, show_in_links, show_in_tab, show_in_ui, i18n, reverse, reference) VALUES ('%s', '%s', '%s', %d, '%s', '%s', '%s', %d, %d, %d, %d, %d, '%s', %d)", $queue->title, $queue->name, $queue->subqueue_title, $queue->size, $queue->link, $queue->link_remove, $queue->owner, $queue->show_in_links, $queue->show_in_tab, $queue->show_in_ui, $queue->i18n, $queue->reverse, $queue->reference, $queue->insert_at_front);
     $queue->qid = db_last_insert_id('nodequeue_queue', 'qid');
     if (function_exists('views_invalidate_cache')) {
       views_invalidate_cache();
@@ -913,10 +914,10 @@ function nodequeue_save(&$queue) {
   else {
     // Allow nodequeue to save and not update the name unless supplied
     if (isset($queue->name) && !empty($queue->name)) {
-      db_query("UPDATE {nodequeue_queue} SET size = %d, title = '%s', subqueue_title = '%s', link = '%s', link_remove = '%s', owner = '%s', show_in_links = %d, show_in_tab = %d, show_in_ui = %d, i18n = %d, reverse = %d, reference = '%s' WHERE qid = %d", $queue->size, $queue->title, $queue->subqueue_title, $queue->link, $queue->link_remove, $queue->owner, $queue->show_in_links, $queue->show_in_tab, $queue->show_in_ui, $queue->i18n, $queue->reverse, $queue->reference, $queue->qid);
+      db_query("UPDATE {nodequeue_queue} SET size = %d, title = '%s', subqueue_title = '%s', link = '%s', link_remove = '%s', owner = '%s', show_in_links = %d, show_in_tab = %d, show_in_ui = %d, i18n = %d, reverse = %d, reference = '%s', insert_at_front = %d WHERE qid = %d", $queue->size, $queue->title, $queue->subqueue_title, $queue->link, $queue->link_remove, $queue->owner, $queue->show_in_links, $queue->show_in_tab, $queue->show_in_ui, $queue->i18n, $queue->reverse, $queue->reference, $queue->insert_at_front, $queue->qid);
     }
     else {
-      db_query("UPDATE {nodequeue_queue} SET size = %d, title = '%s', name = '%s', subqueue_title = '%s', link = '%s', link_remove = '%s', owner = '%s', show_in_links = %d, show_in_tab = %d, show_in_ui = %d, i18n = %d, reverse = %d, reference = '%s' WHERE qid = %d", $queue->size, $queue->title, $queue->name, $queue->subqueue_title, $queue->link, $queue->link_remove, $queue->owner, $queue->show_in_links, $queue->show_in_tab, $queue->show_in_ui, $queue->i18n, $queue->reverse, $queue->reference, $queue->qid);
+      db_query("UPDATE {nodequeue_queue} SET size = %d, title = '%s', name = '%s', subqueue_title = '%s', link = '%s', link_remove = '%s', owner = '%s', show_in_links = %d, show_in_tab = %d, show_in_ui = %d, i18n = %d, reverse = %d, reference = '%s', insert_at_front = %d WHERE qid = %d", $queue->size, $queue->title, $queue->name, $queue->subqueue_title, $queue->link, $queue->link_remove, $queue->owner, $queue->show_in_links, $queue->show_in_tab, $queue->show_in_ui, $queue->i18n, $queue->reverse, $queue->reference, $queue->insert_at_front, $queue->qid);
     }
     db_query("DELETE FROM {nodequeue_roles} WHERE qid = %d", $queue->qid);
     db_query("DELETE FROM {nodequeue_types} WHERE qid = %d", $queue->qid);
@@ -1039,7 +1040,16 @@ 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, COALESCE((SELECT MAX(position)+1 FROM (SELECT * from {nodequeue_nodes} WHERE sqid = %d) as nn), 1), %d)", $subqueue->sqid, $queue->qid, $nid, $subqueue->sqid, time());
+
+    if ($queue->insert_at_front) {
+      db_query('UPDATE {nodequeue_nodes} SET position = position + 1 WHERE sqid = %d', $subqueue->sqid);
+      $position = 1;
+    }
+    else {
+      $position = db_result(db_query('SELECT COALESCE((SELECT MAX(position) + 1 FROM {nodequeue_nodes} WHERE sqid = %d), 1)', $subqueue->sqid));
+    }
+
+    db_query("INSERT INTO {nodequeue_nodes} (sqid, qid, nid, position, timestamp) VALUES (%d, %d, %d, %d, %d)", $subqueue->sqid, $queue->qid, $nid, $position, time());
     $subqueue->count = db_result(db_query("SELECT count(nid) FROM {nodequeue_nodes} WHERE sqid = %d", $subqueue->sqid));
     // If adding this would make the queue too big, pop the front node
     // (or nodes) out.
@@ -1146,7 +1156,13 @@ function nodequeue_check_subqueue_size($queue, &$subqueue, $size = NULL) {
   }
 
   if ($queue->size && $subqueue->count > $size) {
-    nodequeue_subqueue_remove($subqueue->sqid, 1, $subqueue->count - $size);
+
+    if ($queue->insert_at_front) {
+      nodequeue_subqueue_remove($subqueue->sqid, $size + 1, $subqueue->count);
+    }
+    else {
+      nodequeue_subqueue_remove($subqueue->sqid, 1, $subqueue->count - $size);
+    }
     $subqueue->count = $size;
   }
 }
