--- E:/temp/simplenews_roles/simplenews_roles.module	Wed Dec 19 14:00:08 2012
+++ W:/sites/all/modules/simplenews_roles/simplenews_roles.module	Thu Dec 20 08:56:59 2012
@@ -289,6 +289,7 @@
  */
 function simplenews_roles_update_subscriptions($tid, $rids) {
   $rids_string = implode(', ', $rids);
+  $contains_authenticated_role = in_array(DRUPAL_AUTHENTICATED_RID, $rids);
 
  /*
   the rules are: 
@@ -341,29 +342,41 @@
    * step 1: 
    * remove users who are not in the role(s)
   */
-  $query_1 = "
-    SELECT sns.mail 
-    FROM 
-      {simplenews_snid_tid} snst 
-    JOIN 
-      {simplenews_subscriptions} sns
-      ON snst.snid = sns.snid
-    JOIN 
-      {users} u
-      ON sns.uid = u.uid 
-    LEFT JOIN /* LEFT JOIN because we want the NULLs */
-      {users_roles} ur 
-      ON 
-        u.uid = ur.uid 
-      AND 
-        ur.rid IN (%s) /* $rids_string */
-    WHERE 
-      snst.tid = %d   /* $tid */
-    AND    
-      ur.uid IS NULL
-    ";
-      
-  $mails_1 = db_query($query_1, $rids_string, $tid);
+  if ($contains_authenticated_role) {
+      // Special case
+    $query_1 = "
+      SELECT sns.mail 
+      FROM {simplenews_snid_tid} snst
+            INNER JOIN {simplenews_subscriptions} sns ON snst.snid = sns.snid
+            LEFT JOIN {users} u ON u.mail = sns.mail
+      WHERE u.mail IS NULL AND snst.tid = %d";
+      $mails_1 = db_query($query_1, $tid);
+  }
+  else {
+    $query_1 = "
+      SELECT sns.mail 
+      FROM 
+        {simplenews_snid_tid} snst 
+      JOIN 
+        {simplenews_subscriptions} sns
+        ON snst.snid = sns.snid
+      JOIN 
+        {users} u
+        ON sns.uid = u.uid 
+      LEFT JOIN /* LEFT JOIN because we want the NULLs */
+        {users_roles} ur 
+        ON 
+          u.uid = ur.uid 
+        AND 
+          ur.rid IN (%s) /* $rids_string */
+      WHERE 
+        snst.tid = %d   /* $tid */
+      AND    
+        ur.uid IS NULL
+      ";
+    $mails_1 = db_query($query_1, $rids_string, $tid);
+  }
+  
   while ($mail = db_result($mails_1)) {
     // Call SN API to unsub users.
     simplenews_unsubscribe_user($mail, $tid, FALSE, 'simplenews_roles');
@@ -376,35 +389,48 @@
    * In other words, if the source of their unsub is 'website', say
    * we don't touch it.
    */
-  $query_2 = "
-    SELECT u.mail
-    FROM
-      {users} u
-    JOIN
-      {users_roles} ur 
-      ON 
-        u.uid = ur.uid 
-      AND 
-        ur.rid IN (%s) /* $rids_string */
-    LEFT JOIN /* LEFT JOIN because we want the NULLs */
-    (
-      {simplenews_snid_tid} snst 
-    JOIN 
-      {simplenews_subscriptions} sns
-      ON 
-        snst.snid = sns.snid
-      AND
-        snst.tid = %d   /* $tid */
-    )
-    ON
-      u.uid = sns.uid
-    WHERE
-      sns.snid IS NULL /* those that don't exist at all for this tid or for SN as a whole */
-      OR
-      snst.source = 'simplenews_roles' /* those we unsubbed ourselves previously */
-  ";
+  if ($contains_authenticated_role) {
+      // Special case
+    $query_2 = "
+      SELECT u.mail 
+      FROM {users} u
+            LEFT JOIN {simplenews_subscriptions} sns ON sns.uid = u.uid
+            LEFT JOIN {simplenews_snid_tid} snst ON ( snst.snid = sns.snid AND snst.tid = %d)
+      WHERE u.status = 1 AND u.login > 0 AND u.access > 0 AND sns.mail IS NULL";
+      $mails_2 = db_query($query_2, $rids_string, $tid);
+  }
+  else {
+    $query_2 = "
+      SELECT u.mail
+      FROM
+        {users} u
+      JOIN
+        {users_roles} ur 
+        ON 
+          u.uid = ur.uid 
+        AND 
+          ur.rid IN (%s) /* $rids_string */
+      LEFT JOIN /* LEFT JOIN because we want the NULLs */
+      (
+        {simplenews_snid_tid} snst 
+      JOIN 
+        {simplenews_subscriptions} sns
+        ON 
+          snst.snid = sns.snid
+        AND
+          snst.tid = %d   /* $tid */
+      )
+      ON
+        u.uid = sns.uid
+      WHERE
+        sns.snid IS NULL /* those that don't exist at all for this tid or for SN as a whole */
+        OR
+        snst.source = 'simplenews_roles' /* those we unsubbed ourselves previously */
+    ";
+    $mails_2 = db_query($query_2, $rids_string, $tid);
+  }
 
-  $mails_2 = db_query($query_2, $rids_string, $tid);
+  
   while ($mail = db_result($mails_2)) {
     // Call SN API to sub users.
     simplenews_subscribe_user($mail, $tid, FALSE, 'simplenews_roles');
