diff --git a/notifications.info b/notifications.info
index d362130..c100416 100644
--- a/notifications.info
+++ b/notifications.info
@@ -4,5 +4,6 @@ description = The basic notifications framework
 package = "Notifications"
 dependencies[] = messaging
 dependencies[] = token
+dependencies[] = drupal_queue
 core = 6.x
 php = 5.0
diff --git a/notifications.module b/notifications.module
index 3affb99..7adcc70 100644
--- a/notifications.module
+++ b/notifications.module
@@ -428,28 +428,56 @@ function notifications_event($event) {
 function notifications_event_enabled($type, $action) {
   $info = variable_get('notifications_events', array());
   // Defaults to TRUE if not set
-  return (boolean)(!isset($info[$type][$action]) || $info[$type][$action]); 
+  return (boolean)(!isset($info[$type][$action]) || $info[$type][$action]);
+}
+
+/**
+ * Implements hook_cron_queue_info().
+ */
+function notifications_cron_queue_info() {
+  $queues['notifications_event'] = array(
+    'worker callback' => '_notifications_queue',
+    'time' => 60,
+  );
+  return $queues;
+}
+
+
+/**
+ * Queue notifications events for DrupalQueue.
+ */
+function notifications_queue($event) {
+  if (variable_get('notifications_queue_immediate', 1)) {
+    _notifications_queue($event);
+  }
+  else {
+    $queue = drupal_queue_get('notifications_event', TRUE);
+    // Log to watchdog should queue item creation fail.
+    if (!$queue->createItem($event)) {
+      watchdog('notifications', t('Failed to create queue item for notifications.'), WATCHDOG_ERROR);
+    }
+  }
 }
 
 /**
  * Queue events for notifications adding query conditions from plug-ins
- * 
+ *
  * This is an example of the resulting query
  *
  * INSERT INTO {notifications_queue} (uid, sid, module, eid, send_interval, send_method, cron, created, conditions)
- * SELECT DISTINCT s.uid, s.sid, s.module, 34, s.send_interval, s.send_method, s.cron, 1230578161, s.conditions FROM notifications s 
- * INNER JOIN notifications_fields f ON s.sid = f.sid 
- * WHERE s.status = 1 AND s.event_type = 'node' AND s.send_interval >= 0 
+ * SELECT DISTINCT s.uid, s.sid, s.module, 34, s.send_interval, s.send_method, s.cron, 1230578161, s.conditions FROM notifications s
+ * INNER JOIN notifications_fields f ON s.sid = f.sid
+ * WHERE s.status = 1 AND s.event_type = 'node' AND s.send_interval >= 0
  * AND ((f.field = 'nid' AND f.value = '2') OR (f.field = 'type' AND f.value = 'story') OR (f.field = 'author' AND f.value = '1'))
- * GROUP BY s.uid, s.sid, s.module, s.send_interval, s.send_method, s.cron, s.conditions 
+ * GROUP BY s.uid, s.sid, s.module, s.send_interval, s.send_method, s.cron, s.conditions
  * HAVING s.conditions = count(f.sid)
  *
  * @param $event
  *   Event array.
  */
-function notifications_queue($event) {
+function _notifications_queue($event) {
   $query = array();
-  // Build big insert query using the query builder. The fields for this event type will be added by the plug-ins. 
+  // Build big insert query using the query builder. The fields for this event type will be added by the plug-ins.
   // If no arguments retrieved, skip this step
   if ($query_args = notifications_module_information('query', 'event', $event->type, $event)) {
     $query['insert'] = array('uid', 'destination', 'sid', 'module', 'eid', 'send_interval', 'send_method', 'cron', 'created', 'conditions');
@@ -717,7 +745,17 @@ function notifications_save_subscription(&$subscription) {
     $op = 'update';
     $result = drupal_write_record('notifications', $subscription, 'sid');
   }
-  elseif ($duplicate = notifications_get_subscriptions(array('uid' => $subscription->uid, 'type' => $subscription->type, 'event_type' => $subscription->event_type, 'module' => $subscription->module, 'send_method' => $subscription->send_method, 'send_interval' => $subscription->send_interval), $subscription->fields, TRUE)) {
+  elseif ($duplicate = notifications_get_subscriptions(array('uid' => $subscription->uid, 'type' => $subscription->type, 'event_type' => $subscription->event_type, 'module' => $subscription->module, 'send_interval' => $subscription->send_interval), $subscription->fields, TRUE)) {
+    if (!is_array($subscription->send_method)) {
+      $duplicate = notifications_get_subscriptions(array('uid' => $subscription->uid, 'type' => $subscription->type, 'event_type' => $subscription->event_type, 'module' => $subscription->module, 'send_method' => $subscription->send_method, 'send_interval' => $subscription->send_interval), $subscription->fields, TRUE);
+      if( !$duplicate ) {
+        $result = drupal_write_record('notifications', $subscription);
+        if ($result != FALSE) {
+          _notifications_save_subscription_fields('insert', $subscription);
+        }
+        return $result;
+      }
+    }
     // We've found duplicates, resolve conflict updating first, deleting the rest
     // It is possible that we had a disabled one, this updating will fix it
     $update = array_shift($duplicate);
@@ -732,35 +770,50 @@ function notifications_save_subscription(&$subscription) {
     while (array_shift($duplicate)) {
       notifications_delete_subscription($duplicate->sid);
     }
-    return notifications_save_subscription($subscription);  
+    return notifications_save_subscription($subscription);
   }
   else {
-    $op = 'insert';    
-    $result = drupal_write_record('notifications', $subscription);
-  }
-  
-  // If the operation has worked so far, update fields and inform other modules
-  if ($result !== FALSE) {
-    if ($op == 'update') {
-      db_query("DELETE FROM {notifications_fields} WHERE sid = %d", $subscription->sid);
-    }    
-    // There may be subscriptions with no fields, some people are coding such plug-ins.
-    if (!empty($subscription->fields)) {
-      foreach ($subscription->fields as $name => $value) {
-        if (is_array($value)) {
-          db_query("INSERT INTO {notifications_fields} (sid, field, value, intval) VALUES(%d, '%s', '%s', %d)", $subscription->sid, $value['type'], $value['value'], (int)$value['value']);
-        }
-        else { 
-          db_query("INSERT INTO {notifications_fields} (sid, field, value, intval) VALUES(%d, '%s', '%s', %d)", $subscription->sid, $name, $value, (int)$value);
+    $op = 'insert';
+    if (is_array($subscription->send_method)) {
+      foreach (array_filter($subscription->send_method) as $send_method_key=>$send_method_value) {
+        $write_subscription = clone($subscription);
+        $write_subscription->send_method = $send_method_key;
+        // TODO: Should the last written result be the only value returned? Plural?
+        $result = drupal_write_record('notifications', $write_subscription);
+        if ($result != FALSE) {
+          _notifications_save_subscription_fields($op, $write_subscription);
         }
       }
+    } else {
+      $result = drupal_write_record('notifications', $subscription);
+      if ($result != FALSE) {
+        _notifications_save_subscription_fields($op, $subscription);
+      }
     }
-    notifications_module_invoke($op, $subscription);
   }
 
   return $result;
 }
 
+function _notifications_save_subscription_fields($op, &$subscription) {
+  // If the operation has worked so far, update fields and inform other modules
+  if ($op == 'update') {
+    db_query("DELETE FROM {notifications_fields} WHERE sid = %d", $subscription->sid);
+  }
+  // There may be subscriptions with no fields, some people are coding such plug-ins.
+  if (!empty($subscription->fields)) {
+    foreach ($subscription->fields as $name => $value) {
+      if (is_array($value)) {
+        db_query("INSERT INTO {notifications_fields} (sid, field, value, intval) VALUES(%d, '%s', '%s', %d)", $subscription->sid, $value['type'], $value['value'], (int)$value['value']);
+      }
+      else {
+        db_query("INSERT INTO {notifications_fields} (sid, field, value, intval) VALUES(%d, '%s', '%s', %d)", $subscription->sid, $name, $value, (int)$value);
+      }
+    }
+  }
+  notifications_module_invoke($op, $subscription);
+}
+
 /**
  * Get an individual subscription.
  *
diff --git a/notifications.pages.inc b/notifications.pages.inc
index 6fbf830..e69add9 100644
--- a/notifications.pages.inc
+++ b/notifications.pages.inc
@@ -27,23 +27,27 @@ function notifications_user_overview($form_state, $account) {
   $send_intervals = notifications_send_intervals();
   $send_methods = _notifications_send_methods($account);
   if ($method = notifications_user_setting('send_method', $account)) {
-    if (isset($send_methods[$method])) {      
-      $status['method'] = t('Your default sending method for new subscriptions is @send_method', array('@send_method' => $send_methods[$method]));
+    if (is_array($method)) {
+      $status['method'] = format_plural(count($method), 'Your default sending method for new subscriptions is @send_method', 'Your default sending methods for new subscriptions are @send_method', array('@send_method' => implode(", ", array_intersect_key($send_methods, array_filter($method)))));
+    } else {
+      if (isset($send_methods[$method])) {
+        $status['method'] = t('Your default sending method for new subscriptions is @send_method', array('@send_method' => $send_methods[$method]));
+      }
     }
   }
   $interval = notifications_user_setting('send_interval', $account);
-  if (isset($send_intervals[$interval])) {      
+  if (isset($send_intervals[$interval])) {
     $status['interval'] = t('Your default sending interval for new subscriptions is @send_interval', array('@send_interval' => $send_intervals[$interval]));
   }
-  
+
   $form['status'] = array('#type' => 'item', '#weight' => 10, '#title' => t('Current status'), '#value' => theme('item_list', $status));
-  
+
   // Build shortcut tips
   if (notifications_access_user($account, 'manage')) {
     $tips['admin'] = l(t('Administer your subscriptions'), "$path/notifications/subscriptions");
   }
   $tips['edit'] = l(t('Edit your notifications settings'), "$path/edit");
-  
+
   // Enable / disable all subscriptions
   if (notifications_access_user($account, 'maintain')) {
     if (!empty($status[NOTIFICATIONS_SUBSCRIPTION_ACTIVE])) {
