diff --git a/uc_views_bulk_operations/uc_views_bulk_operations.module b/uc_views_bulk_operations/uc_views_bulk_operations.module
index 08668df..86c6d27 100644
--- a/uc_views_bulk_operations/uc_views_bulk_operations.module
+++ b/uc_views_bulk_operations/uc_views_bulk_operations.module
@@ -1,4 +1,5 @@
 <?php
+// $Id: uc_views_bulk_operations.module,v 1.1.2.1.2.8 2010/11/18 16:08:27 longwave Exp $
 
 /**
  * Implementation of hook_views_api().
@@ -47,6 +48,16 @@ function uc_views_bulk_operations_order_operations() {
       'callback' => 'uc_views_bulk_operations_orders_process_orders',
       'disabled' => TRUE,
     ),
+    'precess_orders' => array(
+      'label' => t('Move to previous state'),
+      'callback' => 'uc_views_bulk_operations_orders_precess_orders',
+      'disabled' => TRUE,
+    ),
+    'cycle_orders' => array(
+      'label' => t('Cycle state'),
+      'callback' => 'uc_views_bulk_operations_orders_cycle_orders',
+      'disabled' => TRUE,
+    ),
     'print_orders' => array(
       'label' => t('Print invoice'),
       'callback' => 'uc_views_bulk_operations_orders_print_orders',
@@ -81,12 +92,83 @@ function uc_views_bulk_operations_orders_process_orders($order_ids) {
     // now we need to update each order accordingly.
     if ($new_status) {
       uc_order_update_status($order_id, $new_status);
+      uc_order_comment_save($order_id, 0, t('moved to next state: !status (Ubercart Views Bulk Operations)', array('!status' => $new_status)), 'order', $new_status);
+      drupal_set_message(t('Order #!order_id updated to status: !status', array('!order_id' => $order_id, '!status' => $new_status)));
+    }
+  }
+}
+
+/**
+ * Precesses (sic) selected orders (moves them to previous state in CA)
+ * Code largely taken from uc_views_bulk_operations_orders_process_orders()
+ */
+function uc_views_bulk_operations_orders_precess_orders($order_ids) {
+  $states = uc_order_status_list();
+  foreach ($order_ids as $order_id) {
+    $order = uc_order_load($order_id);
+    foreach ($states as $key => $state) {
+      if ($state['id'] == $order->order_status) {
+        // state matches current one, so grab the previous one if it exists.
+        if ($states[$key-1]) {
+          $new_status = $states[$key-1]['id'];
+        } else { // there is no "previous state", so we're at the beginning. return error msg.
+          $new_status = NULL;
+          drupal_set_message(t('Order #!order_id already at first state. Unable to update.', array('!order_id' => $order_id)), 'error', FALSE);
+        }
+      }
+    }
+
+    // now we need to update each order accordingly.
+    if ($new_status) {
+      uc_order_update_status($order_id, $new_status);
+      uc_order_comment_save($order_id, 0, t('moved to previous state: !status (Ubercart Views Bulk Operations)', array('!status' => $new_status)), 'order', $new_status);
+
       drupal_set_message(t('Order #!order_id updated to status: !status', array('!order_id' => $order_id, '!status' => $new_status)));
     }
   }
 }
 
 /**
+ * Cycles selected orders (moves them to previous state in CA and back to current state)
+ */
+function uc_views_bulk_operations_orders_cycle_orders($order_ids) {
+  $states = uc_order_status_list();
+  foreach ($order_ids as $order_id) {
+    $order = uc_order_load($order_id);
+    foreach ($states as $key => $state) {
+      if ($state['id'] == $order->order_status) {
+        // state matches current one, so grab the previous one if it exists.
+        if ($states[$key-1]) {
+          $new_status = $states[$key-1]['id'];
+        } else { // there is no "previous state", so we're at the beginning. return error msg.
+          $new_status = NULL;
+          drupal_set_message(t('Order #!order_id already at first state. Unable to update.', array('!order_id' => $order_id)), 'error', FALSE);
+        }
+      }
+
+      if ($state['id'] == $order->order_status) {
+        // state matches current one, so grab the next one if it exists.
+        if ($states[$key]) {
+          $current_status = $states[$key]['id'];
+        } else { // there is no "next state", so we're at the end. return error msg.
+          $current_status = NULL;
+          drupal_set_message(t('Order #!order_id already at final state. Unable to update.', array('!order_id' => $order_id)), 'error', FALSE);
+        }
+      }
+    }
+
+    // now we need to update each order accordingly.
+    if ($new_status) {
+      uc_order_update_status($order_id, $new_status);
+      uc_order_comment_save($order_id, 0, t('moved to previous state: !status (Ubercart Views Bulk Operations)', array('!status' => $new_status)), 'order', $new_status);
+      uc_order_update_status($order_id, $current_status);
+      uc_order_comment_save($order_id, 0, t('cycled back to current state: !status (Ubercart Views Bulk Operations)', array('!status' => $current_status)), 'order', $current_status);
+      drupal_set_message(t('Order #!order_id cycled to !status and back to !status_current', array('!order_id' => $order_id, '!status' => $new_status, '!status_current' => $current_status)));
+    }
+  }
+}
+
+/**
  * Print multiple invoices.
  */
 function uc_views_bulk_operations_orders_print_orders($orders) {
