diff -rupN plus1/plus1.module plus1_new/plus1.module
--- plus1/plus1.module	2009-03-18 16:04:42.000000000 +1100
+++ plus1.module	2010-02-11 15:04:11.599429667 +1100
@@ -9,7 +9,7 @@
 * Implementation of hook_perm().
 */
 function plus1_perm() {
-  return array('vote on content', 'administer the voting widget');
+  return array('vote on content', 'administer the voting widget', 'reset plus1 votes');
 }
 
 /**
@@ -33,10 +33,30 @@ function plus1_menu() {
     'access arguments' => array('administer the voting widget'),
   );
 
+  $items['node/%node/reset-votes'] = array(
+    'title' => t('Reset votes'),
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('plus1_node_reset_confirm', 1),
+    'access callback' => 'plus1_reset_access_callback',
+    'access arguments' => array(1),
+    'type' => MENU_CALLBACK,
+  );
+
   return $items;
 }
 
 /**
+ * Access callback function for the reset votes page.
+ * Allow access if the user can edit the node and can reset votes.
+ */
+function plus1_reset_access_callback($node) {
+  if (!$node) {
+    return FALSE;
+  }
+  return node_access('update', $node) && user_access('reset plus1 votes'); 
+}
+
+/**
 * Implementation of hook_init().
 */
 function plus1_init() {
@@ -102,6 +122,18 @@ function plus1_settings() {
     '#description' => t('The higher the weight the lower in the node the widget will be added. Can be a negative number.'),
   );
 
+  $form['plus1_reset'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Vote reset settings'),
+  );
+
+  $form['plus1_reset']['plus1_enable_node_reset'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Enable reset votes button for nodes'),
+    '#default_value' => variable_get('plus1_enable_node_reset', 0),
+    '#description' => t('If selected, a "Reset votes" button will display on the node edit screen that will reset votes for that node to zero.') . '<br />' . t('The button will display for any users that have the "reset plus1 votes" permission'),
+  );
+
   $form['array_filter'] = array('#type' => 'hidden');
 
   return system_settings_form($form);
@@ -232,13 +264,84 @@ function plus1_nodeapi(&$node, $op, $tea
       }
       break;
     case 'delete':
-      $criteria['content_id'] = $node->nid;
-      $votes = votingapi_select_votes($criteria);
-      votingapi_delete_votes($votes);
+      plus1_delete_node_votes($node->nid);
       break;
   }
 }
 
+/**
+ * Implementation of hook_form_alter().
+ */
+function plus1_form_alter(&$form, $form_state, $form_id) {
+  if (isset($form['type']) && isset($form['#node']) && $form['type']['#value'] .'_node_form' == $form_id) {
+    if (user_access('reset plus1 votes') && variable_get('plus1_enable_node_reset', 0)) {
+      $form['buttons']['reset_votes'] = array(
+        '#type' => 'submit',
+        '#value' => t('Reset votes'),
+        '#submit' => array('plus1_node_form_reset_submit'),
+        '#weight' => 20,
+      );
+    }
+  }
+}
+
+/**
+ * Submit function for the Reset votes button on the node edit form.
+ */
+function plus1_node_form_reset_submit($form, &$form_state) {
+  $destination = '';
+  if (isset($_REQUEST['destination'])) {
+    $destination = drupal_get_destination();
+    unset($_REQUEST['destination']);
+  }
+  $node = $form['#node'];
+  $form_state['redirect'] = array('node/' . $node->nid . '/reset-votes', $destination);
+}
+
+/**
+ * Confirmation form for resetting a node's votes.
+ */
+function plus1_node_reset_confirm(&$form_state, $node) {
+  $form['nid'] = array(
+    '#type' => 'value',
+    '#value' => $node->nid,
+  );
+
+  return confirm_form($form,
+    t('Are you sure you want to reset the votes for %title?', array('%title' => $node->title)),
+    isset($_GET['destination']) ? $_GET['destination'] : 'node/' . $node->nid,
+    t('This action cannot be undone.'),
+    t('Reset votes'),
+    t('Cancel')
+  );
+}
+
+/**
+ * Submit handler for the reset votes confirmation form.
+ */
+function plus1_node_reset_confirm_submit($form, &$form_state) {
+  if ($form_state['values']['confirm']) {
+    plus1_delete_node_votes($form_state['values']['nid']);
+  }
+
+  $form_state['redirect'] = 'node/' . $form_state['values']['nid'];
+}
+
+/**
+ * Deletes all the votes for a given node
+ *
+ * @param $nid
+ *   The node id to delete the votes for.
+ */
+function plus1_delete_node_votes($nid) {
+  if ($nid) {
+    $criteria['content_id'] = $nid;
+    $votes = votingapi_select_votes($criteria);
+    votingapi_delete_votes($votes);
+    votingapi_recalculate_results('node', $nid);
+  }
+}
+
 /**
 * Implementation of hook_theme().
 */
