diff --git a/nodequeue.install b/nodequeue.install
index 4e595ab..de4a44f 100644
--- a/nodequeue.install
+++ b/nodequeue.install
@@ -11,6 +11,20 @@
 function nodequeue_schema() {
   $schema['nodequeue_queue'] = array(
     'description' => 'Base table for queues, storing global information for each queue',
+    'export' => array(
+      'key' => 'name',
+      'identifier' => 'nodequeue',
+      'default hook' => 'default_nodequeue_nodequeue',
+      'load callback'=> 'nodequeue_export_load_object',
+      'export callback'=> 'nodequeue_export_object',
+      'api' => array(
+        'owner' => 'nodequeue',
+        'api' => 'default_nodequeue',
+        'minimum_version' => 1,
+        'current_version' => 1,
+      ),
+      
+    ),
     'fields' => array(
       'qid' => array(
         'description' => 'The primary identifier for a queue.',
@@ -114,6 +128,11 @@ function nodequeue_schema() {
         'unsigned' => TRUE,
         'not null' => TRUE
       ),
+      'name' => array(
+        'description' => 'The machine name for the nodequeue (qid)',
+        'type' => 'varchar',
+        'length' => 128,
+      ),
     ), // fields
     'indexes' => array(
       'qid' => array('qid'),
@@ -136,6 +155,11 @@ function nodequeue_schema() {
         'length' => 255,
         'not null' => FALSE
       ),
+      'name' => array(
+        'description' => 'The machine name for the nodequeue (qid)',
+        'type' => 'varchar',
+        'length' => 128,
+      ),
     ), // fields
     'indexes' => array(
       'qid' => array('qid'),
@@ -561,3 +585,35 @@ function nodequeue_update_6007() {
   return $ret;
 
 }
+
+/**
+ * Updated schema so roles and types have a machine name reference to the
+ * nodequeue for exporting / feature integration.
+ */
+function nodequeue_update_6008() {
+  $ret = array();
+  db_add_field($ret, 'nodequeue_roles', 'name', 
+       array(
+        'description' => 'The machine name for the nodequeue (qid)',
+        'type' => 'varchar',
+        'length' => 128,
+      ));
+  db_add_field($ret, 'nodequeue_types', 'name', 
+       array(
+        'description' => 'The machine name for the nodequeue (qid)',
+        'type' => 'varchar',
+        'length' => 128,
+      ));
+
+  // Fill in any existing nodequeue_types and nodequeue_roles so the
+  // machine name field now matches the existing qid.
+  $types_update_sql = "UPDATE {nodequeue_types} nqt LEFT JOIN {nodequeue_queue} nqq ON nqt.qid = nqq.qid SET nqt.name = nqq.name";
+  $roles_update_sql = "UPDATE {nodequeue_roles} nql LEFT JOIN {nodequeue_queue} nqq ON nql.qid = nqq.qid SET nql.name = nqq.name";
+
+  $ret[] = update_sql($types_update_sql);
+  $ret[] = update_sql($roles_update_sql);
+
+  return $ret;
+}
+
+
diff --git a/nodequeue.module b/nodequeue.module
index 32603dc..b425d4b 100644
--- a/nodequeue.module
+++ b/nodequeue.module
@@ -103,6 +103,14 @@ function nodequeue_menu() {
     'weight' => -10,
     'type' => MENU_DEFAULT_LOCAL_TASK
   );
+  $items['admin/content/nodequeue/%/export'] = array(
+    'title' => 'Export Nodequeue',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('nodequeue_export_nodequeue', 3),
+    'access arguments' => array('nodequeue export permission'),
+    'tab parent' => 'admin/content/nodequeue/%',
+    'type' => MENU_LOCAL_TASK
+  );
   $items['admin/content/nodequeue/%nodequeue/view/%subqueue'] = array(
     'title' => 'View',
     'page callback' => 'nodequeue_admin_view',
@@ -702,8 +710,44 @@ function nodequeue_load_queues($qids = array(), $bypass_cache = FALSE) {
     while ($obj = db_fetch_object($result)) {
       $loaded[$obj->qid]->types[] = $obj->type;
     }
+  }
 
-    drupal_alter('nodequeue', $loaded, 'load_queues');
+  /*
+   * Features Intergration (via ctools):
+   * ctools can most likely handle this entire function and many other nodequeue functions
+   * however for this Drupal 6 version, I don't think we want to introduce a new depandancy
+   * to ctools right now. So for now we will jut check if the module exists and
+   * as we figure out how to better ctools we can pull more of it in.
+   */
+  
+  
+  if(module_exists('ctools') && FALSE){
+    ctools_include('export');
+    $default_nodequeues = ctools_export_load_object('nodequeue_queue', 'all');
+    foreach( $default_nodequeues as $def_nq ) {
+      nodequeue_export_object_merge_additions($def_nq);
+      
+      $nq_overridden = FALSE;
+      if(!empty($loaded)) {
+        foreach( $loaded as $ld_nq ) {
+          if ($ld_nq->name == $def_nq->name) {
+            $nq_overridden = TRUE;
+         }
+        }
+      }
+      if(!$nq_overridden) {
+        // Write the default nq to the database, get it's qid, 
+        // and then add it to the $loaded array.
+        unset($def_nq->qid);
+        nodequeue_save($def_nq); // Error checking needed
+        $loaded[$def_nq->qid] = $def_nq;
+      }
+    }
+  }
+
+
+  if(!empty($loaded)) {
+     drupal_alter('nodequeue', $loaded, 'load_queues');
   }
 
   if ($bypass_cache) {
@@ -735,6 +779,91 @@ function nodequeue_load($qid) {
 }
 
 /**
+ * Export a nodequeue and display it in a form (for ctools / features).
+ */
+function nodequeue_export_nodequeue(&$form_state, $name) {
+  $nq_obj = nodequeue_export_load_object($name);
+  $code = nodequeue_export_object($nq_obj);
+  $lines = substr_count($code,'\n');
+
+  $form['export'] = array(
+    '#title' => t('Export data'),
+    '#type' => 'textarea',
+    '#value' => $code,
+    '#rows' => $lines,
+    '#description' => t('Copy the export text and paste it into another nodequeue using the import function.'),
+  );
+
+  return $form;
+}
+
+/**
+ * Loads a single nodequeue via ctools
+ *
+ * @param $name
+ *   The machine name of the nodequeue
+ *
+ * @return $result
+ *   A nodequeue object
+ */
+function nodequeue_export_load_object($name) {
+  ctools_include('export');
+  $result = ctools_export_load_object('nodequeue_queue', 'names', array($name));
+  if (isset($result[$name])) {
+    nodequeue_export_object_merge_additions($result[$name]);
+    return $result[$name];
+  }
+}
+
+/**
+ * Returns the output for exporting a single nodequeue
+ *
+ * @param $obj
+ *   The machine name of the nodequeue
+ * @param $indent
+ *   The machine name of the nodequeue
+ *
+ * @return $result
+ *   A nodequeue object
+ */
+function nodequeue_export_object($obj, $indent = '') {
+  ctools_include('export');
+  $additions = nodequeue_export_object_additions($obj);
+  $output = ctools_export_object('nodequeue_queue', $obj, $indent, null, $additions);
+  return $output;
+}
+
+/**
+ * Merge nodequeue additions to the nodequeue object
+ *
+ * @param $queue
+ *   The nodequeue
+ */
+function nodequeue_export_object_merge_additions(&$queue) {
+   $additions = nodequeue_export_object_additions($queue);
+   $queue = (object) array_merge((array) $queue, (array) $additions);
+}
+
+/**
+ * Grab additions for nodequeue objects export. 
+ *
+ * @param $queue
+ *   The nodequeue
+ */
+function nodequeue_export_object_additions($queue) {
+  $additions = new stdClass;
+  $roles = db_query("SELECT qid, rid FROM {nodequeue_roles} WHERE name = '%s'", $queue->name);
+  while ($obj = db_fetch_object($roles)) {
+    $additions->roles[] = $obj->rid;
+  }
+  $types = db_query("SELECT qid, type FROM {nodequeue_types} WHERE name = '%s'", $queue->name);
+  while ($obj = db_fetch_object($types)) {
+    $additions->types[] = $obj->type;
+  }
+  return $additions;
+}
+
+/**
  * This function exists so that %subqueue will work in hook_menu.
  */
 function subqueue_load($sqid) {
@@ -926,12 +1055,12 @@ function nodequeue_save(&$queue) {
 
   if (is_array($queue->roles)) {
     foreach ($queue->roles as $rid)
-      db_query("INSERT INTO {nodequeue_roles} (qid, rid) VALUES (%d, %d)", $queue->qid, $rid);
+      db_query("INSERT INTO {nodequeue_roles} (qid, rid, name) VALUES (%d, %d, '%s')", $queue->qid, $rid, $queue->name);
   }
 
   if (is_array($queue->types)) {
     foreach ($queue->types as $type)
-      db_query("INSERT INTO {nodequeue_types} (qid, type) VALUES (%d, '%s')", $queue->qid, $type);
+      db_query("INSERT INTO {nodequeue_types} (qid, type, name) VALUES (%d, '%s', '%s')", $queue->qid, $type, $queue->name);
   }
 
   // set our global that tells us whether or not we need to activate hook_link
