diff --git entityqueue.info entityqueue.info
index b9dd47d..062c9a5 100644
--- entityqueue.info
+++ entityqueue.info
@@ -21,3 +21,8 @@ files[] = includes/entityqueue.controller.inc
 
 ; Views handlers.
 files[] = includes/views/entityqueue_handler_relationship_entityqueue.inc
+files[] = includes/views/entityqueue_handler_field_position.inc
+files[] = includes/views/entityqueue_handler_sort_position.inc
+files[] = includes/views/entityqueue_plugin_pager.inc
+files[] = includes/views/entityqueue_plugin_query.inc
+files[] = includes/views/entityqueue_plugin_wrapper.inc
diff --git entityqueue.module entityqueue.module
index 03a19eb..1cbebf6 100644
--- entityqueue.module
+++ entityqueue.module
@@ -642,3 +642,24 @@ function _entityqueue_create_entityreference_field($queue, $field_name, $entity_
     field_create_instance($instance);
   }
 }
+
+/**
+ * Implements hook_views_pre_execute().
+ */
+function entityqueue_views_pre_execute($view) {
+  // Seize control over the query plugin if a views handler requested so.
+  if (!empty($view->views_entityqueue)) {
+    $query = new entityqueue_plugin_query();
+    $query->entityqueue_wrap($view->query);
+  }
+}
+
+/**
+ * Implements hook_views_post_execute().
+ */
+function entityqueue_views_post_execute($view) {
+  // Restore original query plugin if it was wrapped.
+  if ($view->query instanceof entityqueue_plugin_wrapper) {
+    $view->query->entityqueue_unwrap();
+  }
+}
diff --git includes/views/entityqueue.views.inc includes/views/entityqueue.views.inc
index 5a52ca4..acd50e9 100644
--- includes/views/entityqueue.views.inc
+++ includes/views/entityqueue.views.inc
@@ -47,4 +47,17 @@ function entityqueue_views_data_alter(&$data) {
       unset($data[$field_table]);
     }
   }
+
+  $data['entityqueue_subqueue']['position'] = array(
+    'field' => array(
+      'title' => t('Position'),
+      'help' => t('The entity position in the queue.'),
+      'handler' => 'entityqueue_handler_field_position',
+    ),
+    'sort' => array(
+      'title' => t('Position'),
+      'help' => t('Use the position of the entity to sort the results.'),
+      'handler' => 'entityqueue_handler_sort_position',
+    ),
+  );
 }
diff --git includes/views/entityqueue_handler_field_position.inc includes/views/entityqueue_handler_field_position.inc
new file mode 100644
index 0000000..3f1e5c3
--- /dev/null
+++ includes/views/entityqueue_handler_field_position.inc
@@ -0,0 +1,46 @@
+<?php
+
+/**
+ * @file
+ * Handler to allow sorting on the elements position in the array.
+ */
+
+class entityqueue_handler_field_position extends views_handler_field {
+
+  function construct() {
+    parent::construct();
+    $this->field_alias = 'entityqueue_position';
+    $this->additional_fields['name'] = 'name';
+  }
+
+  function option_definition() {
+    $options = parent::option_definition();
+
+    return $options;
+  }
+
+  function options_form(&$form, &$form_state) {
+    parent::options_form($form, $form_state);
+  }
+
+  function query() {
+    $this->ensure_my_table();
+    $this->add_additional_fields();
+  }
+
+  function render($values) {;
+    $name = $values->{$this->aliases['name']};
+    $subqueue = entityqueue_subqueue_load($name);
+    $base_field = $this->view->base_field;
+
+    $position = NULL;
+    foreach ($subqueue->eq_node[LANGUAGE_NONE] as $key => $value) {
+      if ($value['target_id'] == $values->$base_field) {
+        $position = $key;
+        break;
+      }
+    }
+
+    return $position;
+  }
+}
diff --git includes/views/entityqueue_handler_sort_position.inc includes/views/entityqueue_handler_sort_position.inc
new file mode 100644
index 0000000..955afe9
--- /dev/null
+++ includes/views/entityqueue_handler_sort_position.inc
@@ -0,0 +1,99 @@
+<?php
+
+/**
+ * @file
+ * Handler to allow sorting on the elements position in the array.
+ */
+
+class entityqueue_handler_sort_position extends views_handler_sort {
+
+  protected $entityqueue_handler_field = NULL;
+
+  /**
+   * Implements views_handler#construct).
+   */
+  function construct() {
+    parent::construct();
+    $this->additional_fields['name'] = 'name';
+  }
+
+  /**
+   * Implements views_object#option_definition().
+   */
+  function option_definition() {
+    $options = parent::option_definition();
+
+    return $options;
+  }
+
+  /**
+   * Implements views_handler#options_form(&$form, &$form_state).
+   */
+  function options_form(&$form, &$form_state) {
+    parent::options_form($form, $form_state);
+    if (!isset($this->entityqueue_handler_field->aliases['name'])) {
+      $form['warning'] = array(
+        '#value' => '',
+        '#prefix' => '<h5>WARNING!</h5>',
+        '#suffix' => '<p>To sort on the position of items in the queue you need to add the position field to the fields in the view.</p>',
+      );
+    }
+  }
+
+  /**
+   * Implements views_handler_sort#query().
+   */
+  function query() {
+    // Inform entityqueue_views_pre_execute() to seize control over the query.
+    $this->view->views_entityqueue = TRUE;
+  }
+
+  /**
+   *
+   * @see entityqueue_views_pre_execute()
+   */
+  function php_pre_execute() {
+    // do nothing
+  }
+
+  /**
+   *
+   * @see entityqueue_views_post_execute()
+   */
+  function entityqueue_post_execute() {
+    foreach ($this->view->display_handler->get_handlers('field') as $field => $handler) {
+      if ($handler->field_alias == 'entityqueue_position') {
+        $this->entityqueue_handler_field = $handler;
+        break;
+      }
+    }
+
+    // only sort of we can find our field handler.
+    if ($this->entityqueue_handler_field != NULL) {
+      usort($this->view->result, array($this, 'entityqueue_sort'));
+    }
+  }
+
+  /**
+   * Helper function; usort() callback for sort support.
+   */
+  function entityqueue_sort($row1, $row2) {
+    $factor = strtoupper($this->options['order']) == 'ASC' ? 1 : -1;
+    $name = $row1->{$this->entityqueue_handler_field->aliases['name']};
+    $subqueue = entityqueue_subqueue_load($name);
+    $base_field = $this->view->base_field;
+    $position1 = NULL;
+    $position2 = NULL;
+
+    foreach ($subqueue->eq_node[LANGUAGE_NONE] as $key => $value) {
+      if ($value['target_id'] == $row1->$base_field) {
+        $position1 = $key;
+      }
+      if ($value['target_id'] == $row2->$base_field) {
+        $position2 = $key;
+      }
+    }
+
+    return $factor * (($position1 > $position2) ? 1 : -1);
+  }
+}
\ No newline at end of file
diff --git includes/views/entityqueue_plugin_pager.inc includes/views/entityqueue_plugin_pager.inc
new file mode 100644
index 0000000..22d8b82
--- /dev/null
+++ includes/views/entityqueue_plugin_pager.inc
@@ -0,0 +1,59 @@
+<?php
+
+/**
+ * A (fake) pager plugin that wraps around the actual pager.
+ *
+ * @ingroup views_pager_plugins
+ */
+class entityqueue_plugin_pager extends entityqueue_plugin_wrapper  {
+
+  /**
+   * Perform any needed actions just prior to the query executing.
+   */
+  public function pre_execute($query) {
+    $this->wrapped->pre_execute($query);
+
+    foreach (array(/*'argument',*/ 'field', 'filter', 'sort', /*'relationship'*/) as $type) {
+      foreach ($this->wrapped->view->$type as $id => $handler) {
+        if (is_callable(array($handler, 'entityqueue_pre_execute'))) {
+          $handler->entityqueue_pre_execute();
+        }
+      }
+    }
+
+    $this->wrapped->view->query->set_limit(0);
+    $this->wrapped->view->query->set_offset(0);
+  }
+
+  /**
+   * Perform any needed actions just after the query executing.
+   */
+  public function post_execute(&$result) {
+    foreach (array(/*'argument',*/ 'field', 'filter', 'sort', /*'relationship'*/) as $type) {
+      foreach ($this->wrapped->view->$type as $id => $handler) {
+        if (is_callable(array($handler, 'entityqueue_post_execute'))) {
+          $handler->entityqueue_post_execute();
+        }
+      }
+    }
+
+    $this->wrapped->total_items = count($this->wrapped->view->result);
+    $this->wrapped->update_page_info();
+
+    $item_per_page = $this->wrapped->get_items_per_page();
+    if ($item_per_page > 0) {
+      $offset = $this->wrapped->get_current_page() * $item_per_page + $this->wrapped->get_offset();
+      $this->wrapped->view->result = array_slice($this->wrapped->view->result, $offset, $item_per_page);
+    }
+    $this->wrapped->post_execute($result);
+  }
+
+
+  /**
+   * Execute the count query, which will be done just prior to the query
+   * itself being executed.
+   */
+  function execute_count_query(&$count_query) {
+    $this->wrapped->execute_count_query($count_query);
+  }
+}
diff --git includes/views/entityqueue_plugin_query.inc includes/views/entityqueue_plugin_query.inc
new file mode 100644
index 0000000..1e896e6
--- /dev/null
+++ includes/views/entityqueue_plugin_query.inc
@@ -0,0 +1,21 @@
+<?php
+
+/**
+ * A (fake) pager plugin that wraps around the actual query.
+ *
+ * @ingroup views_query_plugins
+ */
+class entityqueue_plugin_query extends entityqueue_plugin_wrapper {
+
+  /**
+   * Implements views_plugin_query#execute().
+   */
+  function execute(&$view) {
+    $pager = new entityqueue_plugin_pager();
+    $pager->entityqueue_wrap($this->wrapped->pager);
+
+    $this->wrapped->execute($view);
+
+    $pager->entityqueue_unwrap();
+  }
+}
diff --git includes/views/entityqueue_plugin_wrapper.inc includes/views/entityqueue_plugin_wrapper.inc
new file mode 100644
index 0000000..801a4d9
--- /dev/null
+++ includes/views/entityqueue_plugin_wrapper.inc
@@ -0,0 +1,50 @@
+<?php
+
+/**
+ * A helper class that wraps around the actual views plugin.
+ *
+ * @see entityqueue_plugin_query
+ * @see entityqueue_plugin_pager
+ */
+class entityqueue_plugin_wrapper {
+
+  protected $wrapped;
+  protected $wrapped_link;
+
+  public function entityqueue_wrap(&$link) {
+    $this->wrapped_link = &$link;
+    $this->wrapped = $link;
+    $link = $this;
+  }
+
+  public function entityqueue_unwrap() {
+    $this->wrapped_link = $this->wrapped;
+    unset($this->wrapped);
+    unset($this->wrapped_link);
+  }
+
+  public function &__get($name) {
+    return $this->wrapped->$name;
+  }
+
+  public function __set($name, $value) {
+    return $this->wrapped->$name = $value;
+  }
+
+  public function __isset($name) {
+    return isset($this->wrapped->$name);
+  }
+
+  public function __unset($name) {
+    unset($this->wrapped->$name);
+  }
+
+  public function __call($name, $arguments) {
+    return call_user_func_array(array($this->wrapped, $name), $arguments);
+  }
+
+  /**  As of PHP 5.3.0  */
+  public static function __callStatic($name, $arguments) {
+    return call_user_func_array(array(get_class($this->wrapped), $name), $arguments);
+  }
+}