diff --git a/notify.install b/notify.install
index 69b57ed..ea57cb5 100644
--- a/notify.install
+++ b/notify.install
@@ -14,6 +14,7 @@
       'comment' => array('type' => 'int', 'size' => 'tiny', 'not null' => TRUE, 'default' => 0, 'disp-width' => '2'),
       'attempts' => array('type' => 'int', 'size' => 'tiny', 'not null' => TRUE, 'default' => 0, 'disp-width' => '4'),
       'teasers' => array('type' => 'int', 'size' => 'tiny', 'not null' => TRUE, 'default' => 0, 'disp-width' => '4'),
+    	'send_last' => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
       ),
     'primary key' => array('uid'),
   );
@@ -36,3 +37,15 @@
   cache_clear_all('variables', 'cache');
   unset($conf[$name]);
 }
+
+function notify_update_6001() {
+	  $ret = array();
+	  switch ($GLOBALS['db_type']) {
+		    case 'mysql':
+			    case 'mysqli':
+			      $ret[] = update_sql("ALTER TABLE {notify} ADD COLUMN send_last int NOT NULL DEFAULT 0;");
+			      break;
+			  }
+			
+			  return $ret;
+			}
diff --git a/notify.module b/notify.module
index f619373..7e0b419 100644
--- a/notify.module
+++ b/notify.module
@@ -118,17 +118,20 @@
  * Implementation of hook_cron().
  */
 function notify_cron() {
-  $send_last = variable_get('notify_send_last', 0);
+  // watchdog('notify', 'start of notify_cron');
+	$send_last = variable_get('notify_send_last', 0);
   $send_interval = variable_get('notify_send', 86400);
   $send_hour = variable_get('notify_send_hour', 9);
   $send_start = time();
   if ( ($send_start - $send_last > $send_interval)
     && (date('G', $send_start) >= $send_hour || $send_interval < 86400)
     && ($send_interval != -1) //special case of settings to send 'never'
-      ) {
-    _notify_send($send_start);
-    variable_set('notify_send_last', $send_start);
-  }
+      ) {    	 
+      	_notify_send($send_start);
+  }  
+  
+  // watchdog('notify', 'end of cron notify');
+  
 }
 
 /**
@@ -146,7 +149,7 @@
 
     case 'insert':
       if (isset($edit['notify_decision']) && $edit['notify_decision'] == 1) {
-        db_query('INSERT INTO {notify} (uid, status, node, teasers, comment) VALUES (%d, %d, %d, %d, %d)', $user->uid, 1, 1, 0, 0);
+        db_query('INSERT INTO {notify} (uid, status, node, teasers, comment, send_last) VALUES (%d, %d, %d, %d, %d, %d)', $user->uid, 1, 1, 0, 0, 0);
         $edit['notify_decision'] = NULL;
       }
       break;
@@ -273,7 +276,7 @@
     return;
   }
 
-  $result = db_query('SELECT u.uid, u.name, u.mail, n.status, n.node, n.teasers, n.comment FROM {users} u LEFT JOIN {notify} n ON u.uid = n.uid WHERE u.uid = %d AND u.status = 1', $account->uid);
+  $result = db_query('SELECT u.uid, u.name, u.mail, n.status, n.node, n.teasers, n.comment, n.send_last FROM {users} u LEFT JOIN {notify} n ON u.uid = n.uid WHERE u.uid = %d AND u.status = 1', $account->uid);
   $notify = db_fetch_object($result);
   $form = array();
   if (!$notify->mail) {
@@ -310,6 +313,11 @@
     '#options' => array(t('Disabled'), t('Enabled')),
     '#description' => t('Include new comments in the notification mail.'),
   );
+  $form['notify_send_last'] = array('#type' => 'markup',
+  		    '#title' => t('Notify last send'),
+  		    '#description' => t('The date of the last notification for this user.'),
+  		    '#value' => t('Last Send: !date', array('!date' => $notify->send_last > 0 ? date('n/j/y g:i a', $notify->send_last) : "never")),
+  );
   $form['uid'] = array('#type' => 'value', '#value' => $account->uid);
   $form['submit'] = array('#type' => 'submit', '#value' => t('Save settings'));
 
@@ -342,6 +350,7 @@
     $form['users'][$notify->uid]['teasers'] = array('#type' => 'select', '#default_value' => $notify->teasers, '#options' => array(t('Title only'), t('Title + Teaser'), t('Title + Body')));
     $form['users'][$notify->uid]['comment'] = array('#type' => 'checkbox', '#default_value' => $notify->comment);
     $form['users'][$notify->uid]['attempts'] = array('#type' => 'textfield', '#size' => 2,  '#default_value' => $notify->attempts ? intval($notify->attempts) : 0);
+    $form['users'][$notify->uid]['send_last'] = array('#type' => 'markup', '#value' => $notify->send_last > 0 ? date('n/j/y g:i a', $notify->send_last) : "never");
   }
 
   $form['flush'] = array(
@@ -391,7 +400,7 @@
  */
 function theme_notify_admin_users($form) {
   $output = drupal_render($form['info']);
-  $header = array(t('Username'), t('E-mail address'), t('Content'), t('Teasers'), t('Comment'), t('Failed attempts'));
+  $header = array(t('Username'), t('E-mail address'), t('Content'), t('Teasers'), t('Comment'), t('Failed attempts'), t('Last Send'));
 
   $rows = array();
   foreach (element_children($form['users']) as $uid) {
@@ -419,6 +428,8 @@
 function _notify_content($node, $notify) {
   static $i = 0;
 
+  // watchdog('notify', "_notify_content debut");
+  
   switch ($notify->teasers) {
     case 0:
       return;
@@ -429,7 +440,10 @@
       $txt = check_markup($node->body, $node->format, FALSE);
   }
 
-  return drupal_html_to_text($txt);
+  // watchdog('notify', "_notify_content about to finish");
+  
+  return strip_tags(html_entity_decode($txt,ENT_QUOTES|ENT_HTML401));
+  // return drupal_html_to_text($txt);
 }
 
 /**
@@ -446,7 +460,9 @@
   $num_sent = 0;
   $num_failed = 0;
 
-  _notify_switch_user(); // Store current user
+  // watchdog('notify', '_notify_send');
+  
+   _notify_switch_user(); // Store current user
 
   // Fetch all node type authorized by notify settings
   //Note that queries use 'nn' alias to avoid conflicts when query is rewritten by access control modules
@@ -489,12 +505,34 @@
   if (count($nodes) || count($comments)) {
 
     // Fetch users with notify enabled
-    $uresult = db_query('SELECT u.uid, u.name, u.mail, u.language, n.status, n.node, n.teasers, n.comment FROM {notify} n INNER JOIN {users} u ON n.uid = u.uid WHERE n.status = 1 AND u.status = 1 AND n.attempts <= %d', variable_get('notify_attempts', 5));
-
+    $uresult = db_query('SELECT u.uid, u.name, u.mail, u.language, n.status, n.node, n.teasers, n.comment, n.send_last FROM {notify} n INNER JOIN {users} u ON n.uid = u.uid WHERE n.status = 1 AND u.status = 1 AND n.attempts <= %d', variable_get('notify_attempts', 5));   
+    
+    // watchdog('notify',"for debugging - limit uresult to a specific uid, in my case uid 3");
+    // $uresult = db_query('SELECT u.uid, u.name, u.mail, u.language, n.status, n.node, n.teasers, n.comment, n.send_last FROM {notify} n INNER JOIN {users} u ON n.uid = u.uid WHERE n.status = 1 AND u.status = 1 AND n.attempts <= %d and u.uid = 3' , variable_get('notify_attempts', 5));
+    
     while ($user = db_fetch_object($uresult)) {
+    	    // check to see if the send_last for this user is > the global
+    	    // notify send_last setting. if so, this indicates cron was aborted
+    	    // for taking too long and that this user should be considered done.
+    	    // technically, we should look for new updates since then, but since
+    	    // cron isn't finishing in time, it's better to let it continue to the
+    	    // rest of the users.
+    	    $notify_send_last = variable_get('notify_send_last', 0);
+    	    if ( !empty($user->send_last) && $notify_send_last <= $user->send_last ) {
+    		      // enable this if you want lots of debug messages confirming it's
+    		      // doing the right thing
+    		      
+    		      watchdog('notify', 'Skipping user %name (%mail), was already done at !send_last and global notify is earlier (!notify_send_last)',
+    					array('%name'=> $user->name, '%mail' => $user->mail, '!send_last' => date('n/j/y g:i a', $user->send_last), '!notify_send_last' => date('n/j/y g:i a', $notify_send_last)), WATCHDOG_INFO);
+    		      
+    		      continue;
+    		    }
+    		
+    		 
       // Switch current user to this account to use node_access functions, etc.
       _notify_switch_user($user->uid);
-
+      // watchdog('notify', "_notify_switch_user($user->uid) done");
+      
       $node_body = '';
       $comment_body = '';
 
@@ -504,6 +542,7 @@
 
         $node_count = 0;
         foreach ($nodes as $node) {
+        	    	 
           // Skip to next if this user is NOT allowed to view this node.
           if (!node_access('view', $node)) {
             continue;
@@ -519,7 +558,7 @@
           elseif ($node->status == 0) {
             $status = t('Unpublished');
           }
-
+          
           if ($node_count > 0) {
             $node_body .= $mini_separator . "\n\n";
           }
@@ -528,8 +567,9 @@
           $node_body .= '[ ' . url('node/' . $node->nid, array(
             'absolute' => TRUE,
           )) . ' ]' . "\n\n";
-
+          
           $node_body .= _notify_content($node, $user) . "\n";
+                    
         }
 
         // Prepend node e-mail header as long as user could access at least one node.
@@ -537,9 +577,9 @@
           $node_body = $separator . "\n" . t('Recent content - !count', array(
             '!count' => format_plural(count($nodes), '1 new post', '@count new posts'),
           )) . "\n" . $separator . "\n\n" . $node_body;
-        }
+        }        
       }
-
+      
       // Write new comments to e-mail if user has permissions and there are
       // comments to be sent.
       if ($user->comment && user_access('access comments') && count($comments)) {
@@ -585,7 +625,7 @@
           )) . "\n" . $separator . "\n\n" . $comment_body;
         }
       }
-
+      
       $body = $node_body . $comment_body;
 
       // If there was anything new, send mail.
@@ -602,7 +642,8 @@
           $num_sent++;
           watchdog('notify', 'User %name (%mail) notified successfully.', array('%name' => $user->name, '%mail' => $user->mail), WATCHDOG_INFO);
         }
-      }
+        db_query('UPDATE {notify} SET send_last = UNIX_TIMESTAMP(NOW()) WHERE uid = %d', $user->uid);
+      }      
     }
   }
   // Restore user.
@@ -638,16 +679,18 @@
 function _notify_switch_user($uid = NULL) {
   global $user;
   static $orig_user = array();
-
+  
   if (isset($uid)) {
     // Should a user visit cron.php, or should this module be invoked via poormanscron and _notify_send() does not complete,
     // the visitor will end up logged in as the "switched to user" for subsequent requests unless we disable saving the session
     // until we are sure we're the invoking user again.
+  	// watchdog('notify', "uid set to $uid");
     session_save_session(FALSE);
     $user = user_load(array('uid' => $uid));
   }
   // Retrieve the initial user, can be called multiple times.
   elseif (count($orig_user)) {
+  	// watchdog('notify', "no uid set");
     $user = array_shift($orig_user);
     array_unshift($orig_user, $user);
     session_save_session(TRUE);
@@ -656,4 +699,4 @@
   else {
     $orig_user[] = $user;
   }
-}
+}
\ No newline at end of file