diff --git a/uc_signup.module b/uc_signup.module
index f28f9c3..0ae6c3c 100644
--- a/uc_signup.module
+++ b/uc_signup.module
@@ -861,6 +861,22 @@ function uc_signup_ca_action() {
       'order' => $order_arg,
     ),
   );
+  $actions['uc_signup_add_user_roles'] = array(
+   '#title' => t('Add roles to signed-up users'),
+    '#category' => t('uc_signup'),
+    '#callback' => 'uc_signup_add_user_roles',
+    '#arguments' => array(
+      'order' => $order_arg,
+    ),
+  );
+  $actions['uc_signup_remove_user_roles'] = array(
+   '#title' => t('Remove roles from signed-up users'),
+    '#category' => t('uc_signup'),
+    '#callback' => 'uc_signup_remove_user_roles',
+    '#arguments' => array(
+      'order' => $order_arg,
+    ),
+  );
   return $actions;
 }
 
@@ -1157,6 +1173,70 @@ function uc_signup_mark_paid($order, $settings = array()) {
   unset($_SESSION['uc_signup']);
 }
 
+function uc_signup_add_user_roles($order, $settings = array()) {
+  if (!isset($settings['roles']) || empty($settings['roles']))
+    return;
+
+  $signups = _uc_signup_get_temporary_signups($order);
+  if (!empty($signups)) {
+    foreach ($signups as $signup) {
+      // Not for the anonymous user.
+      if (empty($signup->uid))
+        continue;
+      $account = user_load($signup->uid);
+      $new_roles = $account->roles + $roles;
+      user_save($account, array('roles' => $new_roles));
+    }
+  }
+}
+
+function uc_signup_add_user_roles_form($form_state, $settings = array(), $arguments = array()) {
+  $form['roles'] = array(
+    '#type' => 'checkboxes',
+    '#title' => t('Roles'),
+    '#description' => t('Select roles to be added to the signed-up user.'),
+    '#options' => user_roles(TRUE),
+    '#default_value' => !empty($settings['roles']) ? $settings['roles'] : array(),
+  );
+  return $form;
+}
+
+function uc_signup_add_user_roles_form_validate($form, &$form_state) {
+  $form_state['values']['roles'] = array_filter($form_state['values']['roles']);
+}
+
+function uc_signup_remove_user_roles($order, $settings = array()) {
+  if (!isset($settings['roles']) || empty($settings['roles']))
+    return;
+
+  $signups = _uc_signup_get_temporary_signups($order);
+  if (!empty($signups)) {
+    foreach ($signups as $signup) {
+      // Not for the anonymous user.
+      if (empty($signup->uid))
+        continue;
+      $account = user_load($signup->uid);
+      $new_roles = array_diff_key($account->roles, $roles);
+      user_save($account, array('roles' => $new_roles));
+    }
+  }
+}
+
+function uc_signup_remove_user_roles_form($form_state, $settings = array(), $arguments = array()) {
+  $form['roles'] = array(
+    '#type' => 'checkboxes',
+    '#title' => t('Roles'),
+    '#description' => t('Select roles to be removed from the signed-up user.'),
+    '#options' => user_roles(TRUE),
+    '#default_value' => !empty($settings['roles']) ? $settings['roles'] : array(),
+  );
+  return $form;
+}
+
+function uc_signup_remove_user_roles_form_validate($form, &$form_state) {
+  $form_state['values']['roles'] = array_filter($form_state['values']['roles']);
+}
+
 function _uc_signup_node_available($node, $qty, &$message) {
   $type_name = db_result(db_query("SELECT name from {node_type} WHERE type = '%s'", $node->type));
   if (_signup_node_completed($node)) {
