diff --git a/nodequeue_annotate.module b/nodequeue_annotate.module
index 2db5b8c..ab98631 100644
--- a/nodequeue_annotate.module
+++ b/nodequeue_annotate.module
@@ -62,6 +62,15 @@ function nodequeue_annotate_theme() {
 }
 
 /**
+ * Implementation of hook_registry_alter().
+ */
+function nodequeue_annotate_theme_registry_alter(&$theme_registry) {
+  if (!empty($theme_registry['form_element'])) {
+    $theme_registry['nodequeue_arrange_subqueue_form']['function'] = 'theme_nodequeue_annotate_arrange_subqueue_form';
+  }
+}
+
+/**
  * Implementation of hook_link_alter().
  */
 function nodequeue_annotate_link_alter(&$links, $node) {
@@ -123,6 +132,32 @@ function nodequeue_annotate_link_alter(&$links, $node) {
 }
 
 /**
+ * Implementation of hook_form_alter().
+ */
+function nodequeue_annotate_form_alter(&$form, &$form_state, $form_id) {
+  $form_target = 'nodequeue_arrange_subqueue_form_';
+  // Check that $form_id begins with $form_target
+  if (substr($form_id, 0, strlen($form_target)) == $form_target) {
+    $form['submit']['#submit'][] = 'nodequeue_annotate_form_submit';
+    
+    // Additions specific to Nodequeue Annotate Admin
+    $qid = $form['#queue']['qid']; $sqid = $form['#subqueue']['sqid'];
+    foreach (element_children($form) as $key) {
+      if (isset($form[$key]['title'])) {
+        $form[$key]['annotation'] = array(
+          '#type' => 'textarea',
+          '#default_value' => check_plain(nodequeue_annotate_get_annotation($qid, $sqid, $key)),
+          '#cols' => 30,
+          '#rows' => 2,
+          '#resizable' => FALSE,
+          '#maxlength' => 255,
+        );
+      }
+    }    
+  }
+}
+
+/**
  * Implementation of hook_nodequeue_table().
  */
 function nodequeue_annotate_nodequeue_table($table_id, &$header, &$rows, &$attributes, &$caption, $queues = NULL, $subqueues = NULL, $node = NULL) {
@@ -299,6 +334,80 @@ function nodequeue_annotate_edit_form_submit($form, &$form_state) {
 }
 
 /**
+ * Theme the subqueue overview as a sortable list, with configurable annotations.
+ *
+ * @ingroup themeable
+ */
+function theme_nodequeue_annotate_arrange_subqueue_form($form) {
+  
+  $output = '';
+
+  $subqueue = $form['#subqueue'];
+
+  // Get css to hide some of the help text if javascript is disabled.
+  drupal_add_css(drupal_get_path('module', 'nodequeue') .'/nodequeue.css');
+
+  $table_id = 'nodequeue-dragdrop-' . $subqueue['sqid'];
+  $table_classes = array(
+    'nodequeue-dragdrop',
+    'nodequeue-dragdrop-qid-' . $subqueue['qid'],
+    'nodequeue-dragdrop-sqid-' . $subqueue['sqid'],
+    'nodequeue-dragdrop-reference-' . $subqueue['reference'],
+  );
+  drupal_add_tabledrag($table_id, 'order', 'sibling', 'node-position');
+  drupal_add_js(drupal_get_path('module', 'nodequeue') .'/nodequeue_dragdrop.js');
+
+  $reverse[str_replace('-', '_', $table_id)] = (bool) $form['#queue']['reverse'];
+  drupal_add_js(array('nodequeue' => array('reverse' => $reverse)), 'setting');
+
+  // Render form as table rows.
+  $rows = array();
+  $counter = 1;
+  foreach (element_children($form) as $key) {
+    if (isset($form[$key]['title'])) {
+      $row = array();
+
+      $row[] = drupal_render($form[$key]['title']);
+      $row[] = drupal_render($form[$key]['annotation']);
+      $row[] = drupal_render($form[$key]['author']);
+      $row[] = drupal_render($form[$key]['date']);
+      $row[] = drupal_render($form[$key]['position']);
+      $row[] = (!empty($form[$key]['edit'])) ? drupal_render($form[$key]['edit']) : '&nbsp;';
+      $row[] = drupal_render($form[$key]['remove']);
+      $row[] = array(
+        'data' => $counter,
+        'class' => 'position'
+      );
+
+      $rows[] = array(
+        'data'  => $row,
+        'class' => 'draggable',
+      );
+    }
+
+    $counter++;
+  }
+  if (empty($rows)) {
+    $rows[] = array(array('data' => t('No nodes in this queue.'), 'colspan' => 7));
+  }
+
+  // Render the main nodequeue table.
+  $header = array(t('Title'), t(_nodequeue_annotate_variable_get('form_title')), t('Author'), t('Post Date'), t('Position'), array('data' => t('Operations'), 'colspan' => 2), t('Position'));
+  $output .= theme('table', $header, $rows, array('id' => $table_id, 'class' => implode(' ', $table_classes)));
+
+  // Render the autocomplete field for adding a node to the table.
+  $output .= '<div class="container-inline">';
+  $output .= drupal_render($form['add']['nid']);
+  $output .= drupal_render($form['add']['submit']);
+  $output .= '</div>';
+
+  // Render the remaining form elements.
+  $output .= drupal_render($form);
+
+  return $output;
+}
+
+/**
  * Form to change settings for this module.
  */
 function nodequeue_annotate_admin_settings($form_state) {
@@ -556,6 +665,30 @@ function nodequeue_annotate_unset_annotation($qid, $sqid, $nid) {
   db_query("UPDATE {nodequeue_nodes} SET annotation = NULL WHERE qid = %d AND sqid = %d AND nid = %d", $qid, $sqid, $nid);
 }
 
+function nodequeue_annotate_form_submit($form, &$form_state) {
+  // Export variables for easier handling.
+  $sqid = $form['#subqueue']['sqid'];
+  $qid = $form['#subqueue']['qid'];
+  
+  foreach ($form_state['values'] as $nid => $element) {
+    if (is_numeric($nid)) {
+      $annotation = $element['annotation'];
+      if (!empty($annotation)) {
+        // The annotation is not empty - Set it.
+        nodequeue_annotate_set_annotation($qid, $sqid, $nid, $annotation);
+        // drupal_set_message('Annotation has been set.');
+      }
+      // don't bother unsetting, nodequeue seems to be doing so inadvertently 
+      /*
+      else if ((bool)(nodequeue_annotate_get_annotation($qid, $sqid, $nid))) {
+        // The annotation is empty, but the assignment already has an annotation - Remove it.
+        nodequeue_annotate_unset_annotation($qid, $sqid, $nid);
+        drupal_set_message('Annotation has been removed.');
+      } 
+      */
+    }
+  }
+}
 
 /**
  * Private functions.
@@ -695,4 +828,4 @@ function _nodequeue_annotate_variable_get($var) {
  */
 function _nodequeue_annotate_variable_set($var, $value) {
   variable_set("nodequeue_annotate_$var", $value);
-}
\ No newline at end of file
+}
