diff -dur rules.orig/rules/modules/taxonomy.rules_forms.inc rules/rules/modules/taxonomy.rules_forms.inc
--- rules.orig/rules/modules/taxonomy.rules_forms.inc	2009-06-13 00:35:34.000000000 -0700
+++ rules/rules/modules/taxonomy.rules_forms.inc	2009-06-13 00:02:37.000000000 -0700
@@ -10,6 +10,108 @@
  */
 
 /**
+ * Action: Add a new term to vocabulary configuration form.
+ *
+ * As we allow adding terms to vocabularies that are created on the fly, we
+ * can't present the term's advanced settings.
+ */
+function rules_action_taxonomy_add_term_form($settings, &$form, $form_state) {
+  // Fields definition taken from taxonomy_form_term().
+  $form['settings']['term'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Term Identification'),
+    '#collapsible' => TRUE,
+  );
+  $form['settings']['term']['name'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Term name'),
+    '#default_value' => !empty($settings['term']['name']) ? $settings['term']['name'] : '',
+    '#maxlength' => 255,
+    '#description' => t('The name of this term.'),
+    '#required' => TRUE,
+  );
+
+  $form['settings']['term']['description'] = array(
+    '#type' => 'textarea',
+    '#title' => t('Description'),
+    '#default_value' => !empty($settings['term']['description']) ? $settings['term']['description'] : '',
+    '#description' => t('A description of the term. To be displayed on taxonomy/term pages and RSS feeds.'),
+  );
+}
+
+/**
+ * Action: Create a new term configuration form.
+ *
+ * @see rules_action_taxonomy_add_term2_submit().
+ */
+function rules_action_taxonomy_add_term2_form($settings, &$form, $form_state) {
+  $settings += array('vocabulary' => 0);
+  if (empty($settings['vocabulary'])) {
+    // Get existing taxonomy vocabularies.
+    $options = _rules_action_taxonomy_get_vocab();
+    $form['settings']['vocabulary'] = array(
+      '#type' => 'select',
+      '#title' => t('Vocabulary'),
+      '#options' => $options,
+      '#description' => !empty($options) ? t('Select the vocabulary where the term will be added.') : t('There are no existing vocabularies, you should <a href="@add-url">add</a> one.', array('@add-url' => url('/admin/content/taxonomy/add/vocabulary'))),
+      '#required' => TRUE,
+      '#disabled' => empty($options),
+    );
+
+    // Hide some form elements in the first step.
+    $form['new']['#access'] = FALSE;
+    $form['input_help']['#access'] = FALSE;
+    $form['weight']['#access'] = FALSE;
+
+    // Replace the usual submit handlers with our own handler.
+    $form['submit']['#submit'] = array('rules_action_taxonomy_add_term2_form_step_submit');
+    $form['submit']['#value'] = t('Continue');
+  }
+  else {
+    module_load_include('inc', 'taxonomy', 'taxonomy.admin');
+    $form['settings']['term'] = array(
+      '#type' => 'fieldset',
+      '#title' => t('Term settings'),
+    );
+
+    $vocabulary = taxonomy_vocabulary_load($settings['vocabulary']);
+    $form['settings']['term']['info'] = array(
+      '#value' => t('Define the term to add to vocabulary !vocab', array('!vocab' => $vocabulary->name)),
+    );
+
+    $form['settings']['term']['term_add'] = taxonomy_form_term($form_state, $vocabulary, !empty($settings['term']) ? $settings['term'] : array());
+
+    // Remove the 'Save' button.
+    unset($form['settings']['term']['term_add']['submit']);
+  }
+}
+
+function rules_action_taxonomy_add_term2_form_step_submit($form, &$form_state) {
+  $form_state['element']['#settings']['vocabulary'] = $form_state['values']['settings']['vocabulary'];
+}
+
+/**
+ * Action: Create a new term submit handler.
+ *
+ * Flatten the term settings so they can be passed back to
+ * taxonomy_form_term().
+ */
+function rules_action_taxonomy_add_term2_submit(&$settings, $form, $form_state) {
+  if (!empty($settings['term'])) {
+    $term_add = $settings['term']['term_add'];
+    unset($settings['term']['term_add']);
+    foreach ($term_add as $key => $values) {
+      if (is_array($values)) {
+        $settings['term'] += $values;
+      }
+      else {
+        $settings['term'][$key] = $values;
+      }
+    }
+  }
+}
+
+/**
  * Action: Load a term configuration form.
  *
  * Multistep form.
@@ -57,7 +159,7 @@
       '#title' => t('Select by term id'),
       '#default_value' => !empty($settings['term']['term_text']) ? $settings['term']['term_text'] : '',
       '#disabled' => empty($options),
-      '#description' => t('Optional: enter the term id (<em>not the term name</em>) that should be loaded . If this field is used "Select a term" field will be ignored.'),
+      '#description' => t('Optional: enter the term id, or the term name preceded by <strong>name:</strong> that should be loaded . If this field is used "Select a term" field will be ignored.'),
     );
   }
 }
diff -dur rules.orig/rules/modules/taxonomy.rules.inc rules/rules/modules/taxonomy.rules.inc
--- rules.orig/rules/modules/taxonomy.rules.inc	2009-06-13 00:35:34.000000000 -0700
+++ rules/rules/modules/taxonomy.rules.inc	2009-06-13 00:21:12.000000000 -0700
@@ -62,6 +62,45 @@
 function taxonomy_rules_action_info() {
   $info = array();
   // Term actions.
+  $info['rules_action_taxonomy_add_term'] = array(
+    'label' => t('Add a new term (dynamic vocabulary)'),
+    'arguments' => array(
+      'taxonomy_vocab' => array(
+        'type' => 'taxonomy_vocab',
+        'label' => t('Taxonomy vocabulary'),
+      ),
+    ),
+    'new variables' => array(
+      'taxonomy_term' => array(
+        'type' => 'taxonomy_term',
+        'label' => t('Taxonomy term'),
+      ),
+    ),
+    'eval input' => array('term|name', 'term|description'),
+    'module' => 'Taxonomy',
+  );
+  $info['rules_action_taxonomy_add_term2'] = array(
+    'label' => t('Add a new term (fixed vocabulary)'),
+    'new variables' => array(
+      'taxonomy_term' => array(
+        'type' => 'taxonomy_term',
+        'label' => t('Taxonomy term'),
+      ),
+    ),
+    'eval input' => array('term|name', 'term|description', 'term|synonyms'),
+    'help' => t('Create a new term in the specified vocabulary. The term can be acted on afterward (i.e. to add a parent term.)'),
+    'module' => 'Taxonomy',
+  );
+  $info['rules_action_taxonomy_delete_term'] = array(
+    'label' => t('Delete a term'),
+    'arguments' => array(
+      'taxonomy_term' => array(
+        'type' => 'taxonomy_term',
+        'label' => t('Taxonomy term'),
+      ),
+    ),
+    'module' => 'Taxonomy',
+  );
   $info['rules_action_taxonomy_load_term'] = array(
     'label' => t('Load a term'),
     'new variables' => array(
@@ -74,6 +113,21 @@
     'help' => t('Loading a taxonomy term will allow you to act on this term, for example you will be able to assign this term to a content.'),
     'module' => 'Taxonomy',
   );
+  $info['rules_action_taxonomy_assign_parent_term'] = array(
+    'label' => t('Assign a parent term to a term'),
+    'arguments' => array(
+      'taxonomy_term_parent' => array(
+        'type' => 'taxonomy_term',
+        'label' => t('Parent term'),
+      ),
+      'taxonomy_term_child' => array(
+        'type' => 'taxonomy_term',
+        'label' => t('Child term'),
+      ),
+    ),
+    'help' => t('Use two terms and make one the parent of the other. The terms must be previously loaded or added.'),
+    'module' => 'Taxonomy',
+  );
   $info['rules_action_taxonomy_term_assign_to_content'] = array(
     'label' => t('Assign a term to content'),
     'arguments' => array(
@@ -129,15 +183,65 @@
 }
 
 /**
+ * Action: Add a new term to vocabulary.
+ */
+function rules_action_taxonomy_add_term($taxonomy_vocab, $settings) {
+  // Prepare the values to pass to taxonomy_save_term();
+  $settings['term']['vid'] = $taxonomy_vocab->vid;
+  $form_values = $settings['term'];
+  taxonomy_save_term($form_values);
+  // Get the newly created term.
+  $term = taxonomy_get_term($form_values['tid']);
+  return array('taxonomy_term' => $term);
+}
+
+/**
+ * Action: Add a term.
+ */
+function rules_action_taxonomy_add_term2($settings) {
+  $form_values = $settings['term'];
+  taxonomy_save_term($form_values);
+  $settings['term']['tid'] = $form_values['tid']; // Necessary?
+  return array('taxonomy_term' => taxonomy_get_term($form_values['tid']));
+}
+
+/**
+ * Action: Delete a term.
+ */
+function rules_action_taxonomy_delete_term($taxonomy_term) {
+  taxonomy_del_term($taxonomy_term->tid);
+}
+
+/**
  * Action: Load a term.
  */
 function rules_action_taxonomy_load_term($settings) {
-  if ($term = taxonomy_get_term(!empty($settings['term']['term_text']) ? $settings['term']['term_text'] : $settings['term']['term_select'])) {
+  $term_text = $settings['term']['term_text'];
+  if ($term_text && substr($term_text, 0, 5) == "name:") {
+    $terms = taxonomy_get_term_by_name(substr($term_text, 5));
+    foreach ($terms as $term) {
+      if ($term->vid == $settings['vocabulary']) {
+        return array('taxonomy_term' => $term);
+      }
+    }
+    // did not work...
+  }
+  else if ($term = taxonomy_get_term(!empty($term_text) ? $term_text : $settings['term']['term_select'])) {
     return array('taxonomy_term' => $term);
   }
 }
 
 /**
+ * Action: Assign a term as the parent of another term.
+ */
+function rules_action_taxonomy_assign_parent_term($taxonomy_term_parent, $taxonomy_term_child, $settings) {
+  $sql = "INSERT INTO {term_hierarchy} (tid, parent) VALUES (%d, %d)";
+watchdog('rules', 'COMMAND: '.$sql.' ('.$taxonomy_term_child->tid.', '.$taxonomy_term_parent->tid.')', NULL, WATCHDOG_ERROR, NULL);
+  db_query($sql, $taxonomy_term_child->tid, $taxonomy_term_parent->tid);
+  return array('taxonomy_term_child' => $taxonomy_term_child);
+}
+
+/**
  * Action: Assign or remove a term to content.
  */
 function rules_action_taxonomy_term_assign_to_content($node, $taxonomy_term, $settings) {
