diff --git a/mailchimp.module b/mailchimp.module
index 7cb29a6..1ff19e9 100644
--- a/mailchimp.module
+++ b/mailchimp.module
@@ -442,6 +442,7 @@ function mailchimp_subscribe_process($list_id, $email, $merge_vars = NULL, $doub
 function mailchimp_addto_queue($function, $args) {
   $queue = DrupalQueue::get(MAILCHIMP_QUEUE_CRON);
   $queue->createQueue();
+  mailchimp_update_local_cache($function, $args);
   return $queue->createItem(array(
     'function' => $function,
     'args' => $args,
@@ -449,6 +450,89 @@ function mailchimp_addto_queue($function, $args) {
 }
 
 /**
+ * Updates the local cache for a user as though a queued request had been processed.
+ *
+ * If we don't do this, then users can make changes, but not have them shown on the site until
+ * cron runs, which is intensely confusing. See https://www.drupal.org/node/2503597
+ *
+ * @string $function
+ *   The name of the function that the queue runner will call when the update is processed.
+ * @array $args
+ *   The list of args that will be passed to the queue runner.
+ */
+function mailchimp_update_local_cache($function, $args) {
+  $list_id = isset($args['list_id']) ? $args['list_id'] : NULL;
+  $email   = isset($args['email']) ? $args['email'] : NULL;
+  if (empty($list_id) || empty($email)) {
+    return FALSE;
+  }
+  $cache = mailchimp_get_memberinfo($list_id, $email);
+  if (empty($cache)) {
+    // Create a new entry.
+    cache_set($list_id . '-' . $email, array('merges' => array()), 'cache_mailchimp', CACHE_TEMPORARY);
+    $cache = cache_get($list_id . '-' . $email, 'cache_mailchimp');
+    $cache = $cache->data;
+  }
+  // Handle unsubscribes.
+  if ($function == 'mailchimp_unsubscribe_process') {
+    $cache['status'] = 'unsubscribed';
+    $cache['merges']['GROUPINGS'] = array();
+  }
+  // Handle subscribes.
+  if ($function == 'mailchimp_subscribe_process') {
+    $cache['status'] = 'subscribed';
+  }
+  // Handle member updates.
+  if ($function == 'mailchimp_update_member_process' ||
+      $function == 'mailchimp_subscribe_process') {
+    // Update cached merge vars.
+    foreach ($args['merge_vars'] as $key => $value) {
+      // Groups are handled separately since the format needs re-written.
+      if ($key == 'GROUPINGS') {
+        continue;
+      }
+      $cache['merges'][$key] = $value;
+    }
+    // Update cached groupings.
+    mailchimp_update_local_cached_groupings($args, $cache);
+  }
+  // Store the data back in the local cache.
+  cache_set($list_id . '-' . $email, $cache, 'cache_mailchimp', CACHE_TEMPORARY);
+}
+
+/**
+ * Updates the locally cached interest group data.
+ *
+ * @array $args
+ *   The args that would be sent if this was a MailChimp API call.
+ * @array &$cache
+ *   The current cache information for the user.
+ */
+function mailchimp_update_local_cached_groupings($args, &$cache) {
+  $lists = cache_get('lists', 'cache_mailchimp');
+  $list_data = $lists->data[$args['list_id']];
+  foreach ($list_data['intgroups'] as $idx => $group_settings) {
+    $interests = array();
+    foreach ($group_settings['groups'] as $group) {
+      if (!empty($args['merge_vars']['GROUPINGS'][$idx]['groups'][$group['name']])) {
+        $interested = TRUE;
+      }
+      else {
+        $interested = FALSE;
+      }
+      $interests[] = array(
+        'name' => $group['name'],
+        'interested' => $interested,
+      );
+    }
+    if (empty($cache['merges']['GROUPINGS'][$idx])) {
+      $cache['merges']['GROUPINGS'][$idx] = $group_settings;
+    }
+    $cache['merges']['GROUPINGS'][$idx]['groups'] = $interests;
+  }
+}
+
+/**
  * Update a members list subscription in real time or by adding to the queue.
  *
  * @see Mailchimp_Lists::updateMember()
