diff --git a/css/recurly-invoice.css b/css/recurly-invoice.css
index 48aed38..ebd33c4 100644
--- a/css/recurly-invoice.css
+++ b/css/recurly-invoice.css
@@ -11,6 +11,9 @@
   right: 0;
   top: -36px;
 }
+.invoice .messages {
+  margin: 8px 0;
+}
 .invoice-date {
   float: right;
 }
diff --git a/css/recurly.css b/css/recurly.css
index 3c7f974..9ba1448 100644
--- a/css/recurly.css
+++ b/css/recurly.css
@@ -1,7 +1,9 @@
 /**
  * @file
- * CSS for subscription information. Typically under user/x/subscription.
+ * CSS for subscription information.
  */
+
+/* Subscription list (user/x/subscription) */
 .subscription {
   border: 1px solid #CCC;
   border-radius: 10px;
@@ -10,6 +12,10 @@
 .subscription h2 {
   padding: 0;
   margin: 0;
+}
+.subscription .messages {
+  margin: 8px 0;
+  font-size: 90%;
 }
 .subscription table {
   width: auto;
@@ -82,4 +88,16 @@
   top: 100%;
   left: 0;
   background: red;
-}
\ No newline at end of file
+}
+.subscription .subscription-links {
+  text-align: right;
+}
+.subscription ul.links {
+  font-size: inherit;
+}
+
+/* Invoice list (user/x/subscription/invoices) */
+table.invoice-list tr.past_due,
+table.invoice-list tr.failed {
+  background-color: #EEB9B9;
+}
diff --git a/includes/recurly.pages.inc b/includes/recurly.pages.inc
index bab6619..c8c0714 100644
--- a/includes/recurly.pages.inc
+++ b/includes/recurly.pages.inc
@@ -31,9 +31,13 @@
   $page_subscriptions = recurly_pager_results($subscription_list, $per_page);
 
   $subscriptions['subscriptions']['#attached']['css'] = array(
-    drupal_get_path('module', 'recurly') . '/css/recurly-subscription.css',
+    drupal_get_path('module', 'recurly') . '/css/recurly.css',
   );
+
   foreach ($page_subscriptions as $subscription) {
+    // Determine the state of this subscription.
+    $states = recurly_subscription_get_states($subscription, $account);
+
     // Generate the list of links for this subscription.
     $subscription_links = array();
     $subscription_links['update'] = array(
@@ -70,11 +74,18 @@
       $total += $add_on->unit_amount_in_cents * $add_on->quantity;
     }
     $total += $subscription->unit_amount_in_cents * $subscription->quantity;
+
+    $message = '';
+    foreach ($states as $state) {
+      $message = recurly_subscription_state_message($state, $account);
+      break;
+    }
+
     $subscriptions['subscriptions'][$plan->plan_code] = array(
       '#theme' => 'recurly_subscription_summary',
       '#plan_code' => $plan->plan_code,
       '#plan_name' => check_plain($plan->name),
-      '#state' => $subscription->state,
+      '#state_array' => $states,
       '#cost' => recurly_format_currency($subscription->unit_amount_in_cents, $subscription->currency),
       '#quantity' => $subscription->quantity,
       '#add_ons' => $add_ons,
@@ -82,8 +93,8 @@
       '#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)),
-      '#message' => recurly_subscription_state_message($account),
+      '#subscription_links' => theme('links', array('links' => $subscription_links, 'attributes' => array('class' => array('inline', 'links')))),
+      '#message' => $message,
     );
   }
 
@@ -99,31 +110,76 @@
 /**
  * Returns a message for a subscription if the subscription state is not active.
  */
-function recurly_subscription_state_message($account) {
-  switch ($account->state) {
+function recurly_subscription_state_message($state, $account) {
+  switch ($state) {
     case 'active':
       return '';
     case 'closed':
-      return t('Your previous account is now closed. Please repurchase a subscription.');
+      return t('This account is closed.');
     case 'in_trial':
-      return t('You are currently in a trial period.');
+      return t('Currently in trial period.');
     case 'past_due':
       $url = recurly_url('update_billing', array('account' => $account));
       if ($url) {
-        return t('Your account is past due. Please <a href="!url">update your billing information</a>.', array('!url' => $url));
+        return t('This account is past due. Please <a href="!url">update your billing information</a>.', array('!url' => $url));
       }
       else {
-        return t('Your account is past due. Please contact an administrator to update your billing information.');
+        return t('This account is past due. Please contact an administrator to update your billing information.');
       }
     case 'canceled':
-      return t('Your previous subscription was canceled. You can reactivate your previous subscription to by clicking Reactivate.');
+      return t('This subscription is canceled and will not renew. You may reactivate the subscription to by clicking "Reactivate".');
     case 'expired':
-      return t('Your previous subscription has expired. Please purchase a new subscription.');
+      return t('This subscription has expired. Please purchase a new subscription.');
     case 'future':
-      return t('Your subscription has not started yet. Please contact support if you have any questions.');
+      return t('This subscription has not started yet. Please contact support if you have any questions.');
     default:
       return '';
   }
+}
+
+/**
+ * Get a list of all states in which a subscription exists currently.
+ *
+ * @param $subscription
+ *   A Recurly subscription object.
+ * @param $account
+ *   A Recurly account object.
+ */
+function recurly_subscription_get_states($subscription, $account) {
+  static $past_due = array();
+  $states = array();
+
+  // Determine if in a trial.
+  if ($subscription->trial_started_at && $subscription->trial_ends_at) {
+    $subscription->trial_started_at->setTimezone(new DateTimeZone('UTC'));
+    $subscription->trial_ends_at->setTimezone(new DateTimeZone('UTC'));
+    $start = $subscription->trial_started_at->format('U');
+    $end = $subscription->trial_ends_at->format('U');
+    if (REQUEST_TIME > $start && REQUEST_TIME < $end) {
+      $states[] = 'in_trial';
+    }
+  }
+
+  // Determine if non-renewing.
+  if (!empty($subscription->total_billing_cycles)) {
+    $states[] = 'non_renewing';
+  }
+
+  // Retrieve past due subscriptions.
+  if (!isset($past_due[$account->account_code])) {
+    $subscriptions = Recurly_SubscriptionList::getForAccount($account->account_code, array('state' => 'past_due'));
+    $past_due[$account->account_code] = array();
+    foreach ($subscriptions as $past_due_subscription) {
+      $past_due[$account->account_code][] = $past_due_subscription->uuid;
+    }
+  }
+
+  if (in_array($subscription->uuid, $past_due[$account->account_code])) {
+    $states[] = 'past_due';
+  }
+
+  $states[] = $subscription->state;
+  return $states;
 }
 
 /**
@@ -139,32 +195,49 @@
   list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
   $account = recurly_account_load(array('entity_type' => $entity_type, 'entity_id' => $id));
 
-  $per_page = 5;
+  $per_page = 20;
   $invoice_list = Recurly_InvoiceList::getForAccount($account->account_code, array('per_page' => $per_page));
-  $page_invoices = recurly_pager_results($invoice_list, $per_page);
+  $invoices = recurly_pager_results($invoice_list, $per_page);
+
+  return theme('recurly_invoice_list', array('invoices' => $invoices, 'entity_type' => $entity_type, 'entity' => $entity, 'per_page' => $per_page, 'total' => $invoice_list->count()));
+}
+
+/**
+ * Preprocess variables for the recurly-invoice-list.tpl.php file.
+ */
+function template_preprocess_recurly_invoice_list(&$variables) {
+  $invoices = $variables['invoices'];
+  $entity_type = $variables['entity_type'];
+  $entity = $variables['entity'];
+  list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
 
   $header = array(t('Number'), t('Date'), t('Total'));
   $rows = array();
-  foreach ($page_invoices as $invoice) {
+  foreach ($invoices as $invoice) {
+    $status = '';
+    if ($invoice->state === 'past_due') {
+      $status = ' (' . t('Past due') . ')';
+    }
+    elseif ($invoice->state === 'failed') {
+      $status = ' (' . t('Failed') . ')';
+    }
+
     $row = array();
-    $row[] = l($invoice->invoice_number, $entity_type . '/' . $id . '/subscription/invoices/' . $invoice->invoice_number);
+    $row[] = l($invoice->invoice_number . $status, $entity_type . '/' . $id . '/subscription/invoices/' . $invoice->invoice_number);
     $row[] = recurly_format_date($invoice->created_at);
     $row[] = recurly_format_currency($invoice->total_in_cents, $invoice->currency);
-    $rows[] = $row;
+    $rows[] = array(
+      'data' => $row,
+      'class' => array(check_plain($invoice->state)),
+    );
   }
 
-  $invoices['table']['#attached']['css'] = array(
-    drupal_get_path('module', 'recurly') . '/css/recurly-subscription.css',
+  $variables['table'] = array(
+    'header' => $header,
+    'rows' => $rows,
+    'attributes' => array('class' => array('invoice-list')),
+    'sticky' => FALSE,
   );
-  $invoices['table'] = array(
-    '#markup' => theme('table', array('header' => $header, 'rows' => $rows)),
-  );
-  $invoices['pager'] = array(
-    '#markup' => theme('pager'),
-    '#access' => $invoice_list->count() > $per_page,
-  );
-
-  return $invoices;
 }
 
 /**
diff --git a/modules/recurly_hosted/recurly_hosted.module b/modules/recurly_hosted/recurly_hosted.module
index 4f3f8c6..481094e 100644
--- a/modules/recurly_hosted/recurly_hosted.module
+++ b/modules/recurly_hosted/recurly_hosted.module
@@ -102,7 +102,7 @@
       $entity_type = $context['entity_type'];
       list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
       $account_code = $entity_type . '-' . $id;
-      $username = isset($entity->name) ? $entity->name : $entity->title;
+      $username = entity_label($entity_type, $entity);
       return recurly_hosted_subscription_plan_purchase_url($context['plan_code'], $account_code, $username);
   }
 }
diff --git a/modules/recurlyjs/includes/recurlyjs.pages.inc b/modules/recurlyjs/includes/recurlyjs.pages.inc
index d0606d5..336f579 100644
--- a/modules/recurlyjs/includes/recurlyjs.pages.inc
+++ b/modules/recurlyjs/includes/recurlyjs.pages.inc
@@ -23,7 +23,7 @@
       'full' => t('Full'),
     ),
     '#default_value' => variable_get('recurlyjs_address_requirement', 'none'),
-    '#description' => t('Choose the level of address information required. Collecting more address information reduces the probability of fraudulent accounts.'),
+    '#description' => t('Choose the level of address information required. Collecting more address information reduces the probability of fraudulent accounts. This setting should match the address requirements as configured on !link in "Site Settings".', array('!link' => variable_get('recurly_subdomain', '') ? l(t('your Recurly account'), recurly_hosted_url('configuration/edit')) : t('your Recurly account'))),
   );
   $form['recurlyjs']['recurlyjs_enable_add_ons'] = array(
     '#title' => t('Enable Add-ons'),
@@ -87,6 +87,7 @@
     '#plan_code' => $plan_code,
     '#currency' => in_array($currency, $currency_list) ? $currency : variable_get('recurly_default_currency', 'USD'),
     '#account_code' => $entity_type . '-' . $id,
+    '#username' => entity_label($entity_type, $entity),
     '#address_requirement' => variable_get('recurlyjs_address_requirement', 'none'),
     '#enable_coupons' => variable_get('recurlyjs_enable_coupons', 0),
     '#enable_add_ons' => variable_get('recurlyjs_enable_add_ons', 1),
diff --git a/modules/recurlyjs/recurly-element.js b/modules/recurlyjs/recurly-element.js
index de6990f..ee1bbb8 100644
--- a/modules/recurlyjs/recurly-element.js
+++ b/modules/recurlyjs/recurly-element.js
@@ -29,7 +29,7 @@
   });
 
   // Hide the total field if there isn't any reason to show it.
-  if ($form.find('.add_on, .coupon').length === 0 && $form.find('.vat .cost').html() === '') {
+  if ($form.find('.add_on, .coupon, .setup_fee').length === 0 && $form.find('.vat .cost').html() === '') {
     $form.find('.due_now').addClass('due_now_hidden');
   }
 };
diff --git a/recurly.module b/recurly.module
index e50f2a1..f215557 100644
--- a/recurly.module
+++ b/recurly.module
@@ -182,7 +182,7 @@
     'variables' => array(
       'plan_code' => NULL,
       'plan_name' => NULL,
-      'state' => NULL,
+      'state_array' => NULL,
       'cost' => NULL,
       'quantity' => NULL,
       'add_ons' => array(),
@@ -210,6 +210,11 @@
   $items['recurly_invoice'] = array(
     'variables' => array('invoice' => NULL, 'invoice_account' => NULL, 'entity_type' => NULL, 'entity' => NULL),
     'template' => 'templates/recurly-invoice',
+    'file' => 'includes/recurly.pages.inc',
+  );
+  $items['recurly_invoice_list'] = array(
+    'variables' => array('invoices' => NULL, 'entity_type' => NULL, 'entity' => NULL, 'per_page' => NULL, 'total' => NULL),
+    'template' => 'templates/recurly-invoice-list',
     'file' => 'includes/recurly.pages.inc',
   );
   $items['recurly_subscription_signup'] = array(
@@ -309,7 +314,7 @@
 
         // Attempt to find a matching user account by e-mail address if the
         // enabled entity type is user.
-        if ($entity_type === 'user' && ($user = user_load_by_mail($recurly_account->email))) {
+        elseif ($entity_type === 'user' && ($user = user_load_by_mail($recurly_account->email))) {
           recurly_account_save($recurly_account, 'user', $user->uid);
         }
       }
@@ -721,7 +726,7 @@
     case 'active':
       return t('Active');
     case 'canceled':
-      return t('Canceled');
+      return t('Canceled (will not renew)');
     case 'expired':
       return t('Expired');
     case 'future':
diff --git a/templates/recurly-invoice-list.tpl.php b/templates/recurly-invoice-list.tpl.php
new file mode 100644
index 0000000..29f058b
--- /dev/null
+++ b/templates/recurly-invoice-list.tpl.php
@@ -0,0 +1,14 @@
+<?php
+/**
+ * @file
+ * Output a list of invoices for a particular account. Typically displayed under
+ * user/x/subscription/invoices.
+ */
+drupal_add_css(drupal_get_path('module', 'recurly') . '/css/recurly.css');
+?>
+
+<?php print theme('table', $table); ?>
+
+<?php if ($total > $per_page): ?>
+  <?php print theme('pager'); ?>
+<?php endif; ?>
diff --git a/templates/recurly-invoice.tpl.php b/templates/recurly-invoice.tpl.php
index 13ede8a..ca4c4e5 100644
--- a/templates/recurly-invoice.tpl.php
+++ b/templates/recurly-invoice.tpl.php
@@ -5,10 +5,22 @@
  * user/x/subscriptions/invoice/[invoice-uuid]
  */
 drupal_add_css(drupal_get_path('module', 'recurly') . '/css/recurly-invoice.css');
+
+$url = recurly_url('update_billing', array('account' => $invoice_account));
+if ($url) {
+  $error_message = t('This invoice is past due! Please <a href="!url">update your billing information</a>.', array('!url' => $url));
+}
+else {
+  $error_message = t('This invoice is past due! Please contact an administrator to update your billing information.');
+}
 ?>
 <div class="invoice">
   <div class="invoice-pdf"><?php print l(t('View PDF'), $pdf_path); ?></div>
+  <?php if ($error_message): ?>
+    <div class="messages error"><?php print $error_message; ?></div>
+  <?php endif; ?>
   <div class="invoice-date"><?php print $invoice_date; ?></div>
+
   <?php if ($billing_info): ?>
   <div class="bill-to">
     <b><?php print $first_name; ?> <?php print $last_name; ?></b><br />
diff --git a/templates/recurly-subscription-summary.tpl.php b/templates/recurly-subscription-summary.tpl.php
index 108ad8d..8a815cd 100644
--- a/templates/recurly-subscription-summary.tpl.php
+++ b/templates/recurly-subscription-summary.tpl.php
@@ -5,7 +5,7 @@
  */
 ?>
 <div class="subscription mini clearfix">
-  <div class="subscription-summary clearfix">
+  <div class="subscription-summary clearfix <?php print implode(' ', $state_array); ?>">
     <h2><?php print $plan_name; ?></h2>
     <?php if (!empty($message)) : ?>
       <div class="messages warning"><h2 class="element-invisible"><?php print('Warning message'); ?></h2><?php print $message; ?></div>
@@ -13,14 +13,14 @@
     <table class="properties">
       <tr class="status">
         <th><?php print t('Status'); ?></th>
-        <td><?php print recurly_format_state($state); ?></td>
+        <td><?php print recurly_format_state(reset($state_array)); ?></td>
       </tr>
       <tr>
-        <th>Start Date</th>
+        <th><?php print t('Start Date'); ?></th>
         <td><?php print $start_date; ?></td>
       </tr>
       <tr>
-        <th>Next Invoice</th>
+        <th><?php print in_array('canceled', $state_array) || in_array('non_renewing', $state_array) && !in_array('in_trial', $state_array) ? t('Expiration Date') : t('Next Invoice'); ?></th>
         <td><?php print $current_period_ends_at; ?></td>
       </tr>
     </table>