diff --git a/role_expire.module b/role_expire.module
index 8a7089a..eff55ea 100644
--- a/role_expire.module
+++ b/role_expire.module
@@ -8,23 +8,44 @@
  * Enables user roles to expire on given time.
  */
 
+// Addresses: 649256,699608,924976,1230014 (for D6). TODO: Document.
+// TODO: Add updates to D7 version.
 
 /*******************************************************************************
  * API functions
  ******************************************************************************/
 
 /**
- * API function; Get expiration time of a user role.
+ * Get expiration time of a user role.
  * @param $uid
  *   User ID.
  * @param $rid
  *   Role ID.
  * @return
- *  Array with the expiration time.
+ *  The expiration time.
  */
 function role_expire_get_user_role_expiry_time($uid, $rid) {
+  $ans = '';
   $result = db_fetch_array(db_query("SELECT expiry_timestamp FROM {role_expire} WHERE uid=%d AND rid = %d", $uid, $rid));
-  return (!empty($result)) ? $result['expiry_timestamp'] : '';
+  if ($result===FALSE) {
+    // No value has been set yet. It's either because the user doesn't yet have
+    // this role, or because the user's role never expires.
+    // If the user doesn't already have this role, then use the default value, 
+    // converted to a time.
+    $user = user_load($uid);
+    if (!isset($user->roles[$rid])) {
+      $ans = strtotime(role_expire_get_default_duration($rid));
+    }
+    else {
+      // User already has role, but there was no entry in the role_expire table.
+      // Therefore, the role does not expire for this user.
+      $ans = '';
+    }
+  }
+  else {
+    $ans = $result['expiry_timestamp'];
+  }
+  return $ans;
 }
 
 /**
@@ -92,7 +113,7 @@ function role_expire_write_record($uid, $rid, $expiry_timestamp) {
 
 
 /**
- * API function; Get all the default duration for a role.
+ * API function; Get the default duration for a role.
  * @param $rid
  *   Required. The role_id to check.
  * @return
@@ -151,6 +172,21 @@ function role_expire_get_expired($time = '') {
  * Hook implementations
  ******************************************************************************/
 
+///**
+// * Implementation of hook_menu
+// */
+//function role_expire_menu() {
+//  $items['admin/user/role_expiration'] = array(
+//    'title' => 'Role expiration',
+//    'description' => 'List of users with roles that will expire.',
+//    'page callback' => 'drupal_goto',
+//    'page arguments' => array('admin/user/roles/role_expiration'),
+//    'access arguments' => array('access administration pages'),
+//  );
+//
+//  return $items;
+//}
+
 /**
  * Implementation of hook_views_api().
  */
@@ -195,14 +231,16 @@ function role_expire_form_user_profile_form_alter(&$form, $form_state) {
  */
 function role_expire_form_user_admin_role_alter(&$form, $form_state) {
   $form['role_expire'] = array(
-    '#title' => t("Default duration for the role %role",
-      array('%role' => drupal_ucfirst($form['name']['#default_value']))),
+    '#title' => t("Default expiration"),
     '#type' => 'textfield',
-    '#size' => 10,
+    '#size' => 16,
     '#default_value' => role_expire_get_default_duration($form['rid']['#value']),
     '#maxlength' => 32,
     '#attributes' => array('class' => 'role-expire-role-expiry'),
-    '#description' => t('Enter the time span you want to set as the default duration for this role. Examples: 12 hours, 1 day, 3 days, 4 weeks, 3 months, 1 year. Leave blank for no default duration. (If you speak php, this value may be any !l-compatible relative form.)',
+    '#description' => t('Enter the time span you want to set as the default <em>duration</em> for this role, or the <em>date</em> you want this role to expire on.<br/>
+Leave blank for "never expires".<br/>
+Example <em>durations</em>: 12 hours, tomorrow, 4 weeks, 1 year. Example <em>dates</em>: tomorrow, 2013-01-31, 8/31/15, 31.7.15<br/>
+(If you speak php, this value may be any future !l-compatible form.)',
                         array('!l' => l('strtotime',
                                         'http://php.net/manual/en/function.strtotime.php'
                                        )
@@ -229,20 +267,23 @@ function role_expire_user_admin_role_validate($form, &$form_state) {
   if (!empty($form_state['values']['role_expire'])) {
     // Capture the duration from the form
     $duration_string = check_plain($form_state['values']['role_expire']);
-    // Make sure it's a *relative* duration string. That is, it will result in a
-    // different strtotime with a different now value.
+
+    // Does strtotime work on this duration_string? If strtotime returns false,
+    // then the specified duration or date is illegible.
     $now = time();
     $timestamp = strtotime($duration_string,$now);
-    $timestamp2 = strtotime($duration_string,$now-100);
     if ($timestamp===FALSE || $timestamp < 0) {
-      form_set_error('role_expire', 'Role expiration default duration must be a strtotime-compatible string.');
+      form_set_error('role_expire',
+                     t('Default expiration must be a valid duration or date. See php documentation at !l.',
+                             array('!l' => l('strtotime',
+                              'http://php.net/manual/en/function.strtotime.php'
+                                            )
+                                  )
+                      )
+      );
     }
     elseif ($timestamp < $now) {
-      form_set_error('role_expire', 'Role expiration default duration must be a <strong>future</strong> strtotime-compatible string.');
-    }
-    elseif ($timestamp == $timestamp2) {
-      // This is an absolute (or special) timestamp. That's not allowed.
-      form_set_error('role_expire', 'Role expiration default duration must be a <strong>relative</strong> strtotime-compatible string.');
+      form_set_error('role_expire', 'Default expiration must be in the <strong>future</strong>.');
     }
   }
 }
@@ -253,7 +294,9 @@ function role_expire_user_admin_role_submit($form, &$form_state) {
   }
   else {
     role_expire_set_default_duration($form_state['values']['rid'], $form_state['values']['role_expire']);
-    drupal_set_message('Role expiration set.');
+    drupal_set_message(t('Default expiration set for %role.',
+                         array('%role' => $form['name']['#default_value']))
+                      );
   }
 }
 
@@ -277,9 +320,17 @@ function role_expire_user($op, &$edit, &$account, $category = NULL) {
           if (is_array($edit) && array_key_exists('role_expire_'. $role, $edit) && $edit['role_expire_'. $role] != '') {
             $expiry_time = strtotime($edit['role_expire_'. $role]);
             if (!$expiry_time) {
-              form_set_error('role_expire_'. $role, t("Role expiration date/time is not in correct format."));
+              form_set_error('role_expire_'. $role,
+                             t('Role expiration date/time must be a valid duration or date. See !l.',
+                               array('!l' => l('strtotime',
+                                               'http://php.net/manual/en/function.strtotime.php'
+                                              )
+                                    )
+                              )
+                             );
+
             }
-            if ($expiry_time <= $time) {
+            elseif ($expiry_time <= $time) {
               form_set_error('role_expire_'. $role, t("Role expiration date/time must be in the future."));
             }
           }
@@ -309,7 +360,10 @@ function role_expire_user($op, &$edit, &$account, $category = NULL) {
 
   case 'update':
   case 'insert':
-    if ($category == 'account' && (user_access('administer role expire') || user_access('administer users'))) {
+
+    global $user;
+    if ($category == 'account' && (user_access('administer role expire') || user_access('administer users')) || !$user->uid) {
+
       // Add roles expiry information for the user role.
       // We go over all existing roles, because user might have disabled a role.
       foreach (_role_expire_get_role() as $rid => $role) {
@@ -424,19 +478,34 @@ function role_expire_add_expiration_input(&$form, $account = NULL) {
     }
     $subform['roles']['#attributes'] = array('class' => 'role-expire-roles');
 
+    // TODO: If user has role-expire admin privileges, give them a link in the 
+    // description to edit the default values.
+    
     foreach (_role_expire_get_role() as $rid => $role) {
       if (is_object($account) and array_key_exists('uid', $account)) {
         $expiry_timestamp = role_expire_get_user_role_expiry_time($account->uid, $rid);
       }
       else {
-        $expiry_timestamp = '';
+        // Use the default expiry for this role?
+        $expiry_timestamp = strtotime(role_expire_get_default_duration($rid));
+      }
+
+      // Set the description. Add the ability to manage defaults if the user has
+      // admin role_expire privilege.
+      $description = ''
+        .'Enter date/time in format <em>yyyy-mm-dd hh:mm:ss</em> or use a time span like <em>12 hours</em>, <em>1 day</em>, <em>2 months</em>, or <em>3 years</em>.<br/>'
+        .'Leave blank for no expiration.<br/>'
+        ;
+      if (user_access('administer role expire')) {
+        $description .= 'You may also ' . l('manage default expiration',"admin/user/roles/edit/$rid").' for this role.';
       }
+      
       $form['role_expire_'. $rid] = array(
-        '#title' => t("%role role expiration date/time", array('%role' => drupal_ucfirst($role))),
+        '#title' => t("%role expiration date/time", array('%role' => drupal_ucfirst($role))),
         '#type' => 'textfield',
         '#default_value' => !empty($expiry_timestamp) ? date("Y-m-d H:i:s", $expiry_timestamp) : '',
         '#attributes' => array('class' => 'role-expire-role-expiry'),
-        '#description' => t("Leave blank for default date/time. Enter date and time in format <em>yyyy-mm-dd hh:mm:ss</em> or use a time span like <em>12 hours</em>, <em>1 day</em>, <em>2 months</em>, or <em>3 years</em>.")
+        '#description' => t($description),
       );
     }
   }
diff --git a/role_expire.views.inc b/role_expire.views.inc
index e04067b..edaa32f 100644
--- a/role_expire.views.inc
+++ b/role_expire.views.inc
@@ -19,10 +19,20 @@ function role_expire_views_data() {
       'left_field' => 'uid',
       'field' => 'uid',
     ),
+    // currently 'role' is not a base table, so this is useless
+    'role' => array(
+      'left_field' => 'rid',
+      'field' => 'rid',
+    ),
+    'node' => array(
+      'left_field' => 'uid',
+      'field' => 'uid',
+    ),
   );
-  $data['role_expire']['expiry_timestamp'] = array(
-    'title' => t('Role expiration time'),
-    'help' => t('Time and date the role will expire.'),
+  $data['role_expire']['exp_date'] = array(
+    'real field' => 'expiry_timestamp',
+    'title' => t('Role expiration date'),
+    'help' => t('Date of role expiration.'),
     'field' => array(
       'handler' => 'views_handler_field_date',
       'click sortable' => TRUE,
@@ -32,7 +42,94 @@ function role_expire_views_data() {
     ),
     'filter' => array(
       'handler' => 'views_handler_filter_date',
+      'allow empty' => TRUE,
+    ),
+    'argument' => array(
+      'handler' => 'views_handler_argument_date',
+    ),
+  );
+
+  $data['role_expire']['exp_rid'] = array(
+    'real field' => 'rid',
+    'title' => t('Role expiration role ID'),
+    'help' => t('Role ID of role expiration.'),
+    'field' => array(
+      'handler' => 'views_handler_field',
+      'click sortable' => TRUE,
+    ),
+    'sort' => array(
+      'handler' => 'views_handler_sort',
+    ),
+    'filter' => array(
+      'handler' => 'views_handler_filter_user_roles',
+      'allow empty' => TRUE,
+    ),
+    'argument' => array(
+      'handler' => 'views_handler_argument_users_roles_rid',
+    ),
+  );
+
+  // currently 'role' is not a base table, so this is redundant
+  $data['role_expire']['exp_uid'] = array(
+    'real field' => 'uid',
+    'help' => t('User ID of role expiration.'),
+    'relationship' => array(
+      'label' => t('User'),
+      'base' => 'users',
+      'base field' => 'uid',
+      'skip base' => 'users',
+    ),
+    'field' => array(
+      'handler' => 'views_handler_field_user',
+      'click sortable' => TRUE,
+      'skip base' => 'users',
+    ),
+    'sort' => array(
+      'handler' => 'views_handler_sort',
+      'skip base' => 'users',
+    ),
+    'filter' => array(
+      'handler' => 'views_handler_filter_numeric',
+      'skip base' => 'users',
+      'allow empty' => TRUE,
+    ),
+    'argument' => array(
+      'handler' => 'views_handler_argument_numeric',
+      'skip base' => 'users',
+    ),
+  );
+
+  // Special role table for linkage of role_expire's role ID to role name
+  $data['role_expire_role']['table']['group']  = t('User');
+
+  $data['role_expire_role']['table']['join'] = array(
+    'users' => array(
+      'table' => 'role',
+      'left_table' => 'role_expire',
+      'left_field' => 'rid',
+      'field' => 'rid',
     ),
   );
+
+  $data['role_expire_role']['exp_role_name'] = array(
+    'real field' => 'name',
+    'title' => t('Role expiration name'),
+    'help' => t('Role name of role expiration.'),
+    'field' => array(
+      'handler' => 'views_handler_field',
+      'click sortable' => TRUE,
+    ),
+    'sort' => array(
+      'handler' => 'views_handler_sort',
+    ),
+    'filter' => array(
+      'handler' => 'views_handler_filter_string',
+      'allow empty' => TRUE,
+    ),
+    'argument' => array(
+      'handler' => 'views_handler_argument_string',
+     ),
+   );
+
   return $data;
 }
\ No newline at end of file
