diff --git a/sites/all/modules/watcher/watcher.db.inc b/sites/all/modules/watcher/watcher.db.inc
index dd39622..999d891 100644
--- a/sites/all/modules/watcher/watcher.db.inc
+++ b/sites/all/modules/watcher/watcher.db.inc
@@ -176,12 +176,24 @@ function _watcher_db_get_user_nid($user, $nid) {
  */
 function _watcher_db_set_nid_user($nid, $user, $what = null) {
 
+  $timestamp = FALSE;
+
   if (!$user->uid) {
     // If the user is anonymous, we first remove any already existing rows and replace
     // them to allow the user to alter previously set watches
     $sql = "DELETE FROM {watcher_nodes} WHERE nid = %d AND uid = %d AND mail = '%s'";
     db_query($sql, $nid, $user->uid, $user->mail);
   }
+  else {
+    // This will be the date the user was last notified of an update to this node.
+    // It is initialised to just before their last visit to the node so that
+    // they will be notified on the first subsequent update or comment.
+    $timestamp = db_result(db_query("SELECT timestamp - 1 FROM {history} WHERE uid = %d AND nid = %d", $user->uid, $nid));
+  }
+
+  if (!$timestamp) {
+    $timestamp = (isset($_SERVER['REQUEST_TIME']) ? $_SERVER['REQUEST_TIME'] : time()) - 1;
+  }
 
   if ($what) {
     // Mapping integers to strings
@@ -190,11 +202,11 @@ function _watcher_db_set_nid_user($nid, $user, $what = null) {
     $for['updates'] = WATCHER_WATCH_FOR_UPDATES;
 
     $sql = "INSERT INTO {watcher_nodes} (uid, mail, nid, added, watch_for) VALUES(%d, '%s', %d, %d, %d)";
-    $res = db_query($sql, $user->uid, $user->mail, $nid, time(), $for[$what]);
+    $res = db_query($sql, $user->uid, $user->mail, $nid, $timestamp, $for[$what]);
   }
   else {
     $sql = "INSERT INTO {watcher_nodes} (uid, nid, added) VALUES(%d, %d, %d)";
-    $res = db_query($sql, $user->uid, $nid, time());
+    $res = db_query($sql, $user->uid, $nid, $timestamp);
   }
 
   return $res;
@@ -417,8 +429,22 @@ function _watcher_db_user_settings_uid_custom($uid) {
  *     An array of objects with uid as key representing users, with attributes uid, mail and name
  */
 function _watcher_db_get_users_notify_node_update($nid, $uid_exclude) {
-  $sql = "SELECT wn.uid, wn.mail wnmail, u.mail umail, u.name FROM {watcher_nodes} wn LEFT JOIN {watcher_user_settings} wus ON wus.uid = wn.uid LEFT JOIN {users} u ON u.uid = wus.uid WHERE nid = %d AND ((wn.uid <> 0 AND wn.uid <> %d AND notifications_updates = 1 AND send_email = 1 and u.status = 1) OR (wn.uid = 0 AND (watch_for = 1 OR watch_for = 3)))";
-  $res = db_query($sql, $nid, $uid_exclude);
+
+  // Default last notified timestamp to use if the user does not have a record
+  // in the history table. Drupal deletes history older than NODE_NEW_LIMIT so
+  // we use that rather than selecting the MIN value from the history table.
+  $timestamp = NODE_NEW_LIMIT;
+
+  $sql = "SELECT wn.uid, wn.mail wnmail, u.mail umail, u.name
+          FROM {watcher_nodes} wn
+          LEFT JOIN {watcher_user_settings} wus ON wus.uid = wn.uid
+          LEFT JOIN {users} u ON u.uid = wus.uid
+          LEFT JOIN {history} h ON h.nid = wn.nid AND h.uid = wn.uid
+          WHERE wn.nid = %d AND u.status = 1
+            AND wn.added < COALESCE(h.timestamp, %d)
+            AND ((wn.uid <> 0 AND wn.uid <> %d AND notifications_updates = 1 AND send_email = 1)
+             OR (wn.uid = 0 AND watch_for IN (1,3)))";
+  $res = db_query($sql, $nid, $timestamp, $uid_exclude);
   $users = array();
   while ($row = db_fetch_object($res)) {
     $users[$row->uid] = $row;
@@ -439,8 +465,23 @@ function _watcher_db_get_users_notify_node_update($nid, $uid_exclude) {
  *     An array of objects with uid as key representing users, with attributes uid, mail and name
  */
 function _watcher_db_get_users_notify_comment_insert($nid, $uid_exclude) {
-  $sql = 'SELECT wn.uid, wn.mail wnmail, u.mail umail, u.name FROM {watcher_nodes} wn LEFT JOIN {watcher_user_settings} wus ON wus.uid = wn.uid LEFT JOIN {users} u ON u.uid = wus.uid WHERE nid = %d AND ((wn.uid <> 0 AND wn.uid <> %d AND notifications_new_comments = 1 AND send_email = 1 and u.status = 1) OR (wn.uid = 0 AND (watch_for = 1 OR watch_for = 2)))';
-  $res = db_query($sql, $nid, $uid_exclude);
+
+  // Default last notified timestamp to use if the user does not have a record
+  // in the history table. Drupal deletes history older than NODE_NEW_LIMIT so
+  // we use that rather than selecting the MIN value from the history table.
+  $timestamp = NODE_NEW_LIMIT;
+
+  $sql = "SELECT wn.uid, wn.mail wnmail, u.mail umail, u.name
+          FROM {watcher_nodes} wn
+          LEFT JOIN {watcher_user_settings} wus ON wus.uid = wn.uid
+          LEFT JOIN {users} u ON u.uid = wus.uid
+          LEFT JOIN {history} h ON h.nid = wn.nid AND h.uid = wn.uid
+          WHERE wn.nid = %d AND u.status = 1
+            AND wn.added < COALESCE(h.timestamp, %d)
+            AND ((wn.uid <> 0 AND wn.uid <> %d AND notifications_new_comments = 1 AND send_email = 1)
+             OR (wn.uid = 0 AND watch_for IN (1,2)))";
+
+  $res = db_query($sql, $nid, $timestamp, $uid_exclude);
   $users = array();
   while ($row = db_fetch_object($res)) {
     $users[] = $row;
@@ -461,8 +502,22 @@ function _watcher_db_get_users_notify_comment_insert($nid, $uid_exclude) {
  *      An array of objects with uid as key representing users, with attributes uid, mail and name
  */
 function _watcher_db_get_users_notify_about_node($nid, $uid_exclude) {
-  $sql = 'SELECT wn.uid, wn.mail wnmail, u.mail umail, u.name FROM {watcher_nodes} wn LEFT JOIN {users} u ON u.uid = wn.uid WHERE nid = %d AND ((wn.uid <> 0 AND wn.uid <> %d AND send_email = 1 and u.status = 1) OR (NOT ISNULL(watch_for)))';
-  $res = db_query($sql, $nid, $uid_exclude);
+
+  // Default last notified timestamp to use if the user does not have a record
+  // in the history table. Drupal deletes history older than NODE_NEW_LIMIT so
+  // we use that rather than selecting the MIN value from the history table.
+  $timestamp = NODE_NEW_LIMIT;
+
+  $sql = "SELECT wn.uid, wn.mail wnmail, u.mail umail, u.name
+          FROM {watcher_nodes} wn
+          LEFT JOIN {users} u ON u.uid = wn.uid
+          LEFT JOIN {history} h ON h.nid = wn.nid AND h.uid = wn.uid
+          WHERE wn.nid = %d AND u.status = 1
+            AND wn.added < COALESCE(h.timestamp, %d)
+            AND ((wn.uid <> 0 AND wn.uid <> %d AND send_email = 1)
+             OR (NOT ISNULL(watch_for)))";
+
+  $res = db_query($sql, $nid, $timestamp, $uid_exclude);
   $users = array();
   while ($row = db_fetch_object($res)) {
     $users[$row->uid] = $row;
@@ -656,3 +711,15 @@ function _watcher_db_get_newest_comment() {
   }
   return false;
 }
+
+/**
+ * Updates the watcher_nodes table to mark the time a user was last notified
+ */
+function _watcher_db_update_notified_timestamps($users, $nid) {
+  $timestamp = (isset($_SERVER['REQUEST_TIME']) ? $_SERVER['REQUEST_TIME'] : time()) - 1;
+
+  foreach ($users as $user) {
+    $sql = "UPDATE {watcher_nodes} SET added = %d WHERE uid = %d AND nid = %d";
+    db_query($sql, $timestamp, $user->uid, $nid);
+  }
+}
\ No newline at end of file
diff --git a/sites/all/modules/watcher/watcher.module b/sites/all/modules/watcher/watcher.module
index 31ca5fe..2d9fe9f 100644
--- a/sites/all/modules/watcher/watcher.module
+++ b/sites/all/modules/watcher/watcher.module
@@ -1437,9 +1437,9 @@ function _watcher_binder($account) {
     );
   }
 
-  // time post was added to watched list
+  // time post was added to watched list, or user was last notified about it
   $header[] = array(
-    'data' => t('Post Added'),
+    'data' => t('Last Notified'),
     'field' => 'wn.added',
     'sort' => 'desc',
   );
@@ -1964,7 +1964,11 @@ function _watcher_email_notify_node_update(&$node) {
   $subject = t('Post!nodetitlehas been updated!sitename', array('!nodetitle' => $node_title, '!sitename' => $site_name));
 
   // Add to queue
-  _watcher_email_notify_node_update_add_to_queue($recipients, $subject, $node);
+  if (TRUE === _watcher_email_notify_node_update_add_to_queue($recipients, $subject, $node)) {
+
+    // Update timestamps so users are notified once until they revisit the node
+    _watcher_db_update_notified_timestamps($recipients, $node->nid);
+  }
 
   // Flag that there are messages in queue
   _watcher_static('messages to send', true);
@@ -2042,7 +2046,11 @@ function _watcher_email_notify_comment_insert(&$comment) {
   $subject = t('New comment posted!aboutnodetitle!sitename', array('!aboutnodetitle' => $node_title, '!sitename' => $site_name));
 
   // Add to queue
-  _watcher_email_notify_comment_insert_add_to_queue($recipients, $subject, $comment);
+  if (TRUE === _watcher_email_notify_comment_insert_add_to_queue($recipients, $subject, $comment)) {
+
+    // Update timestamps so users are notified once until they revisit the node
+    _watcher_db_update_notified_timestamps($recipients, $comment['nid']);
+  }
 
   // Flag that there are messages in queue
   _watcher_static('messages to send', true);
@@ -2120,7 +2128,11 @@ function _watcher_email_notify_anonymous_watch_confirm($user, $nid, $what = null
   $subject = t('You are now watching!aboutnodetitle!forwhat!sitename', array('!aboutnodetitle' => $node_title, '!forwhat' => $subj_for_what[$what], '!sitename' => $site_name));
 
   // Add to queue
-  _watcher_email_notify_anonymous_watch_confirm_add_to_queue($recipients, $subject, $node);
+  if (TRUE === _watcher_email_notify_anonymous_watch_confirm_add_to_queue($recipients, $subject, $node)) {
+
+    // Update timestamps so users are notified once until they revisit the node
+    _watcher_db_update_notified_timestamps($recipients, $node->nid);
+  }
 
   // Flag that there are messages in queue
   _watcher_static('messages to send', true);
