Index: ubercart/ca/ca.admin.inc
===================================================================
--- ubercart/ca/ca.admin.inc	(revision 733)
+++ ubercart/ca/ca.admin.inc	(working copy)
@@ -74,6 +74,7 @@
     // Build the basic operation links for each predicate.
     $ops = array(
       l(t('edit'), CA_UI_PATH .'/'. $key .'/edit'),
+      l(t('export'),  CA_UI_PATH .'/'. $key .'/export'),
     );
 
     // Add the reset link if a module defined predicate has been modified.
@@ -85,6 +86,7 @@
     if (is_numeric($key)) {
       $ops[] = l(t('delete'), CA_UI_PATH .'/'. $key .'/delete');
     }
+    
 
     // Add the predicate's row to the table based on the grouping type.
     if ($groupby == 'trigger') {
@@ -302,6 +304,61 @@
   $form_state['redirect'] = CA_UI_PATH;
 }
 
+//Provide a form for exporting predicates
+function ca_predicate_export_form($form_state, $pid) {
+  $form = array();
+  if (!empty($pid) && $pid !== 0) {
+    $predicate = ca_load_predicate($pid);
+
+    // Fail out if we didn't find a predicate for that ID.
+    if (empty($predicate)) {
+      drupal_set_message(t('That predicate does not exist.'), 'error');
+      drupal_goto(CA_UI_PATH);
+    }
+
+    drupal_set_title(t('Export %predicate', array('%predicate' =>$predicate['#title'])));
+  }
+  $form['predicate'] = array(
+    '#type' => 'textarea',
+    '#title' => t('Export of %predicate', array('%predicate' =>$predicate['#title'])),
+    '#value' => var_export($predicate, true),
+    '#rows' => 20,
+  );
+
+  return $form;
+}
+
+//Provide a form for importing predicates
+function ca_predicate_import_form($form_state) {
+  $form = array();
+  $form['predicate'] = array(
+    '#type' => 'textarea',
+    '#title' => t('Import a predicate'),
+    '#description' => t('Paste an export of a predicate in this box to create a new predicate'),
+    '#rows' => 20,
+  );
+  $form['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Import'),
+  );
+
+  return $form;
+}
+
+//Make sure the predicate doesn't already exist
+function ca_predicate_import_form_validate($form, &$form_state) {
+  eval('$predicate = '.$form_state['values']['predicate'].';');
+  $existing = ca_load_predicate($predicate['#pid']);
+  if(!empty($existing)) {
+    form_set_error('predicate', t('This predicate already exists'));
+  }
+}
+//Save the predicate
+function ca_predicate_import_form_submit($form, &$form_state) {
+  eval('$predicate = '.$form_state['values']['predicate'].';');
+  ca_save_predicate($predicate);
+}
+
 /**
  * Builds a form for adding and editing actions on a predicate.
  *
Index: ubercart/ca/ca.module
===================================================================
--- ubercart/ca/ca.module	(revision 733)
+++ ubercart/ca/ca.module	(working copy)
@@ -57,6 +57,16 @@
     'weight' => 5,
     'file' => 'ca.admin.inc',
   );
+  $items[CA_UI_PATH .'/import'] = array(
+    'title' => 'Import a predicate',
+    'description' => 'Allows an administrator to import a new predicate.',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('ca_predicate_import_form', '0'),
+    'access arguments' => array('administer conditional actions'),
+    'type' => MENU_LOCAL_TASK,
+    'weight' => 5,
+    'file' => 'ca.admin.inc',
+  );
   $items[CA_UI_PATH .'/convert'] = array(
     'title' => 'Convert configurations',
     'description' => 'Convert Workflow-ng configurations into Conditional Actions predicates.',
@@ -122,6 +132,15 @@
     'file' => 'ca.admin.inc',
     'type' => MENU_CALLBACK,
   );
+  $items[CA_UI_PATH .'/%/export'] = array(
+    'title' => 'Export predicate',
+    'description' => "Export a predicate.",
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('ca_predicate_export_form', 3),
+    'access arguments' => array('administer conditional actions'),
+    'file' => 'ca.admin.inc',
+    'type' => MENU_CALLBACK,
+  );
 
   return $items;
 }
