diff -uP uc_signup/uc_signup.install uc_signup/uc_signup.install
--- uc_signup/uc_signup.install	2009-07-03 10:23:47.000000000 -0400
+++ uc_signup/uc_signup.install	2009-08-21 14:33:49.000000000 -0400
@@ -27,6 +27,25 @@
       ),
     ),
   );
+	$schema['uc_signup_temp_storage'] = array(
+		'description' => t(''),
+		'fields' => array(
+			'uid' => array(
+				'description' => t('The user ID that has this temporary info.'),
+				'type' => 'int',
+				'size' => 'normal',
+				'not null' => TRUE,
+			),
+			'ser_data' => array(
+				'description' => t('The temporary session info that gets serialized into the database.'),
+				'type' => 'varchar',
+				'length' => 1024,
+				'not null' => TRUE,
+				'default' => '',
+			),
+		),
+		'primary key' => array('uid'),
+	);
   return $schema;
 }
 
diff -uP uc_signup/uc_signup.module uc_signup/uc_signup.module
--- uc_signup/uc_signup.module	2009-07-27 16:57:14.000000000 -0400
+++ uc_signup/uc_signup.module	2009-08-21 14:11:17.000000000 -0400
@@ -568,75 +614,109 @@
  * Implementation of hook_order().
  */
 function uc_signup_order($op, &$arg1, $arg2) {
-  switch ($op) {
-    case 'submit':
-      foreach ($arg1->products as $product) {
-        if (isset($product->data['uc_signup_enabled']) && $product->data['uc_signup_enabled'] == 1) {
-          $events_to_signup[] = $product;
-        }
-      }
-      if (!empty($events_to_signup)) {
-        uc_signup_cancel_temporary_signups($order);
-        foreach ($_SESSION['uc_signup']['nids'] as $nid => $attendees) {
-          foreach ($attendees as $key => $mail) {
-            $account = user_load(array('mail' => $mail));
-            if (empty($account->uid)) {
-              $new_account['mail'] = $mail;
-              $namenew = preg_replace('/@.*$/', '', $mail);
-              // From the email registration module:
-              if (db_result(db_query("SELECT count(*) FROM {users} WHERE LOWER(name) = LOWER('%s')", $namenew)) > 0) {
-                 // Find the next number available to append to the name
-                $sql = "SELECT SUBSTRING_INDEX(name,'_',-1) FROM {users} WHERE name REGEXP '%s' ORDER BY CAST(SUBSTRING_INDEX(name,'_',-1) AS UNSIGNED) DESC LIMIT 1";
-                $nameidx = db_result(db_query($sql, '^'. $namenew .'_[0-9]+$'));
-                $namenew .= '_'. ($nameidx + 1);
-              }
-              $new_account['name'] = $namenew;
-              $profile_form = array_values(module_invoke('profile', 'user', 'register', array(), (object)array()));
-              $profile_form = $profile_form[0];
-              foreach ($profile_form as $key => $value) {
-                if ($key[0] != '#') {
-                  $new_account[$key] = $_SESSION['uc_signup']['profile'][$key .'_'. $mail];
-                }
-              }
-              $account = user_save(NULL, $new_account);
-            }
-            $to_signup[$nid][] = $account->uid;
-          }
-        }
-        // First, create accounts for emails that don't have accounts.
-        $placeholders = '';
-        global $user;
-        // TODO: check if there are any signups to create.
-        //Make sure that there are enough spots before continuing. If there are not enough spots, the order should fail.
-
-        foreach ($to_signup as $nid => $value) {
-          $spots_remaining = uc_signup_spots_remaining(array('nid' => $nid)); 
-          if (count($to_signup[$nid]) > $spots_remaining) {
-            $insufficient_space[] = $nid;
-            $message .= _uc_signup_limit_reached_message($spots_remaining, array('nid' => $nid));
-          }
-          if (!empty($insufficient_space)) {
-            $message .= t("Events can fill up rapidly, and people may have signed up since you added these events to your cart. Please adjust the quantity before checking out.");
-            uc_signup_cancel_temporary_signups($order);
-            return array(array('pass' => FALSE, 'message' => t($message)));
-          }
-        }
-        unset($nid);
-        foreach ($to_signup as $nid => $uids) {
-          foreach ($uids as $key => $uid) {
-            $signup_form = array(
-              'nid' => $nid,
-              'uid' => $uid,
-            );
-            $sid = NULL;
-            $sid = signup_sign_up_user($signup_form, FALSE);
-            if (is_numeric($sid)) {
-              db_query("INSERT INTO {uc_signup_log} (oid, sid, type) VALUES (%d, %d, %d)", $arg1->order_id, $sid, 0);
-            }
-          }
-        }
-      }
-  }
+	switch ($op) {
+		case 'total':
+			// When calculating the total, put the latest session information into the database
+			// We only store one per user, because there really shouldn't be any reason to have more
+			// This should store the serialized version of the session so we can access it later
+			global $user;
+			$uid = $user->uid;
+			if($uid != 0) {
+				if(!empty($_SESSION['uc_signup'])) {
+					if(db_result(db_query("SELECT COUNT(*) FROM {uc_signup_temp_storage} WHERE uid = %d LIMIT 0, 1;", $uid)) > 0) {
+						db_query("UPDATE {uc_signup_temp_storage} SET ser_data = '%s' WHERE uid = %d LIMIT 1;", serialize($_SESSION['uc_signup']), $uid);
+					} else {
+						db_query("INSERT INTO {uc_signup_temp_storage} VALUES (%d, '%s');", $uid, serialize($_SESSION['uc_signup']));
+					}
+				}
+			} else {
+				// Uhhh...?
+			}
+			break;
+		case 'update':
+			if(($arg1->uid > 0) && ($order_user = user_load(array('uid' => $arg1->uid))) !== FALSE && ($arg2 == 'completed')) {
+				foreach ($arg1->products as $product) {
+					if (isset($product->data['uc_signup_enabled']) && $product->data['uc_signup_enabled'] == 1) {
+					$events_to_signup[] = $product;
+				}
+			}
+			
+			if (!empty($events_to_signup)) {
+				uc_signup_cancel_temporary_signups($arg1);
+				if(empty($_SESSION['uc_signup'])) {
+					// Uh-oh, we don't have a session value for this. Let's try using the new temp storage table
+					$newSession = db_result(db_query("SELECT ser_data FROM {uc_signup_temp_storage} WHERE uid = %d LIMIT 0, 1;", $arg1->uid));
+					$newSession = unserialize($newSession);
+					$_SESSION['uc_signup'] = $newSession;
+				}
+				// If it's still empty, even after doing the temporary table solution, then all hope is lost...
+				if(!empty($_SESSION['uc_signup'])) {
+					foreach ($_SESSION['uc_signup']['nids'] as $nid => $attendees) {
+						foreach ($attendees as $key => $mail) {
+							$account = user_load(array('mail' => $mail));
+							if (empty($account->uid)) {
+								$new_account['mail'] = $mail;
+								$namenew = preg_replace('/@.*$/', '', $mail);
+								// From the email registration module:
+								if (db_result(db_query("SELECT count(*) FROM {users} WHERE LOWER(name) = LOWER('%s')", $namenew)) > 0) {
+									// Find the next number available to append to the name
+									$sql = "SELECT SUBSTRING_INDEX(name,'_',-1) FROM {users} WHERE name REGEXP '%s' ORDER BY CAST(SUBSTRING_INDEX(name,'_',-1) AS UNSIGNED) DESC LIMIT 1";
+									$nameidx = db_result(db_query($sql, '^'. $namenew .'_[0-9]+$'));
+									$namenew .= '_'. ($nameidx + 1);
+								}
+								$new_account['name'] = $namenew;
+								$profile_form = array_values(module_invoke('profile', 'user', 'register', array(), (object)array()));
+								$profile_form = $profile_form[0];
+								foreach ($profile_form as $key => $value) {
+									if ($key[0] != '#') {
+										$new_account[$key] = $_SESSION['uc_signup']['profile'][$key .'_'. $mail];
+									}
+								}
+								$account = user_save(NULL, $new_account);
+							}
+							$to_signup[$nid][] = $account->uid;
+						}
+					}
+					
+					// First, create accounts for emails that don't have accounts.
+					$placeholders = '';
+					global $user;
+					// TODO: check if there are any signups to create.
+					//Make sure that there are enough spots before continuing. If there are not enough spots, the order should fail.
+					
+					foreach ($to_signup as $nid => $value) {
+						$spots_remaining = uc_signup_spots_remaining(array('nid' => $nid)); 
+						if (count($to_signup[$nid]) > $spots_remaining) {
+							$insufficient_space[] = $nid;
+							$message .= _uc_signup_limit_reached_message($spots_remaining, array('nid' => $nid));
+						}
+						if (!empty($insufficient_space)) {
+							$message .= t("Events can fill up rapidly, and people may have signed up since you added these events to your cart. Please adjust the quantity before checking out.");
+							uc_signup_cancel_temporary_signups($order);
+							return array(array('pass' => FALSE, 'message' => t($message)));
+						}
+					}
+					unset($nid);
+					foreach ($to_signup as $nid => $uids) {
+						foreach ($uids as $key => $uid) {
+							$signup_form = array(
+								'nid' => $nid,
+								'uid' => $uid,
+							);
+							$sid = NULL;
+							$sid = signup_sign_up_user($signup_form, FALSE);
+							if (is_numeric($sid)) {
+								db_query("INSERT INTO {uc_signup_log} (oid, sid, type) VALUES (%d, %d, %d)", $arg1->order_id, $sid, 0);
+							}
+						}
+					}
+				} else {
+					watchdog("uc_signup alert", "When checking out, session was empty even though we had events to checkout for.");
+				}
+			}
+			break;
+		}
+	}
 }
 
 function uc_signup_spots_remaining($node) {
