diff --git a/nodequeue.module b/nodequeue.module
index fc3dbbb..9a1ce7b 100644
--- a/nodequeue.module
+++ b/nodequeue.module
@@ -778,32 +778,31 @@ function nodequeue_load_subqueues_by_queue($qids, $page_size = 0) {
  *   is another array of references.
  */
 function nodequeue_load_subqueues_by_reference($references, $bypass_cache = FALSE) {
-  $cache = &drupal_static(__FUNCTION__, array());
+  static $cache = array();
   $subqueues = array();
-  if ($bypass_cache) {
-    $cache = array();
-  }
-
-  if (!empty($references)) {
-    $query = db_select('nodequeue_subqueue', 's')
-      ->groupBy('s.sqid')
-      ->fields('s');
-    $query->leftJoin('nodequeue_nodes', 'n', 'n.sqid = s.sqid');
-    $query->addExpression('COUNT(n.position)', 'count');
-
-    $where = db_or();
-    foreach ($references as $qid => $reference) {
-      $where->condition(db_and()->condition('s.qid', $qid)->condition('s.reference', $reference));
-    }
-    $query->condition($where);
-    $result = $query->execute();
-
-    foreach ($result as $subqueue) {
-      $cache[$subqueue->qid][$subqueue->reference] = $subqueues[$subqueue->sqid] = $subqueue;
+  // Unique CID
+  $cid = md5(serialize($references));
+
+  if (empty($cache[$cid]) || $bypass_cache){
+    if (!empty($references)) {
+      $query = db_select('nodequeue_subqueue', 's')
+        ->groupBy('s.sqid')
+        ->fields('s');
+      $query->leftJoin('nodequeue_nodes', 'n', 'n.sqid = s.sqid');
+      $query->addExpression('COUNT(n.position)', 'count');
+      $where = db_or();
+      foreach ($references as $qid => $reference) {
+        $where->condition(db_and()->condition('s.qid', $qid)->condition('s.reference', $reference));
+      }
+      $query->condition($where);
+      $result = $query->execute();
+      foreach ($result as $subqueue) {
+        $cache[$cid][$subqueue->sqid] = $subqueue;
+      }
     }
   }
 
-  return $subqueues;
+  return $cache[$cid];
 }
 
 /**
@@ -1394,23 +1393,25 @@ function nodequeue_set_subqueue_positions(&$subqueues, $nid) {
  *
  */
 function nodequeue_get_subqueues_by_node($queues, $node) {
-  // Determine which subqueues are valid for each queue.
-  $references = array();
-  $last_nid = &drupal_static(__FUNCTION__, 0);
-  foreach ($queues as $queue) {
-    if ($result = nodequeue_api_subqueues($queue, $node)) {
-      $references[$queue->qid] = is_array($result) ? $result : array($result);
+  static $cache = array();
+  $cid = $node->nid . '-' . md5(serialize($queues));
+
+  if (empty($cache[$cid])) {
+    // Determine which subqueues are valid for each queue.
+    $references = array();
+    foreach ($queues as $queue) {
+      if ($result = nodequeue_api_subqueues($queue, $node)) {
+        $references[$queue->qid] = is_array($result) ? $result : array($result);
+      }
     }
+    if (empty($references)) {
+      return array();
+    }
+    $subqueues = nodequeue_load_subqueues_by_reference($references);
+    $cache[$cid] = $subqueues;
   }
 
-  if (empty($references)) {
-    return array();
-  }
-  // only allow the static cache to be used if the nid is the same as the last
-  $subqueues = nodequeue_load_subqueues_by_reference($references, ($last_nid != $node->nid));
-  $last_nid = $node->nid;
-
-  return $subqueues;
+  return $cache[$cid];
 }
 
 /**
diff --git a/smartqueue.module b/smartqueue.module
index c49f030..84e85f2 100644
--- a/smartqueue.module
+++ b/smartqueue.module
@@ -106,63 +106,73 @@ function smartqueue_taxonomy_nodequeue_form_submit_finish($queue, $form_state) {
  * Returns list of references for subqueues that can host a given node.
  */
 function smartqueue_taxonomy_nodequeue_subqueues(&$queue, $node) {
+  // Use static cache
+  static $cache = array();
+  $cid = $queue->qid . '-' . $node->nid;
   $field_names = array();
 
-  // Check if at least one supported field exists in node and load
-  // selected tids.
-  foreach (explode('-', $queue->reference) as $field_name) {
-    // Save tids.
-    if ($field_values = field_get_items('node', $node, $field_name)) {
-      $field_names[$field_name] = array();
-      foreach ($field_values as $field_value) {
-        $field_names[$field_name][] = $field_value['tid'];
+  if (empty($cache[$cid])){
+    // Check if at least one supported field exists in node and load
+    // selected tids.
+    foreach (explode('-', $queue->reference) as $field_name) {
+      // Save tids.
+      if ($field_values = field_get_items('node', $node, $field_name)) {
+        $field_names[$field_name] = array();
+        foreach ($field_values as $field_value) {
+          $field_names[$field_name][] = $field_value['tid'];
+        }
       }
     }
-  }
 
-  if (!empty($field_names) && $queue->use_parents) {
-    // Replace taxonomy IDs with their parents'.
-    foreach ($field_names as $field_name => &$tids) {
-      $tids = smartqueue_taxonomy_get_parents($tids);
+    if (!empty($field_names) && $queue->use_parents) {
+      // Replace taxonomy IDs with their parents'.
+      foreach ($field_names as $field_name => &$tids) {
+        $tids = smartqueue_taxonomy_get_parents($tids);
+      }
     }
-  }
 
-  // Forbid NO terms being set, but allow
-  // various non-terms to be set.
-  $empty = TRUE;
-  foreach ($field_names as $field_name => $tids) {
-    if (!empty($tids)) {
-      $empty = FALSE;
-    }
-    if (!count($field_names[$field_name])) {
-      $field_names[$field_name][] = 0;
+    // Forbid NO terms being set, but allow
+    // various non-terms to be set.
+    $empty = TRUE;
+    foreach ($field_names as $field_name => $tids) {
+      if (!empty($tids)) {
+        $empty = FALSE;
+      }
+      if (!count($field_names[$field_name])) {
+        $field_names[$field_name][] = 0;
+      }
     }
-  }
 
-  if ($empty) {
-    return;
-  }
-
-  // Build reference strings for all subqueues.
-  $references = smartqueue_build_string(array_filter($field_names));
+    if ($empty) {
+      return;
+    }
 
-  // We're returning an array of references for efficiency, but we also have
-  // to check to see if the references we've generated exist. If they don't,
-  // we have to create them.
-  $exists = array();
-  $subqueues = nodequeue_load_subqueues_by_reference(array($queue->qid => $references));
-  foreach ($subqueues as $subqueue) {
-    $exists[$subqueue->reference] = TRUE;
-  }
+    // Build reference strings for all subqueues.
+    $references = smartqueue_build_string(array_filter($field_names));
+    // We're returning an array of references for efficiency, but we also have
+    // to check to see if the references we've generated exist. If they don't,
+    // we have to create them.
+    $exists = array();
+    $subqueues = nodequeue_load_subqueues_by_reference(array($queue->qid => $references));
+    foreach ($subqueues as $subqueue) {
+      $exists[$subqueue->reference] = TRUE;
+    }
 
-  // Create subqueues if needed.
-  foreach ($references as $reference) {
-    if (empty($exists[$reference])) {
-      nodequeue_add_subqueue($queue, smartqueue_taxonomy_nodequeue_subqueue_title($queue, $reference), $reference);
+    // Create subqueues if needed.
+    foreach ($references as $reference) {
+      if (empty($exists[$reference])) {
+        $title = smartqueue_taxonomy_nodequeue_subqueue_title($queue, $reference);
+        // Fix for adding empty titled subqueues
+        if($title && ($title != $reference)){
+          nodequeue_add_subqueue($queue, $title, $reference);
+        }
+      }
     }
+    $cache[$cid] = $references;
   }
 
-  return $references;
+  return $cache[$cid];
+
 }
 
 /**
