diff --git a/includes/admin.settings.inc b/includes/admin.settings.inc
index 7b15f1a..2d07496 100644
--- a/includes/admin.settings.inc
+++ b/includes/admin.settings.inc
@@ -20,6 +20,14 @@ function signup_settings_form() {
       '#description' => t('The number of hours before the event which signups will no longer be allowed. Use negative numbers to close signups after the event start (example: -12).'),
     );
   };
+  // Set number of messages. (For multiple messages patch.)
+  $form['signup_message_number'] = array(
+    '#title' => t('Number of allowed messages'),
+    '#type' => 'textfield',
+      '#default_value' => variable_get('signup_message_number', 1),
+      '#size' => 5, '#maxlength' => 10,
+      '#description' => t('The number of allowed email messages, which will appear below (for filling defaults) and on the signup-enabled node edit form. Use 0 to disable this feature.'),
+  );
   $form['node_defaults'] = array(
     '#type' => 'fieldset',
     '#title' => t('Default signup information'),
@@ -188,19 +196,69 @@ function signup_settings_form() {
  * @param $form_values The constructed form values array of the submitted form.
  */
 function signup_settings_form_submit($form, &$form_state) {
+  // Modifications to support multiple messages.
+  // See logic below for looping through the values for the columns with the
+  // word "message" in the column name.
+  // See table signup_scheduled_messages, with columns pulled from signup table.
   $op = isset($form_state['values']['op']) ? $form_state['values']['op'] : '';
   if ($op == t('Save configuration') && db_result(db_query('SELECT COUNT(*) FROM {signup} WHERE nid = 0'))) {
+
     $values = array(
       $form_state['values']['signup_forwarding_email'],
       $form_state['values']['signup_send_confirmation'],
       $form_state['values']['signup_confirmation_email'],
       $form_state['values']['signup_close_signup_limit'],
     );
-    $values[] = isset($form_state['values']['signup_send_reminder']) ? $form_state['values']['signup_send_reminder'] : 0;
-    $values[] = isset($form_state['values']['signup_reminder_days_before']) ? $form_state['values']['signup_reminder_days_before'] : 0;
-    $values[] = isset($form_state['values']['signup_reminder_email']) ? $form_state['values']['signup_reminder_email'] : '';
+
+    // Add number of messages from the configs above.
+    $message_number = variable_get('signup_message_number', 1);
     $values[] = 0;  // "nid" of the row in {signup} for the global settings.
-    db_query("UPDATE {signup} SET forwarding_email = '%s', send_confirmation = %d, confirmation_email = '%s', close_signup_limit = %d, send_reminder = %d, reminder_days_before = %d, reminder_email = '%s' WHERE nid = %d", $values);
+
+    db_query("UPDATE {signup} SET forwarding_email = '%s', send_confirmation = %d, confirmation_email = '%s', close_signup_limit = %d WHERE nid = %d", $values);
+
+    // Loop through X number of messages for the node, where X has been defined
+    // for the particular signup, within limit set in signup settings.
+    // Add number of messages from the configs above.
+    // Could fetch actual number of sets of message fields in the form,
+    // but using the max, as here, works fine, because the "isset" code below
+    // will make the unused slots look like non-activated messages. In other
+    // words, there might be some extra rows of data in the
+    // signup_scheduled_messages table, whereever there are signups with less
+    // than the maximum number of messages, but those rows will not trigger and
+    //outgoing e-mail or other actions.
+    $message_number = variable_get('signup_message_number', 1);
+
+    // Initialize variables for iterating through X messages for the current
+    // node (most likely an Event node).
+    $next_signup_send_message_value = 0;
+    $next_signup_message_days_before_value = 0;
+    $next_signup_message_email_value = '';
+    $next_signup_message_before_or_after = ''; // 'before' or 'after'.
+    $next_values[] = array();
+    // For multiple messages patch.
+    // Loop through X number of messages for the node, where X has been defined
+    // for the particular signup, within limit set in signup settings.
+    db_query("DELETE FROM {signup_scheduled_messages} WHERE nid = 0");
+    for ($r = 0; $r < $message_number; $r++) {
+      $this_index = $r+1;
+      $default_message_email = '';
+      $default_message_before_or_after = 'before';
+
+      $next_signup_send_message_value = isset($form_state['values']['signup_send_message'. $this_index]) ? $form_state['values']['signup_send_message'. $this_index] : 0 ;
+      $next_signup_message_days_before_value = isset($form_state['values']['signup_message_days_before'. $this_index]) ? $form_state['values']['signup_message_days_before'. $this_index] : 0 ;
+      $next_signup_message_email_value = isset($form_state['values']['signup_message_email'. $this_index]) ? $form_state['values']['signup_message_email'. $this_index] : $default_message_email ;
+
+      $next_signup_message_before_or_after = isset($form_state['values']['signup_message_before_or_after'. $this_index]) ? $form_state['values']['signup_message_before_or_after'. $this_index] : $default_message_before_or_after ;
+      if ($next_signup_message_before_or_after == 'after') {
+        $next_signup_message_days_before_value = (-$next_signup_message_days_before_value); // make the integer negative
+      }
+
+      $next_values[0] = $next_signup_send_message_value;
+      $next_values[1] = $next_signup_message_days_before_value;
+      $next_values[2] = $next_signup_message_email_value;
+      $next_values[3] = $node->nid;
+      db_query("INSERT INTO {signup_scheduled_messages} (send_message, message_days_before, message_email, nid) VALUES (%d, %d, '%s', %d)", $next_values);
+    }
   }
   else {
     module_load_include('install', 'signup', 'signup');
@@ -214,16 +272,16 @@ function signup_settings_form_submit($form, &$form_state) {
     'signup_forwarding_email',
     'signup_send_confirmation',
     'signup_confirmation_email',
-    'signup_send_reminder',
-    'signup_reminder_days_before',
-    'signup_reminder_email',
+    'signup_send_message',
+    'signup_message_days_before',
+    'signup_message_email',
     'signup_close_signup_limit',
   );
   foreach ($settings as $setting) {
     unset($form_state['values'][$setting]);
   }
   // Remove the hidden element from signup_node_settings_form(), too.
-  unset($form_state['values']['signup']);
+   unset($form_state['values']['signup']);
 
   // Since the advanced settings can mess with the menu, rebuild that.
   menu_rebuild();
diff --git a/includes/node_form.inc b/includes/node_form.inc
index a02601c..2d8c44e 100644
--- a/includes/node_form.inc
+++ b/includes/node_form.inc
@@ -40,6 +40,7 @@ function signup_save_node($node, $op) {
         // No break, fall through and remove from {signup} too.
       case 0: // Disabled, but leave {signup_log} alone
         db_query("DELETE FROM {signup} WHERE nid = %d", $node->nid);
+        db_query("DELETE FROM {signup_scheduled_messages} WHERE nid = %d", $node->nid);
         // We're done.
         return;
     }
@@ -64,9 +65,9 @@ function signup_save_node($node, $op) {
   }
 
   if ($needs_defaults) {
-    $values = db_fetch_array(db_query("SELECT forwarding_email, send_confirmation, confirmation_email, close_signup_limit, send_reminder, reminder_days_before, reminder_email FROM {signup} WHERE nid = 0"));
+    $values = db_fetch_array(db_query("SELECT forwarding_email, send_confirmation, confirmation_email, close_signup_limit FROM {signup} WHERE nid = 0"));
     $values[] = $node->nid;
-    db_query("INSERT INTO {signup} (forwarding_email, send_confirmation, confirmation_email, close_signup_limit, send_reminder, reminder_days_before, reminder_email, nid) VALUES ('%s', %d, '%s', %d, %d, %d, '%s', %d)", $values);
+    db_query("INSERT INTO {signup} (forwarding_email, send_confirmation, confirmation_email, close_signup_limit, nid) VALUES ('%s', %d, '%s', %d, %d)", $values);
   }
   db_query("UPDATE {signup} SET user_reg_form = %d WHERE nid = %d", $node->signup_user_reg, $node->nid);
   $node = node_load($node->nid);
@@ -75,12 +76,50 @@ function signup_save_node($node, $op) {
   if (module_exists('content')) {
     cache_clear_all('content:'. $node->nid .':'. $node->vid, content_cache_tablename());
   }
+
+  // Add number of messages from the configs above.
+  // Could fetch actual number of sets of message fields in the form, but using
+  // the max, as here, works fine, because the "isset" code below will make the
+  // unused slots look like non-activated messages. In other words, there might
+  // be some extra rows of data in the signup_scheduled_messages table,
+  // whereever there are signups with less than the maximum number of
+  // messages, but those rows will not trigger and outgoing e-mail or other
+  // actions.
+  $message_number = variable_get('signup_message_number', 1);
+
+  // Initialize variables for iterating through X messages for the current node (most likely and Event node).
+  $next_signup_send_message_value         = 0;
+  $next_signup_message_days_before_value  = 0;
+  $next_signup_message_email_value        = '';
+  $next_signup_message_before_or_after    = ''; // 'before' or 'after'
+  $next_values[]                          = array();
+
+  // Loop through X number of messages for the node, where X has been defined for the particular signup, within limit set in signup settings.
+  db_query("DELETE FROM {signup_scheduled_messages} WHERE nid = %d", $node->nid);
+  for ($r = 0; $r < $message_number; $r++) {
+    $this_index = $r+1;
+    $default_message_email = '';
+    $default_message_before_or_after = 'before';
+    $next_signup_send_message_value = isset($node->{'signup_send_message' . $this_index}) ? $node->{'signup_send_message' . $this_index} : 0;
+    $next_signup_message_days_before_value = isset($node->{'signup_message_days_before' . $this_index}) ? $node->{'signup_message_days_before' . $this_index} : 0;
+    $next_signup_message_email_value = isset($node->{'signup_message_email' . $this_index}) ? $node->{'signup_message_email' . $this_index} : $default_message_email ;
+    $next_signup_message_before_or_after = isset($node->{'signup_message_before_or_after' . $this_index}) ? $node->{'signup_message_before_or_after' . $this_index} : $default_message_before_or_after;
+    if ($next_signup_message_before_or_after == 'after') {
+        $next_signup_message_days_before_value = (-$next_signup_message_days_before_value); // make the integer negative
+    }
+
+    $next_values[0] = $next_signup_send_message_value;
+    $next_values[1] = $next_signup_message_days_before_value;
+    $next_values[2] = $next_signup_message_email_value;
+    $next_values[3] = $node->nid;
+    db_query("INSERT INTO {signup_scheduled_messages} (send_message, message_days_before, message_email, nid) VALUES (%d, %d, '%s', %d)", $next_values);
+  }
+
   if (_signup_node_completed($node) && !empty($node->signup_status)) {
     // If this is an time-based node, and it's already past the close in
     // advance time (e.g. someone just changed the node start time), and
     // signups are still open, close them now.
     signup_close_signup($node->nid);
-    drupal_set_message(t('%node_type start time is already past the signup close-in-advance time, signups now closed.', array('%node_type' => node_get_types('name', $node->type))));
   }
 }
 
diff --git a/includes/node_settings.inc b/includes/node_settings.inc
index d698db7..98fc3fa 100644
--- a/includes/node_settings.inc
+++ b/includes/node_settings.inc
@@ -18,7 +18,7 @@
  *   node type, even if $node is NULL.
  * @param $has_date
  *   Boolean flag indicating if this node (or site) has signup-aware
- *   date functionality, which is required for reminder emails to be in
+ *   date functionality, which is required for message emails to be in
  *   the form.
  * @param $include_buttons
  *   Boolean flag indicating if the form should include its own submit buttons.
@@ -37,14 +37,47 @@ function signup_node_settings_form($form_state, $node = NULL, $node_type = NULL,
 
   // Load the default admin form data for new nodes.
   if (!$node || !$node->signup) {
-    $result = db_fetch_object(db_query("SELECT * FROM {signup} WHERE nid = 0"));
+
+    // For multiple scheduled messages patch.: get values from JOIN with new table
+    $dbrows = db_query("SELECT * FROM {signup} su INNER JOIN {signup_scheduled_messages} sr ON su.nid=sr.nid WHERE su.nid = 0 ORDER BY message_days_before DESC");
+    $dbrowcount = 1;
+    while ($result = db_fetch_object($dbrows)) {
+      // These will be the same in each row, so this is OK
+      $node->signup_forwarding_email = $result->forwarding_email;
+      $node->signup_send_confirmation = $result->send_confirmation;
+      $node->signup_confirmation_email = $result->confirmation_email;
+      $node->signup_close_signup_limit = $result->close_signup_limit;
+
+      // For multiple scheduled messages.
+      $node->{'signup_send_message' . $dbrowcount} = $result->send_message;
+      $node->{'signup_message_days_before' . $dbrowcount} = $result->message_days_before;
+      $node->{'signup_message_email' . $dbrowcount} = $result->message_email;
+      ++$dbrowcount;
+    }
+
+  }
+
+  // For multiple scheduled messages: get values from JOIN with
+  // signup_scheduled_messages table
+  $nid = $node->nid;
+  if ($nid == null) {
+    $nid = 0;
+  }
+  // Cannot use $node->nid here.
+  $dbrows = db_query("SELECT * FROM {signup} su INNER JOIN {signup_scheduled_messages} sr ON su.nid=sr.nid WHERE su.nid = " . $nid . " ORDER BY message_days_before DESC ");
+  $dbrowcount = 1;
+  while ($result = db_fetch_object($dbrows)) {
+    // These will be the same in each row, so this is OK
     $node->signup_forwarding_email = $result->forwarding_email;
     $node->signup_send_confirmation = $result->send_confirmation;
     $node->signup_confirmation_email = $result->confirmation_email;
-    $node->signup_send_reminder = $result->send_reminder;
-    $node->signup_reminder_days_before = $result->reminder_days_before;
-    $node->signup_reminder_email = $result->reminder_email;
     $node->signup_close_signup_limit = $result->close_signup_limit;
+
+    // For multiple scheduled messages.
+    $node->{'signup_send_message' . $dbrowcount} = $result->send_message;
+    $node->{'signup_message_days_before' . $dbrowcount} = $result->message_days_before;
+    $node->{'signup_message_email' . $dbrowcount} = $result->message_email;
+    ++$dbrowcount;
   }
 
   $form['signup_forwarding_email'] = array(
@@ -72,35 +105,76 @@ function signup_node_settings_form($form_state, $node = NULL, $node_type = NULL,
   }
 
   if ($has_date) {
-    // Define a sub-tree to wrap the next 2 form elements together in an
-    // inline div for better display.
-    $form['signup_reminder'] = array(
-      '#prefix' => '<div class="container-inline">',
-      '#suffix' => '</div>',
-    );
-    $form['signup_reminder']['signup_send_reminder'] = array(
-      '#type' => 'checkbox',
-      '#title' => t('Send reminder'),
-      '#default_value' => $node->signup_send_reminder,
+    // Allow multiple. (For multiple scheduled messages.)
+    $message_number = variable_get('signup_message_number', 1);
+    $next_item_value = 0;
+    $next_r = 0;
+
+    $form['signup_message_wrap'] = array(
+      '#type' => 'fieldset',
+      '#title' => format_plural($message_number, 'Scheduled message', 'Scheduled messages (@count available)'),
+      '#description' => format_plural($message_number, '1 scheduled message available. This is the maximum number of allowed scheduled messages per signup, set by the site administrator', '@count scheduled messages available. This is the maximum number of allowed scheduled messages per signup, set by the site administrator'),
+      '#collapsible' => TRUE,
+      '#collapsed' => TRUE,
+      '#weight' => 0,
     );
-    $options = array();
-    for ($i = 1; $i <= 60; $i++) {
-      $options[$i] = $i;
-    }
-    $node_type_name = isset($node_type) ? node_get_types('name', $node_type) : '';
-    $form['signup_reminder']['signup_reminder_days_before'] = array(
+    for ($r = 0; $r < $message_number; $r++) {
+      $next_r = $r+1;
+
+      // Define a sub-tree to wrap the next 2 form elements together in an
+      // inline div for better display.
+      // Why use $r+1 at both levels of the array? (e.g. Why
+      // [... . $r+1][...  . $r+1] instead of just [... . $r+1][nextitem]?)
+      // Answer: Use $r+1 for creating items in tree, AND for creating unique
+      // IDs for the HTML output.
+      $form['signup_message_wrap']['signup_message'. ($r+1)] = array(
+        '#prefix' => '<div class="container-inline">',
+        '#suffix' => '</div>',
+      );
+      $next_item_value = $node->{'signup_send_message'. $next_r};
+      $form['signup_message_wrap']['signup_message'. ($r+1)]['signup_send_message'. ($r+1)] = array(
+        '#type' => 'checkbox',
+        '#title' => t('Send message'),
+        '#default_value' => $next_item_value,
+      );
+      $options = array();
+      for ($i = 1; $i <= 180; $i++) {
+        $options[$i] = $i;
+      }
+      $node_type_name = isset($node_type) ? node_get_types('name', $node_type) : '';
+
+      $next_item_value = $node->{'signup_message_days_before'. $next_r};
+      $form['signup_message_wrap']['signup_message'. ($r+1)]['signup_message_days_before'. ($r+1)] = array(
       '#type' => 'select',
-      '#default_value' => $node->signup_reminder_days_before,
+      '#default_value' => abs($next_item_value),
       '#options' => $options,
-      '#suffix' => !empty($node_type_name) ? t('day(s) before this %node_type', array('%node_type' => $node_type_name)) : t('day(s) before start time'),
-    );
-    $form['signup_reminder_email'] = array(
-      '#type' => 'textarea',
-      '#title' => t('Reminder email'),
-      '#default_value' => $node->signup_reminder_email,
-      '#cols' => 40, '#rows' => 6,
-      '#description' =>  !empty($node_type_name) ? t('Email sent to user as a reminder before the %node_type starts. !token_description', array('%node_type' => $node_type_name, '!token_description' => $signup_token_description)) : t('Email sent to user as a reminder before the start time. !token_description', array('!token_description' => $signup_token_description)),
-    );
+      '#suffix' => t('day(s)'),
+      );
+
+      // Add before or after option here (later use this to set 'days' to a positive or negative number).
+      $next_item_value = $node->{'signup_message_days_before'. $next_r};
+      if ($next_item_value < 0) {
+        $next_item_value = 'after';
+      }
+      else {
+        $next_item_value = 'before';
+      }
+      $form['signup_message_wrap']['signup_message'. ($r+1)]['signup_message_before_or_after'. ($r+1)] = array(
+        '#type' => 'radios',
+        '#default_value' => $next_item_value,
+        '#options' => array('before' => 'before', 'after' => 'after'),
+        '#suffix' => !empty($node_type_name) ? t('this %node_type', array('%node_type' => $node_type_name)) : t('start time'),
+      );
+
+      $next_item_value = $node->{'signup_message_email'. $next_r};
+      $form['signup_message_wrap']['signup_message_email'. ($r+1)] = array(
+        '#type' => 'textarea',
+        '#title' => t('Scheduled email message'),
+        '#default_value' => $next_item_value,
+        '#cols' => 40, '#rows' => 6,
+        '#description' =>  !empty($node_type_name) ? t('Email sent to user as a message before the %node_type starts. !token_description', array('%node_type' => $node_type_name, '!token_description' => $signup_token_description)) : t('Email sent to user as a message before the start time. !token_description', array('!token_description' => $signup_token_description)),
+      );
+    }
     if (module_exists('token')) {
       module_load_include('inc', 'signup', 'includes/token_help');
       _signup_token_help($form, 'signup_reminder_token_fieldset');
diff --git a/signup.install b/signup.install
index a7070fa..c7eff03 100644
--- a/signup.install
+++ b/signup.install
@@ -34,25 +34,6 @@ function signup_schema() {
         'size' => 'big',
         'not null' => TRUE,
       ),
-      'send_reminder' => array(
-        'description' => t('Boolean indicating whether reminder emails should be sent. This is set to 0 once the reminders are sent.'),
-        'type' => 'int',
-        'not null' => TRUE,
-        'default' => 0,
-      ),
-      'reminder_days_before' => array(
-        'description' => t('Number of days before the start of a time-based node when the reminder emails should be sent.'),
-        'type' => 'int',
-        'unsigned' => TRUE,
-        'not null' => TRUE,
-        'default' => 0,
-      ),
-      'reminder_email' => array(
-        'description' => t('Email template to send to users to remind them about a signup.'),
-        'type' => 'text',
-        'size' => 'big',
-        'not null' => TRUE,
-      ),
       'close_in_advance_time' => array(
         'description' => t('Number of hours before the start of a time-based node when signups should automatically be closed. This column is not currently used and the behavior is controlled by a site-wide setting.  See http://drupal.org/node/290249 for more information.'),
         'type' => 'int',
@@ -146,6 +127,40 @@ function signup_schema() {
     ),
   );
 
+  $schema['signup_scheduled_messages'] = array(
+    'description' => t('Records information about multiple default and per-node scheduled messages.'),
+    'fields' => array(
+      'nid' => array(
+        'description' => t('Primary key: node ID. Relates to signup.nid, which relates to node.nid.'),
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'send_message' => array(
+        'description' => t('Boolean indicating whether scheduled messages should be sent. This is set to 0 once the messages are sent.'),
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'message_days_before' => array(
+        'description' => t('Number of days before the start of a time-based node when the scheduled messages should be sent.'),
+        'type' => 'int',
+       'not null' => TRUE,
+        'default' => 0,
+      ),
+      'message_email' => array(
+        'description' => t('Email template to send scheduled messages to users about a signup.'),
+        'type' => 'text',
+        'size' => 'big',
+        'not null' => TRUE,
+      ),
+    ),
+    'indexes' => array(
+      'nid' => array('nid'),
+    ),
+  );
+
   return $schema;
 }
 
@@ -180,17 +195,18 @@ function signup_uninstall() {
 
 /**
  * Helper method to insert the default signup information into the
- * {signup} table (stored in a row for nid 0).  These are the default
- * settings for new signup-enabled nodes.
+ * {signup} and {signup_scheduled_messages) tables (stored in a row for nid 0).
+ * These are the default settings for new signup-enabled nodes.
  */
 function signup_insert_default_signup_info() {
-  return db_query("INSERT INTO {signup} (nid, forwarding_email,
+  db_query("INSERT INTO {signup} (nid, forwarding_email,
     send_confirmation, confirmation_email,
-    send_reminder, reminder_days_before, reminder_email,
     close_in_advance_time, close_signup_limit, status, user_reg_form) VALUES (0, '',
     1, 'Enter your default confirmation email message here',
-    1, 1, 'Enter your default reminder email message here',
     0, 0, 1, 0)");
+  return db_query("INSERT INTO {signup_scheduled_messages} (nid,
+    send_message, message_days_before, message_email) VALUES (0,
+    1, 1, 'Enter your default scheduled email message here')");
 }
 
 function signup_update_3() {
@@ -453,7 +469,7 @@ function signup_update_6001() {
     'not null' => TRUE,
   );
   db_add_field($ret, 'signup_log', 'sid', $field, array('primary key' => array('sid')));
-  return $ret;	
+  return $ret;
 }
 
 /**
@@ -468,7 +484,7 @@ function signup_update_6002() {
     'size' => 'tiny',
   );
   db_add_field($ret, 'signup_log', 'attended', $field);
-  return $ret;	
+  return $ret;
 }
 
 /**
@@ -527,4 +543,121 @@ function signup_update_6005() {
   );
   db_add_field($ret, 'signup', 'user_reg_form', $field);
   return $ret;
-}
\ No newline at end of file
+}
+
+function signup_update_6006() {
+  $ret = array();
+
+  $schema['signup_scheduled_messages'] = array(
+    'description' => t('Records information about multiple default and per-node scheduled messages.'),
+    'fields' => array(
+      'nid' => array(
+        'description' => t('Primary key: node ID. Relates to signup.nid, which relates to node.nid.'),
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'send_message' => array(
+        'description' => t('Boolean indicating whether scheduled messages should be sent. This is set to 0 once the messages are sent.'),
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'message_days_before' => array(
+        'description' => t('Number of days before the start of a time-based node when the scheduled messages should be sent.'),
+        'type' => 'int',
+       'not null' => TRUE,
+        'default' => 0,
+      ),
+      'message_email' => array(
+        'description' => t('Email template to send scheduled messages to users about a signup.'),
+        'type' => 'text',
+        'size' => 'big',
+        'not null' => TRUE,
+      ),
+    ),
+    'indexes' => array(
+      'nid' => array('nid'),
+    ),
+  );
+
+  db_create_table($ret, 'signup_scheduled_messages', $schema);
+  db_drop_field($ret, 'signup', 'send_reminder');
+  db_drop_field($ret, 'signup', 'reminder_days_before');
+  db_drop_field($ret, 'signup', 'reminder_email');
+  return $ret;
+}
+
+function signup_update_6007() {
+  $ret = array();
+
+  // Multi-part update.
+  if (!isset($_SESSION['signup_update_6007'])) {
+    // We need to start at nid 0 for the site-wide defaults, so
+    // initialize our variable to the value below that.
+    $_SESSION['signup_update_6007'] = -1;
+    $_SESSION['signup_update_6007_max'] = db_result(db_query("SELECT MAX(nid) FROM {signup}"));
+  }
+
+  // Array of replacements mapping old names to the new names.
+  // NOTE: To avoid trouble with db_query() trying to interpret the
+  // '%', we escape all of them as '%%' to get % literals.
+  $replacements = array(
+    '%%eventurl' => '%%node_url',
+    '%%event' => '%%node_title',
+    '%%time' => '%%node_start_time',
+    '%%username' => '%%user_name',
+    '%%useremail' => '%%user_mail',
+    '%%info' => '%%user_signup_info',
+  );
+
+  // Build up a nested REPLACE() fragment to have the DB do all the string
+  // conversions for us in a single query, instead of pulling the records out
+  // of the DB, doing the string manipulation in PHP, and writing back the
+  // values in a bunch of separate queries.  According to the docs, REPLACE()
+  // works the same way on both MySQL and PgSQL.
+  $reminder_replace = 'reminder_email';
+  $confirmation_replace = 'confirmation_email';
+  foreach ($replacements as $from => $to) {
+    $reminder_replace = "REPLACE($reminder_replace, '$from', '$to')";
+    $confirmation_replace = "REPLACE($confirmation_replace, '$from', '$to')";
+  }
+
+  // Do the next batch of the deed.
+  // Find the next N records to update, or do the final batch.
+  $next = min($_SESSION['signup_update_6007'] + 2000, $_SESSION['signup_update_6007']);
+  // Perform the UPDATE in our specified range of nid values.
+  db_query("UPDATE {signup} SET confirmation_email = $confirmation_replace WHERE nid > %d AND nid <= %d", $_SESSION['signup_update_5204'], $next);
+  db_query("UPDATE {signup_scheduled_messages} SET message_email = $reminder_replace WHERE nid > %d AND nid <= %d", $_SESSION['signup_update_5204'], $next);
+  // Remember where we left off.
+  $_SESSION['signup_update_6007'] = $next;
+
+  if ($_SESSION['signup_update_6007'] == $_SESSION['signup_update_6007_max']) {
+    // We're done, clear these out.
+    unset($_SESSION['signup_update_6007']);
+    unset($_SESSION['signup_update_6007_max']);
+
+    // Provide a human-readable explaination of what we did.
+    $tokens = array(
+      '%event' => '%event',
+      '%eventurl' => '%eventurl',
+      '%time' => '%time',
+      '%username' => '%username',
+      '%useremail' => '%useremail',
+      '%info' => '%info',
+      '%node_title' => '%node_title',
+      '%node_url' => '%node_url',
+      '%node_start_time' => '%node_start_time',
+      '%user_name' => '%user_name',
+      '%user_mail' => '%user_mail',
+      '%user_signup_info' => '%user_signup_info',
+      );
+    $ret[] = array('success' => TRUE, 'query' => t('Replaced %event, %eventurl, %time, %username, %useremail, and %info tokens with %node_title, %node_url, %node_start_time, %user_name, %user_mail, and %user_signup_info in the reminder and confirmation email templates.', $tokens));
+  }
+  else {
+    // Report how much is left to complete.
+    $ret['#finished'] = $_SESSION['signup_update_6007'] / $_SESSION['signup_update_6007_max'];
+  }
+  return $ret;
+}
