diff --git a/simplenews.module b/simplenews.module
index 506c2a0..a0d6841 100644
--- a/simplenews.module
+++ b/simplenews.module
@@ -1395,10 +1395,10 @@ function simplenews_subscribe_user($mail, $tid, $confirm = TRUE, $source = 'unkn
 
   // Get current subscriptions if any.
   $account = (object) array('mail' => $mail);
-  $subscription = simplenews_get_subscription($account);
+  $subscriber = simplenews_get_subscription($account);
 
   // If user is not subscribed to ANY newsletter, create a subscription account
-  if ($subscription->snid == 0) {
+  if ($subscriber->snid == 0) {
     // To subscribe a user:
     //   - Fetch the users uid.
     //   - Determine the user preferred language.
@@ -1431,7 +1431,7 @@ function simplenews_subscribe_user($mail, $tid, $confirm = TRUE, $source = 'unkn
       $preferred_language,
       1,
       time());
-    $subscription = simplenews_get_subscription($account);
+    $subscriber = simplenews_get_subscription($account);
   }
 
   if ($confirm) {
@@ -1442,44 +1442,38 @@ function simplenews_subscribe_user($mail, $tid, $confirm = TRUE, $source = 'unkn
     $params['from'] = _simplenews_set_from();
     $params['context']['newsletter'] = taxonomy_get_term($tid);
     $params['context']['account'] = $subscription;
-    drupal_mail('simplenews', 'subscribe', $mail, $subscription->language, $params, $params['from']['address']);
+    drupal_mail('simplenews', 'subscribe', $mail, $subscriber->language, $params, $params['from']['address']);
   }
-  elseif (!isset($subscription->tids[$tid])) {
+  elseif (!isset($subscriber->tids[$tid])) {
     // Add user to newsletter relationship if not already subscribed.
 
     // Check if user is (un)subscribed to this newsletter.
     // Resubscribe or add new subscription.
-    if (isset($subscription->newsletter_subscription[$tid])) {
-      db_query("
-        UPDATE {simplenews_snid_tid}
-        SET status = %d,
-          timestamp = %d,
-          source = '%s'
-        WHERE snid = %d
-          AND tid = %d",
-        SIMPLENEWS_SUBSCRIPTION_STATUS_SUBSCRIBED,
-        time(),
-        $source,
-        $subscription->snid,
-        $tid);
+    $subscription = new stdClass();
+    $subscription->status = SIMPLENEWS_SUBSCRIPTION_STATUS_SUBSCRIBED;
+    $subscription->timestamp = time();
+    $subscription->source = $source;
+    if (isset($subscriber->newsletter_subscription[$tid])) {
+      $update = array(
+        'snid' => $subscription->snid,
+        'tid'  => $tid,
+      );
     }
     else {
-      db_query("
-        INSERT INTO {simplenews_snid_tid}
-        (snid, tid, status, timestamp, source)
-        VALUES (%d, %d, %d, %d, '%s')",
-        $subscription->snid,
-        $tid,
-        SIMPLENEWS_SUBSCRIPTION_STATUS_SUBSCRIBED,
-        time(),
-        $source);
+      $update = array();
+      $subscription->snid = $subscriber->snid;
+      $subscription->tid = $tid;
     }
+    drupal_write_record('simplenews_snid_tid', $subscription, $update);
 
     // Execute simplenews subscribe trigger.
-    simplenews_call_actions('subscribe', $subscription);
+    simplenews_call_actions('subscribe', $subscriber);
+
+    // Give modules a chance to interact.
+    module_invoke_all('simplenews_subscribe_user', $subscriber, $subscription);
   }
-  module_invoke_all('simplenews_subscribe_user', $subscription);
-  return $subscription;
+
+  return $subscriber;
 }
 
 /**
@@ -1502,7 +1496,7 @@ function simplenews_subscribe_user($mail, $tid, $confirm = TRUE, $source = 'unkn
  */
 function simplenews_unsubscribe_user($mail, $tid, $confirm = TRUE, $source = 'unknown') {
   $account = (object) array('mail' => $mail);
-  $subscription = simplenews_get_subscription($account);
+  $subscriber = simplenews_get_subscription($account);
 
   // The unlikely case that a user is unsubscribed from a non existing newsletter is logged
   if (!$newsletter = taxonomy_get_term($tid)) {
@@ -1518,28 +1512,28 @@ function simplenews_unsubscribe_user($mail, $tid, $confirm = TRUE, $source = 'un
     // Confirmation mail is in the user preferred language.
     $params['from'] = _simplenews_set_from();
     $params['context']['newsletter'] = $newsletter;
-    $params['context']['account'] = $subscription;
-    drupal_mail('simplenews', 'unsubscribe', $mail, $subscription->language, $params, $params['from']['address']);
+    $params['context']['account'] = $subscriber;
+    drupal_mail('simplenews', 'unsubscribe', $mail, $subscriber->language, $params, $params['from']['address']);
   }
-  elseif (isset($subscription->tids[$tid])) {
+  elseif (isset($subscriber->tids[$tid])) {
     // Unsubscribe the user from the newsletter.
-    db_query("
-      UPDATE {simplenews_snid_tid}
-      SET status = %d,
-        timestamp = %d,
-        source = '%s'
-      WHERE snid = %d
-        AND tid = %d",
-      SIMPLENEWS_SUBSCRIPTION_STATUS_UNSUBSCRIBED,
-      time(),
-      $source,
-      $subscription->snid,
-      $tid);
+    $subscription = new stdClass();
+    $subscription->status = SIMPLENEWS_SUBSCRIPTION_STATUS_UNSUBSCRIBED;
+    $subscription>timestamp = time();
+    $subscription->source = $source;
+    $update = array(
+      'snid' => $subscriber->snid,
+      'tid' => $tid,
+    );
+    drupal_write_record('simplenews_snid_tid', $subscription, $update);
 
     // Execute simplenews unsubscribe trigger
-    simplenews_call_actions('unsubscribe', $subscription);
+    simplenews_call_actions('unsubscribe', $subscriber);
+
+    // Give modules a chance to interact.
+    module_invoke_all('simplenews_unsubscribe_user', $subscriber, $subscription);
   }
-  module_invoke_all('simplenews_unsubscribe_user', $subscription);
+
   return TRUE;
 }
 
