diff --git a/advpoll.admin.inc b/advpoll.admin.inc
index d58f071..15317eb 100644
--- a/advpoll.admin.inc
+++ b/advpoll.admin.inc
@@ -30,7 +30,7 @@ function advpoll_remove_voter() {
  */
 function advpoll_cancel($node) {
   global $user;
-  if (isset($node->type) && $node->voted && _advpoll_is_active($node)) {
+  if (isset($node->type) && advpoll_get_user_voted($node->nid) && _advpoll_is_active($node)) {
     if ($user->uid && count($user_votes = votingapi_select_votes(array('content_type' => 'advpoll', 'content_id' => $node->nid, 'uid' => $user->uid))) > 0) {
       votingapi_delete_votes($user_votes);
     }
diff --git a/advpoll.module b/advpoll.module
index 23ae8ab..d766257 100644
--- a/advpoll.module
+++ b/advpoll.module
@@ -204,7 +204,7 @@ function advpoll_init() {
  * Results access callback.
  */
 function _advpoll_results_access($node) {
-  return node_access('view', $node) && strstr($node->type, 'advpoll_') && _advpoll_is_active($node) && $node->votes > 0 && !$node->voted && _advpoll_can_view_results($node);
+  return node_access('view', $node) && strstr($node->type, 'advpoll_') && _advpoll_is_active($node) && advpoll_get_total_votes($node->nid) > 0 && !advpoll_get_user_voted($node->nid) && _advpoll_can_view_results($node);
 }
 
 /**
@@ -218,14 +218,14 @@ function _advpoll_electoral_list_access($node) {
  * Votes access callback.
  */
 function _advpoll_votes_access($node) {
-  return node_access('view', $node) && strstr($node->type, 'advpoll_') && $node->votes > 0 && ((user_access('inspect all votes') && $node->show_votes) || user_access('administer polls'));
+  return node_access('view', $node) && strstr($node->type, 'advpoll_') && advpoll_get_total_votes($node->nid) > 0 && ((user_access('inspect all votes') && $node->show_votes) || user_access('administer polls'));
 }
 
 /**
  * Clear votes access callback.
  */
 function _advpoll_clear_votes_access($node) {
-  return node_access('view', $node) && strstr($node->type, 'advpoll_') && $node->votes > 0 && user_access('administer polls');
+  return node_access('view', $node) && strstr($node->type, 'advpoll_') && advpoll_get_total_votes($node->nid) > 0 && user_access('administer polls');
 }
 
 /**
@@ -269,7 +269,7 @@ function theme_advpoll_block_latest_poll() {
   if ($node) {
     $output .= '<h3>'. l($node->title, 'node/'. $node->nid) .'</h3>';
     $output .= drupal_render($node->content);
-    if ($node->voted) {
+    if (advpoll_get_user_voted($node->nid)) {
       $output .= '<p>'. l(t('Older polls'), 'polls', array('class' => 'old-polls', 'title' => t('View the list of polls on this site.'))) .'</p>';
     }
   }
@@ -686,18 +686,64 @@ function advpoll_load($node) {
     }
   }
   $poll->choices = count($poll->choice);
+  return $poll;
+}
 
-  $result = db_query("SELECT value FROM {votingapi_cache} WHERE content_type = 'advpoll' AND content_id = %d AND tag = '_advpoll' AND function = 'total_votes'", $node->nid);
-  if ($cache = db_fetch_object($result)) {
-    // Found total votes in the cache.
-    $poll->votes = $cache->value;
+/**
+ * Get the total votes for a poll.
+ */
+function advpoll_get_total_votes($nid, $reset = FALSE) {
+  static $votes;
+  if ($reset || !isset($votes[$nid])) {
+    $votes[$nid] = db_result(db_query("SELECT value FROM {votingapi_cache} WHERE content_type = 'advpoll' AND content_id = %d AND tag = '_advpoll' AND function = 'total_votes'", $nid));
   }
-  else {
-    $poll->votes = 0;
+  return !empty($votes[$nid]) ? $votes[$nid] : 0;
+}
+
+/**
+ * Check if a user has voted on a poll.
+ *
+ * @return Array indicating if user voted and, if so, if the vote is cancellable.
+ */
+function advpoll_get_user_voted($nid, $account = NULL, $reset = FALSE) {
+  static $voting_info;
+  if (!$account) {
+    global $user;
+    $account = $user;
   }
+  if ($reset) {
+    $voting_info[$nid] = array();
+  }
+  $voted = FALSE;
+  $cancel_vote = FALSE;
 
-  list($poll->voted, $poll->cancel_vote) = _advpoll_user_voted($node->nid);
-  return $poll;
+  if (!isset($voting_info[$nid][$account->uid])) {
+    $args = array('content_id' => $nid, 'uid' => $account->uid);
+    if (!$account->uid) {
+      $args['vote_source'] = ip_address();
+    }
+    $voting_info[$nid][$account->uid] = count(votingapi_select_votes($args));
+  }
+  return $voting_info[$nid][$account->uid];
+}
+
+/**
+ * Implementation of hook_votingapi_insert().
+ */
+function advpoll_votingapi_insert($votes) {
+  foreach ($votes as $vote) {
+    if ($vote['content_type'] == 'advpoll') {
+      advpoll_clear_poll_caches($vote['content_id']);
+    }
+  }
+}
+
+/**
+ * Clears the cache about this node in relation to voting.
+ */
+function advpoll_clear_poll_caches($nid) {
+  advpoll_get_user_voted($nid, NULL, TRUE);
+  advpoll_get_total_votes($nid, TRUE);
 }
 
 /**
@@ -816,7 +862,7 @@ function advpoll_view($node, $teaser = FALSE, $page = FALSE) {
     // Previewing a node, so display voting form instead of results.
     $poll = drupal_get_form('advpoll_voting_'. _advpoll_get_mode($node->type) .'_form', $node, $teaser, $page, $status);
   }
-  else if (!$node->voted && arg(2) != 'results' && ($status == 'open' || $status == 'pending')) {
+  else if (!advpoll_get_user_voted($node->nid) && arg(2) != 'results' && ($status == 'open' || $status == 'pending')) {
   // OLD: else if ((!$node->voted && arg(2) != 'results' && ($status == 'open' || $status == 'pending')) || $_POST['op'] == 'Vote') {
 
     // User hasn't voted, we're not on the results tab and poll is open or
@@ -883,34 +929,6 @@ function advpoll_votingapi_results_alter(&$cache, $content_type, $content_id) {
 }
 
 /**
- * Check if a user has voted on a poll.
- *
- * @return Array indicating if user voted and, if so, if the vote is cancellable.
- */
-function _advpoll_user_voted($nid) {
-  global $user;
-  $voted = FALSE;
-  $cancel_vote = FALSE;
-
-  if ($user->uid) {
-    // Voter is logged in.
-    $voted = count(votingapi_select_votes(array('uid' => $user->uid, 'content_id' => $nid)));
-    if ($voted) {
-      $cancel_vote = TRUE;
-    }
-  }
-  else {
-    // Voter is anonymous.
-    $voted = count(votingapi_select_votes(array('vote_source' => ip_address(), 'content_id' => $nid, 'uid' => 0)));
-    if ($voted) {
-      // Found a vote in the database.
-      $cancel_vote = TRUE;
-    }
-  }
-  return array($voted, $cancel_vote);
-}
-
-/**
  * Build electorial list form.
  */
 function advpoll_electoral_list_form(&$form_state, $nid) {
@@ -1025,7 +1043,7 @@ function advpoll_electoral_list_form_submit($form, &$form_state) {
 function _advpoll_can_view_results($node) {
   $view_results = variable_get('advpoll_view_results_'. $node->type, ADVPOLL_VIEW_RESULTS);
   return (!_advpoll_is_active($node)  // Node is closed
-        || ($node->voted && $view_results == 'aftervote') // User voted
+        || (advpoll_get_user_voted($node->nid) && $view_results == 'aftervote') // User voted
         || ($view_results == 'always')); // All can view
 }
 
@@ -1201,7 +1219,7 @@ function advpoll_clear_votes_confirm_form_submit($form, &$form_state) {
       db_query('DELETE FROM {advpoll_choices} WHERE writein = 1 AND nid = %d', $node->nid);
       votingapi_recalculate_results('advpoll', $node->nid);
       drupal_set_message(t('Votes have been cleared.'));
-      watchdog('content', 'Cleared all poll votes (%num_votes).', array('%num_votes' => $node->votes), WATCHDOG_NOTICE, l(t('view'), 'node/' . $node->nid));
+      watchdog('content', 'Cleared all poll votes (%num_votes).', array('%num_votes' => advpoll_get_total_votes($node->nid)), WATCHDOG_NOTICE, l(t('view'), 'node/' . $node->nid));
     }
     $form_state['redirect'] = 'node/'. $node->nid;
   }
@@ -1237,7 +1255,7 @@ function theme_advpoll_results($title, $results, $votes, $links, $nid, $voted, $
 
 function _advpoll_show_cancel_form($node) {
   $output = '';
-  if ($node->voted && $node->cancel_vote && user_access('cancel own vote') && _advpoll_is_active($node)) {
+  if (advpoll_get_user_voted($node->nid) && user_access('cancel own vote') && _advpoll_is_active($node)) {
     $output .= drupal_get_form('advpoll_cancel_form', $node->nid);
   }
   return $output;
@@ -1264,16 +1282,7 @@ function _advpoll_vote_response($node, $form_state) {
     }
     // Update the number of choices.
     $node->choices = count($node->choice);
-    // Get updated total number of votes from database.
-    $result = db_query("SELECT value FROM {votingapi_cache} WHERE content_type = 'advpoll' AND content_id = %d AND tag = '_advpoll' AND function = 'total_votes'", $node->nid);
-    if ($cache = db_fetch_object($result)) {
-      $node->votes = $cache->value;
-    }
-    else {
-      $node->votes = 0;
-    }
 
-    list($node->voted, $node->cancel_vote) = _advpoll_user_voted($node->nid);
     $ajax_output = '';
     if (user_access('show vote results')) {
       $ajax_output .= advpoll_view_results($node, NULL, NULL);
@@ -1306,7 +1315,7 @@ function advpoll_view_results(&$node, $teaser, $page) {
   if (_advpoll_can_view_results($node)) {
     if (function_exists('advpoll_view_results_'. $mode)) {
       $results = call_user_func('advpoll_view_results_'. $mode, $node, $teaser, $page);
-      $output .= theme('advpoll_results', check_plain($node->title), $results['results'], $results['votes'], isset($node->links) ? $node->links : array(), $node->nid, $node->voted, $node->cancel_vote);
+      $output .= theme('advpoll_results', check_plain($node->title), $results['results'], $results['votes'], isset($node->links) ? $node->links : array(), $node->nid, advpoll_get_user_voted($node->nid), advpoll_get_user_voted($node->nid));
     }
   }
   $output .= _advpoll_show_cancel_form($node);
diff --git a/advpoll.pages.inc b/advpoll.pages.inc
index 207fd46..de289f0 100644
--- a/advpoll.pages.inc
+++ b/advpoll.pages.inc
@@ -15,7 +15,7 @@ function advpoll_page() {
   $result = pager_query($sql, 15);
   $output = '<ul>';
   while ($node = db_fetch_object($result)) {
-    $output .= '<li>'. l($node->title, 'node/'. $node->nid) .' - '. format_plural($node->votes, '1 vote', '@count votes') .' - '. (_advpoll_is_active($node) ? t('open') : t('closed')) .'</li>';
+    $output .= '<li>'. l($node->title, 'node/'. $node->nid) .' - '. format_plural(advpoll_get_total_votes($node->nid), '1 vote', '@count votes') .' - '. (_advpoll_is_active($node) ? t('open') : t('closed')) .'</li>';
   }
   $output .= '</ul>';
   $output .= theme('pager', NULL, 15);
diff --git a/modes/binary.inc b/modes/binary.inc
index 90f6bb8..7c41888 100644
--- a/modes/binary.inc
+++ b/modes/binary.inc
@@ -241,8 +241,7 @@ function advpoll_voting_binary_form_validate($form, &$form_state) {
   $writein_text = isset($form_state['values']['writein_key']) ? $form_state['values']['writein_choice'] : '';
 
   // Check if user has already voted
-  list($voted, $cancel_vote) = _advpoll_user_voted($node->nid);
-  if ($voted) {
+  if (advpoll_get_user_voted($node->nid, NULL, TRUE)) {
     _advpoll_form_set_error('choice[', t('You have already voted in this poll.'), $ajax);
     // Redirect to the current poll node to view the poll result instead of the voting form. This is only
     // initiated for non-Ajax voting.
diff --git a/modes/ranking.inc b/modes/ranking.inc
index c702308..8ad303f 100644
--- a/modes/ranking.inc
+++ b/modes/ranking.inc
@@ -750,8 +750,7 @@ function advpoll_voting_ranking_form_validate($form, &$form_state) {
   $writein_text = isset($form_state['values']['writein_key']) ? $form_state['values']['writein_choice'] : '';
 
   // Check if user has already voted.
-  list($voted, $cancel_vote) = _advpoll_user_voted($node->nid);
-  if ($voted) {
+  if (advpoll_get_user_voted($node->nid, NULL, TRUE)) {
     _advpoll_form_set_error('choice[', t('You have already voted in this poll.'), $ajax);
     // Redirect to the current poll node to view the poll result instead of the voting form. This is only
     // initiated for non-Ajax voting.
