diff --git a/css/recurly.css b/css/recurly.css
index f73c3ae..2f17291 100644
--- a/css/recurly.css
+++ b/css/recurly.css
@@ -116,6 +116,7 @@
 .recurly-plan-list .plan-hover {
   background-color: #FFFDF2;
   border-color: #ED5;
+  cursor: pointer;
 }
 .recurly-plan-list .plan-selected {
   background-color: #FFFCE5;
diff --git a/includes/recurly.admin.inc b/includes/recurly.admin.inc
index 8667293..0626552 100644
--- a/includes/recurly.admin.inc
+++ b/includes/recurly.admin.inc
@@ -77,6 +77,7 @@ function recurly_settings_form($form, &$form_state) {
     'recurly_bundle_' . $recurly_entity_type => variable_get('recurly_bundle_' . $recurly_entity_type),
     'recurly_pages' => variable_get('recurly_pages', '1'),
     'recurly_subscription_plans' => variable_get('recurly_subscription_plans', array()),
+    'recurly_subscription_max' => variable_get('recurly_subscription_max', '1'),
   );
 
   $form['sync'] = array(
@@ -196,6 +197,19 @@ function recurly_settings_form($form, &$form_state) {
     '#default_value' => variable_get('recurly_subscription_plans', array_keys($plan_options)),
     '#states' => $type_selected,
   );
+  $form['pages']['recurly_subscription_max'] = array(
+    '#title' => t('Multiple plans'),
+    '#type' => 'radios',
+    // Allows the number of plans to be some arbitrary amount in the future.
+    '#options' => array(
+      '1' => t('Single-plan mode'),
+      '0' => t('Multiple-plan mode'),
+    ),
+    '#description' => t('Single-plan mode allows users are only one subscription at a time, preventing them from having multiple plans active at the same time. If users are allowed to sign up for more than one subscription, use Multiple-plan mode.'),
+    '#access' => count($plan_options),
+    '#default_value' => variable_get('recurly_subscription_max', '1'),
+    '#states' => $type_selected,
+  );
   $form['pages']['recurly_subscription_change_timeframe'] = array(
     '#title' => t('Change plan behavior'),
     '#type' => 'radios',
diff --git a/includes/recurly.pages.inc b/includes/recurly.pages.inc
index 4fff834..683e256 100644
--- a/includes/recurly.pages.inc
+++ b/includes/recurly.pages.inc
@@ -67,37 +67,12 @@ function recurly_subscription_list_page($entity_type, $entity) {
     // Determine the state of this subscription.
     $states = recurly_subscription_get_states($subscription, $account);
 
-    // Generate the list of links for this subscription.
-    $url_context = array(
-      'entity_type' => $entity_type,
-      'entity' => $entity,
-      'subscription' => $subscription,
-      'account' => $account,
-    );
-    $subscription_links = array();
-    if ($subscription->state === 'active') {
-      $subscription_links['change'] = array(
-        'href' => recurly_url('change_plan', $url_context),
-        'external' => TRUE,
-        'title' => t('Change plan'),
-      );
-      $subscription_links['cancel'] = array(
-        'href' => recurly_url('cancel', $url_context),
-        'external' => TRUE,
-        'title' => t('Cancel'),
-        // Pass in the past_due flag to accurately calculate refunds.
-        'query' => in_array('past_due', $states) ? array('past_due' => '1') : NULL,
-      );
+    if (variable_get('recurly_subscription_max', '1') === '1') {
+      $links = FALSE;
     }
-    elseif ($subscription->state === 'canceled') {
-      $subscription_links['reactivate'] = array(
-        'href' => recurly_url('reactivate', $url_context),
-        'external' => TRUE,
-        'title' => t('Reactivate'),
-      );
+    else {
+      $links = recurly_subscription_links($entity_type, $entity, $subscription, $account, $states);
     }
-    // Allow other modules to provide links, perhaps "suspend" for example.
-    drupal_alter('recurly_subscription_links', $subscription_links);
 
     $plan = $subscription->plan;
     $add_ons = array();
@@ -134,7 +109,7 @@ function recurly_subscription_list_page($entity_type, $entity) {
       '#current_period_start' => recurly_format_date($subscription->current_period_started_at),
       '#current_period_ends_at' => recurly_format_date($subscription->current_period_ends_at),
       '#total' => recurly_format_currency($total, $subscription->currency),
-      '#subscription_links' => theme('links', array('links' => $subscription_links, 'attributes' => array('class' => array('inline', 'links')))),
+      '#subscription_links' => $links ? theme('links', array('links' => $links, 'attributes' => array('class' => array('inline', 'links')))) : NULL,
       '#message' => $message,
     );
   }
@@ -155,6 +130,46 @@ function recurly_subscription_list_page($entity_type, $entity) {
 }
 
 /**
+ * Build a list of links to manage a subscription.
+ */
+function recurly_subscription_links($entity_type, $entity, $subscription, $account, $states) {
+  // Generate the list of links for this subscription.
+  $url_context = array(
+    'entity_type' => $entity_type,
+    'entity' => $entity,
+    'subscription' => $subscription,
+    'account' => $account,
+  );
+
+  $links = array();
+  if ($subscription->state === 'active') {
+    $links['change'] = array(
+      'href' => recurly_url('change_plan', $url_context),
+      'external' => TRUE,
+      'title' => t('Change plan'),
+    );
+    $links['cancel'] = array(
+      'href' => recurly_url('cancel', $url_context),
+      'external' => TRUE,
+      'title' => t('Cancel'),
+      // Pass in the past_due flag to accurately calculate refunds.
+      'query' => in_array('past_due', $states) ? array('past_due' => '1') : NULL,
+    );
+  }
+  elseif ($subscription->state === 'canceled') {
+    $links['reactivate'] = array(
+      'href' => recurly_url('reactivate', $url_context),
+      'external' => TRUE,
+      'title' => t('Reactivate'),
+    );
+  }
+  // Allow other modules to provide links, perhaps "suspend" for example.
+  drupal_alter('recurly_subscription_links', $links);
+
+  return $links;
+}
+
+/**
  * Returns a message for a subscription if the subscription state is not active.
  */
 function recurly_subscription_state_message($state, $context) {
@@ -265,28 +280,46 @@ function recurly_subscription_plan_select($entity_type, $entity, $currency = NUL
 
   // If loading an existing subscription.
   if ($subscription_id) {
-    try {
-      $subscription = Recurly_Subscription::get($subscription_id);
+    if ($subscription_id === 'latest') {
+      list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
+      $local_account = recurly_account_load(array('entity_type' => $entity_type, 'entity_id' => $id), TRUE);
+      $subscriptions = recurly_account_get_subscriptions($local_account->account_code, 'active');
+      $subscription = reset($subscriptions);
+      $subscription_id = $subscription->uuid;
       $currency = $subscription->plan->currency;
       $mode = 'change';
     }
-    catch (Recurly_NotFoundError $e) {
-      drupal_set_message(t('Subscription not found'));
-      return MENU_NOT_FOUND;
+    else {
+      try {
+        $subscription = Recurly_Subscription::get($subscription_id);
+        $subscriptions[$subscription->uuid] = $subscription;
+        $currency = $subscription->plan->currency;
+        $mode = 'change';
+      }
+      catch (Recurly_NotFoundError $e) {
+        drupal_set_message(t('Subscription not found'));
+        return MENU_NOT_FOUND;
+      }
     }
   }
   // If signing up to a new subscription, ensure the user doesn't have a plan.
   else {
-    $subscription = NULL;
+    $subscriptions = array();
     $currency = isset($currency) ? $currency : variable_get('recurly_default_currency', 'USD');
     $mode = 'subscribe';
     list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
     $account = recurly_account_load(array('entity_type' => $entity_type, 'entity_id' => $id));
-    if ($account && recurly_account_has_active_subscriptions($account)) {
-      drupal_goto($entity_type . '/' . $id . '/subscription');
+    if ($account) {
+      $subscriptions = recurly_account_get_subscriptions($account->account_code, 'active');
     }
   }
 
+  // Make the list of subscriptions based on plan keys, rather than uuid.
+  $plan_subscriptions = array();
+  foreach ($subscriptions as $subscription) {
+    $plan_subscriptions[$subscription->plan->plan_code] = $subscription;
+  }
+
   $all_plans = recurly_subscription_plans();
   $enabled_plan_keys = variable_get('recurly_subscription_plans', array());
   $enabled_plans = array();
@@ -295,7 +328,7 @@ function recurly_subscription_plan_select($entity_type, $entity, $currency = NUL
       $enabled_plans[$plan->plan_code] = $plan;
     }
   }
-  return theme('recurly_subscription_plan_select', array('plans' => $enabled_plans, 'entity_type' => $entity_type, 'entity' => $entity, 'currency' => $currency, 'mode' => $mode, 'subscription' => $subscription));
+  return theme('recurly_subscription_plan_select', array('plans' => $enabled_plans, 'entity_type' => $entity_type, 'entity' => $entity, 'currency' => $currency, 'mode' => $mode, 'subscriptions' => $plan_subscriptions, 'subscription_id' => $subscription_id));
 }
 
 /**
@@ -306,11 +339,19 @@ function template_preprocess_recurly_subscription_plan_select(&$variables) {
   $currency = $variables['currency'];
   $entity_type = $variables['entity_type'];
   $entity = $variables['entity'];
-  $subscription = $variables['subscription'];
+  $subscriptions = $variables['subscriptions'];
+  $subscription_id = $variables['subscription_id'];
+
+  $current_subscription = NULL;
+  foreach ($subscriptions as $subscription) {
+    if ($subscription->uuid === $subscription_id) {
+      $current_subscription = $subscription;
+    }
+  }
 
   // If currency is undefined, use the subscription currency.
-  if (empty($currency) && $subscription) {
-    $currency = $subscription->currency;
+  if ($current_subscription && empty($currency)) {
+    $currency = $current_subscription->currency;
   }
 
   // Prepare an easy to loop-through list of subscriptions.
@@ -340,7 +381,7 @@ function template_preprocess_recurly_subscription_plan_select(&$variables) {
       'plan_interval' => recurly_format_price_interval($unit_amount, $plan->plan_interval_length, $plan->plan_interval_unit, TRUE),
       'trial_interval' => $plan->trial_interval_length ? recurly_format_price_interval(NULL, $plan->trial_interval_length, $plan->trial_interval_unit, TRUE) : NULL,
       'signup_url' => recurly_url('subscribe', array('entity_type' => $entity_type, 'entity' => $entity, 'plan_code' => $plan_code, 'currency' => $currency)),
-      'change_url' => $subscription ? recurly_url('change_plan', array('entity_type' => $entity_type, 'entity' => $entity, 'subscription' => $subscription, 'plan_code' => $plan_code)) : NULL,
+      'change_url' => $current_subscription ? recurly_url('change_plan', array('entity_type' => $entity_type, 'entity' => $entity, 'subscription' => $current_subscription, 'plan_code' => $plan_code)) : NULL,
     );
   }
 
@@ -349,7 +390,7 @@ function template_preprocess_recurly_subscription_plan_select(&$variables) {
   list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
   $account = recurly_account_load(array('entity_type' => $entity_type, 'entity_id' => $id));
   if ($account) {
-    $variables['expired_subscriptions'] = !recurly_account_has_active_subscriptions($account);
+    $variables['expired_subscriptions'] = empty($subscriptions);
   }
 }
 
@@ -478,12 +519,20 @@ function recurly_subscription_cancel_page($entity_type, $entity, $subscription_i
   }
 
   // Load the subscription.
-  try {
-    $subscription = Recurly_Subscription::get($subscription_id);
+  if ($subscription_id === 'latest') {
+    list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
+    $local_account = recurly_account_load(array('entity_type' => $entity_type, 'entity_id' => $id), TRUE);
+    $subscriptions = recurly_account_get_subscriptions($local_account->account_code, 'active');
+    $subscription = reset($subscriptions);
   }
-  catch (Recurly_NotFoundError $e) {
-    drupal_set_message(t('Subscription not found'));
-    return MENU_NOT_FOUND;
+  else {
+    try {
+      $subscription = Recurly_Subscription::get($subscription_id);
+    }
+    catch (Recurly_NotFoundError $e) {
+      drupal_set_message(t('Subscription not found'));
+      return MENU_NOT_FOUND;
+    }
   }
 
   return drupal_get_form('recurly_subscription_cancel_confirm', $entity_type, $entity, $subscription);
@@ -606,7 +655,7 @@ function recurly_subscription_cancel_confirm_submit($form, &$form_state) {
           break;
       }
       drupal_set_message(t('Plan @plan terminated!', array('@plan' => $subscription->plan->name)));
-      $form_state['redirect'] = $entity_type . '/' . $id;
+      $form_state['redirect'] = $entity_type . '/' . $id . '/subscription';
     }
     catch (Recurly_Error $e) {
       drupal_set_message(t('The plan could not be terminated because the billing service encountered an error: "@message"', array('@message' => $e->getMessage())), 'error');
@@ -635,12 +684,20 @@ function recurly_subscription_reactivate($entity_type, $entity, $subscription_id
   }
 
   // Load the subscription.
-  try {
-    $subscription = Recurly_Subscription::get($subscription_id);
+  if ($subscription_id === 'latest') {
+    list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
+    $local_account = recurly_account_load(array('entity_type' => $entity_type, 'entity_id' => $id), TRUE);
+    $subscriptions = recurly_account_get_subscriptions($local_account->account_code, 'active');
+    $subscription = reset($subscriptions);
   }
-  catch (Recurly_NotFoundError $e) {
-    drupal_set_message(t('Subscription not found'));
-    return MENU_NOT_FOUND;
+  else {
+    try {
+      $subscription = Recurly_Subscription::get($subscription_id);
+    }
+    catch (Recurly_NotFoundError $e) {
+      drupal_set_message(t('Subscription not found'));
+      return MENU_NOT_FOUND;
+    }
   }
 
   list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
diff --git a/modules/recurlyjs/includes/recurlyjs.pages.inc b/modules/recurlyjs/includes/recurlyjs.pages.inc
index 43a9176..d97ee58 100644
--- a/modules/recurlyjs/includes/recurlyjs.pages.inc
+++ b/modules/recurlyjs/includes/recurlyjs.pages.inc
@@ -48,6 +48,29 @@ function recurlyjs_subscribe_page($entity_type, $entity, $plan_code, $currency =
     return t('Could not initialize the Recurly client.');
   }
 
+  // Ensure the account does not already have this exact same plan. Recurly
+  // does not support a single account having multiple of the same plan.
+  list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
+  $local_account = recurly_account_load(array('entity_type' => $entity_type, 'entity_id' => $id), TRUE);
+  if ($local_account) {
+    $current_subscriptions = recurly_account_get_subscriptions($local_account->account_code, 'active');
+
+    // If the account is only allowed one subscription total, they shouldn't
+    // ever see this signup page.
+    if (variable_get('recurly_subscription_max', '1') === '1' && count($current_subscriptions) && empty($_POST)) {
+      $current_subscription = reset($current_subscriptions);
+      drupal_set_message(t('This account already has a @plan plan!', array('@plan' => $current_subscription->plan->name)));
+      drupal_goto($entity_type . '/' . $id . '/subscription');
+    }
+
+    // Otherwise check if they already have one of this same plan.
+    foreach ($current_subscriptions as $current_subscription) {
+      if ($current_subscription->plan->plan_code === $plan_code && empty($_POST)) {
+        drupal_set_message(t('This account already has a @plan plan!', array('@plan' => $current_subscription->plan->name)));
+        drupal_goto($entity_type . '/' . $id . '/subscription/signup');
+      }
+    }
+  }
   // Although this menu callback contains little else besides the subscription
   // form, it's a separate function because it's highly likely to need theming.
   $form = drupal_get_form('recurlyjs_subscribe_form', $entity_type, $entity, $plan_code, $currency);
@@ -123,7 +146,7 @@ function recurlyjs_subscribe_form_submit($form, &$form_state) {
 
   drupal_set_message(t('Account upgraded to @plan!', array('@plan' => $subscription->plan->name)));
   list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
-  $form_state['redirect'] = $entity_type . '/' . $id;
+  $form_state['redirect'] = $entity_type . '/' . $id . '/subscription';
 }
 
 /**
diff --git a/modules/recurlyjs/recurlyjs.module b/modules/recurlyjs/recurlyjs.module
index 6736701..040deaf 100644
--- a/modules/recurlyjs/recurlyjs.module
+++ b/modules/recurlyjs/recurlyjs.module
@@ -26,7 +26,7 @@ function recurlyjs_menu() {
       'access callback' => 'recurly_subscription_page_access',
       'access arguments' => array($entity_type, 1, 'update_billing'),
       'type' => MENU_LOCAL_TASK,
-      'weight' => 2,
+      'weight' => 4,
       'file' => 'includes/recurlyjs.pages.inc',
     );
 
@@ -37,7 +37,7 @@ function recurlyjs_menu() {
         'page callback' => 'recurlyjs_subscribe_page',
         'page arguments' => array($entity_type, 1, 4),
         'access callback' => 'recurly_subscription_page_access',
-        'access arguments' => array($entity_type, 1, 'subscribe'),
+        'access arguments' => array($entity_type, 1, 'signup'),
         'type' => MENU_CALLBACK,
         'file' => 'includes/recurlyjs.pages.inc',
       );
diff --git a/recurly.module b/recurly.module
index 5013446..232632a 100644
--- a/recurly.module
+++ b/recurly.module
@@ -82,7 +82,7 @@ function recurly_menu() {
       'file' => 'includes/recurly.pages.inc',
     );
     $items[$entity_path . '/subscription/list'] = array(
-      'title' => 'Summary',
+      'title' => variable_get('recurly_subscription_max', '1') === '1' ? 'Summary' : 'List',
       'page callback' => 'recurly_subscription_page',
       'page arguments' => array($entity_type, 1),
       'access callback' => 'recurly_subscription_page_access',
@@ -92,13 +92,43 @@ function recurly_menu() {
       'file' => 'includes/recurly.pages.inc',
     );
     $items[$entity_path . '/subscription/signup'] = array(
-      'title' => 'Signup',
+      'title' => variable_get('recurly_subscription_max', '1') === '1' ? 'Signup' : 'Add plan',
       'page callback' => 'recurly_subscription_plan_select',
       'page arguments' => array($entity_type, 1),
       'access callback' => 'recurly_subscription_page_access',
-      'access arguments' => array($entity_type, 1, 'subscribe'),
-      'type' => MENU_DEFAULT_LOCAL_TASK,
-      'weight' => 0,
+      'access arguments' => array($entity_type, 1, 'select_plan'),
+      'type' => variable_get('recurly_subscription_max', '1') === '1' ? MENU_DEFAULT_LOCAL_TASK : MENU_LOCAL_TASK,
+      'weight' => 1,
+      'file' => 'includes/recurly.pages.inc',
+    );
+    $items[$entity_path . '/subscription/change'] = array(
+      'title' => 'Change plan',
+      'page callback' => 'recurly_subscription_plan_select',
+      'page arguments' => array($entity_type, 1, NULL, 'latest'),
+      'access callback' => 'recurly_subscription_page_access',
+      'access arguments' => array($entity_type, 1, 'change_plan_latest'),
+      'type' => MENU_LOCAL_TASK,
+      'weight' => 5,
+      'file' => 'includes/recurly.pages.inc',
+    );
+    $items[$entity_path . '/subscription/cancel'] = array(
+      'title' => 'Cancel',
+      'page callback' => 'recurly_subscription_cancel_page',
+      'page arguments' => array($entity_type, 1, 'latest'),
+      'access callback' => 'recurly_subscription_page_access',
+      'access arguments' => array($entity_type, 1, 'cancel_latest'),
+      'type' => MENU_LOCAL_TASK,
+      'weight' => 10,
+      'file' => 'includes/recurly.pages.inc',
+    );
+    $items[$entity_path . '/subscription/reactivate'] = array(
+      'title' => 'Reactivate',
+      'page callback' => 'recurly_subscription_reactivate',
+      'page arguments' => array($entity_type, 1, 'latest'),
+      'access callback' => 'recurly_subscription_page_access',
+      'access arguments' => array($entity_type, 1, 'reactivate_latest'),
+      'type' => MENU_LOCAL_TASK,
+      'weight' => 10,
       'file' => 'includes/recurly.pages.inc',
     );
     $items[$entity_path . '/subscription/id/%'] = array(
@@ -106,7 +136,7 @@ function recurly_menu() {
       'page callback' => 'recurly_subscription_plan_select',
       'page arguments' => array($entity_type, 1, NULL, 4),
       'access callback' => 'recurly_subscription_page_access',
-      'access arguments' => array($entity_type, 1, 'change'),
+      'access arguments' => array($entity_type, 1, 'change_plan'),
       'type' => MENU_CALLBACK,
       'file' => 'includes/recurly.pages.inc',
     );
@@ -115,7 +145,7 @@ function recurly_menu() {
       'page callback' => 'recurly_subscription_plan_change_page',
       'page arguments' => array($entity_type, 1, 4, 6),
       'access callback' => 'recurly_subscription_page_access',
-      'access arguments' => array($entity_type, 1, 'change'),
+      'access arguments' => array($entity_type, 1, 'change_plan'),
       'type' => MENU_CALLBACK,
       'file' => 'includes/recurly.pages.inc',
     );
@@ -144,7 +174,7 @@ function recurly_menu() {
       'access callback' => 'recurly_subscription_page_access',
       'access arguments' => array($entity_type, 1, 'invoices'),
       'type' => MENU_LOCAL_TASK,
-      'weight' => 1,
+      'weight' => 2,
       'file' => 'includes/recurly.pages.inc',
     );
     $items[$entity_path . '/subscription/invoices/%'] = array(
@@ -244,7 +274,7 @@ function recurly_theme() {
     'file' => 'includes/recurly.pages.inc',
   );
   $items['recurly_subscription_plan_select'] = array(
-    'variables' => array('plans' => NULL, 'entity_type' => NULL, 'entity' => NULL, 'currency' => NULL, 'mode' => 'subscribe', 'subscription' => NULL),
+    'variables' => array('plans' => NULL, 'entity_type' => NULL, 'entity' => NULL, 'currency' => NULL, 'mode' => 'subscribe', 'subscriptions' => NULL, 'subscription_id' => NULL),
     'template' => 'templates/recurly-subscription-plan-select',
     'file' => 'includes/recurly.pages.inc',
   );
@@ -401,7 +431,7 @@ function recurly_process_push_notification($key, $subdomain = NULL) {
     }
 
     // If this is a new, canceled, or updated account set the database record.
-    if (in_array($notification->type, array('new_account_notification', 'canceled_account_notification', 'reactivated_account_notification', 'billing_info_updated_notification'))) {
+    if (in_array($notification->type, array('new_account_notification', 'new_subscription_notification', 'canceled_account_notification', 'reactivated_account_notification', 'billing_info_updated_notification'))) {
       // Retrieve the full account record from Recurly.
       try {
         $recurly_account = Recurly_Account::get($notification->account->account_code);
@@ -699,16 +729,46 @@ function recurly_account_delete($recurly_account, $cancelation_method = NULL) {
 
 /**
  * Check if an account has any active subscriptions.
+ *
+ * @return
+ *   Boolean TRUE if the user has an active subscription, or FALSE if no
+ *   active subscriptions are located.
  */
-function recurly_account_has_active_subscriptions($account) {
-  recurly_client_initialize();
-  $subscription_list = Recurly_SubscriptionList::getForAccount($account->account_code, array('per_page' => 200));
-  foreach ($subscription_list as $subscription) {
-    if ($subscription->state === 'active') {
-      return TRUE;
+function recurly_account_has_active_subscriptions($account_code) {
+  return count(recurly_account_get_subscriptions($account_code, 'active'));
+}
+
+/**
+ * Get a list of active subscriptions for a particular account code.
+ */
+function recurly_account_get_subscriptions($account_code, $state) {
+  static $accounts;
+
+  if (!isset($accounts[$account_code])) {
+    $accounts[$account_code] = array();
+
+    recurly_client_initialize();
+    $subscription_list = Recurly_SubscriptionList::getForAccount($account_code, array('per_page' => 200));
+    $accounts[$account_code] = array('active' => array(), 'expired' => array());
+    foreach ($subscription_list as $subscription) {
+      if ($subscription->state !== 'expired') {
+        $accounts[$account_code]['active'][$subscription->uuid] = $subscription;
+      }
+      else {
+        $accounts[$account_code]['expired'][$subscription->uuid] = $subscription;
+      }
     }
   }
-  return FALSE;
+
+  if ($state === 'active') {
+    return $accounts[$account_code]['active'];
+  }
+  elseif ($state === 'expired') {
+    return $accounts[$account_code]['expired'];
+  }
+
+  // Otherwise return all subscriptions.
+  return $accounts[$account_code] + $accounts[$account_code];
 }
 
 /**
@@ -729,23 +789,54 @@ function recurly_subscription_page_access($entity_type, $entity, $operation) {
   // because it does not make logical sense to show invoices/billing/etc. for
   // an object that does not have a subscription at all.
   list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
-  $account = recurly_account_load(array('entity_type' => $entity_type, 'entity_id' => $id));
+  $local_account = recurly_account_load(array('entity_type' => $entity_type, 'entity_id' => $id), TRUE);
   $subscription_plans = variable_get('recurly_subscription_plans', array());
   if ($operation === 'main') {
-    return ($account || $subscription_plans);
+    return ($local_account || $subscription_plans);
   }
-  elseif ($operation === 'subscribe') {
-    // This tab is only visible when visited directly.
-    return !empty($subscription_plans) && arg(3) === 'signup';
+  elseif ($operation === 'select_plan') {
+    // This tab is only visible when visited directly or if multiple plans are
+    // allowed.
+    return !empty($subscription_plans) && arg(3) === 'signup' || variable_get('recurly_subscription_max', '1') !== '1';
   }
   elseif ($operation === 'list') {
     // This is a hack to make it so that the list of subscriptions does not show
     // up as a sub-tab when showing the signup page.
-    return !empty($account) && arg(3) !== 'signup';
+    $access = !empty($local_account) && arg(3) !== 'signup';
+    if (variable_get('recurly_subscription_max', '1') !== '1') {
+      $access = $access || (!empty($local_account) && recurly_account_has_active_subscriptions($local_account->account_code));
+    }
+    return $access;
   }
-  else {
-    return !empty($account);
+  // These pages are only accessible if using the single-page mode. This
+  // requires loading the latest active account for an entity.
+  elseif (variable_get('recurly_subscription_max', '1') === '1') {
+    $active_subscriptions = $local_account ? recurly_account_get_subscriptions($local_account->account_code, 'active') : array();
+    $active_subscription = reset($active_subscriptions);
+    if ($operation === 'change_plan_latest') {
+      return !empty($local_account) && count($subscription_plans) && !empty($active_subscription);
+    }
+    elseif ($operation === 'cancel_latest') {
+      return !empty($local_account) && !empty($active_subscription) && $active_subscription->state == 'active';
+    }
+    elseif ($operation === 'reactivate_latest') {
+      return !empty($local_account) && !empty($active_subscription) && $active_subscription->state == 'canceled';
+    }
+    elseif ($operation === 'signup') {
+      // POST is included here to allow the signup form to finish processing, in
+      // the event that the push notification comes so fast it finishes before
+      // Drupal processes the form that contained a Recurly.js element.
+      return empty($local_account) || empty($active_subscriptions) || !empty($_POST);
+    }
+  }
+  elseif (in_array($operation, array('change_plan_latest', 'cancel_latest', 'reactivate_latest'))) {
+    return FALSE;
   }
+  elseif ($operation === 'signup' && variable_get('recurly_subscription_max', '1') !== '1') {
+    return TRUE;
+  }
+
+  return !empty($local_account);
 }
 
 /**
@@ -829,6 +920,8 @@ function recurly_hosted_url($path = '') {
  * $param $operation
  *   May be one of the following operations:
  *    - select_plan ($context contains account_code or entity_type/entity_id)
+ *    - change_plan
+ *    - cancel
  *    - update_billing ($context contains account_code)
  *    - subscribe ($context contains plan_code)
  *    - reactivate ($context contains account_code or entity_type/entity_id)
diff --git a/templates/recurly-subscription-plan-select.tpl.php b/templates/recurly-subscription-plan-select.tpl.php
index 3e089b5..207b1dc 100644
--- a/templates/recurly-subscription-plan-select.tpl.php
+++ b/templates/recurly-subscription-plan-select.tpl.php
@@ -13,7 +13,7 @@ drupal_add_js(drupal_get_path('module', 'recurly') . '/js/recurly.js');
 
   <div class="recurly-plan-list clearfix">
     <?php foreach ($filtered_plans as $plan): ?>
-      <div class="plan plan-<?php print $plan['plan_code']; ?><?php print ($mode == 'change' && $plan['plan_code'] === $subscription->plan->plan_code) ? ' plan-selected' : '' ?>">
+      <div class="plan plan-<?php print $plan['plan_code']; ?><?php print ($mode == 'change' && array_key_exists($plan['plan_code'], $subscriptions)) ? ' plan-selected' : '' ?>">
         <h2><?php print $plan['name']; ?></h2>
         <div class="plan-interval"><?php print $plan['plan_interval']; ?></div>
         <?php if ($plan['trial_interval']): ?>
@@ -22,13 +22,17 @@ drupal_add_js(drupal_get_path('module', 'recurly') . '/js/recurly.js');
         <div class="plan-signup">
           <?php if ($mode == 'subscribe'): ?>
             <?php if ($plan['signup_url']): ?>
-              <a class="plan-select" href="<?php print $plan['signup_url']; ?>"><?php print t('Sign up'); ?></a>
+              <?php if (array_key_exists($plan['plan_code'], $subscriptions)): ?>
+                <strong><?php print t('Selected'); ?></strong>
+              <?php else: ?>
+                <a class="plan-select" href="<?php print $plan['signup_url']; ?>"><?php print t('Sign up'); ?></a>
+              <?php endif; ?>
             <?php else: ?>
               <?php print t('Contact us to sign up'); ?>
             <?php endif; ?>
           <?php else: ?>
-            <?php if ($plan['plan_code'] === $subscription->plan->plan_code): ?>
-              <strong><?php print t('Current plan'); ?></strong>
+            <?php if (array_key_exists($plan['plan_code'], $subscriptions)): ?>
+              <strong><?php print t('Selected'); ?></strong>
             <?php else: ?>
               <a class="plan-select" href="<?php print $plan['change_url']; ?>"><?php print t('Select'); ?></a>
             <?php endif; ?>
diff --git a/templates/recurly-subscription-summary.tpl.php b/templates/recurly-subscription-summary.tpl.php
index 76d510c..c6653b5 100644
--- a/templates/recurly-subscription-summary.tpl.php
+++ b/templates/recurly-subscription-summary.tpl.php
@@ -48,7 +48,9 @@
       <div class="total"><?php print $total; ?></div>
     </div>
   </div>
+  <?php if ($subscription_links): ?>
   <div class="subscription-links clearfix">
     <?php print $subscription_links; ?>
   </div>
+  <?php endif; ?>
 </div>
