Index: path_redirect.module
===================================================================
--- path_redirect.module
+++ path_redirect.module
@@ -186,6 +186,10 @@
   $r = path_redirect_load($where, $args, $sort);
 
   if ($r) {
+    if (module_exists('rules')) {
+      rules_invoke_event('path_redirect_rules_event_redirecting');
+    }
+
     // Update the last used timestamp so that unused redirects can be purged.
     db_query("UPDATE {path_redirect} SET last_used = %d WHERE rid = %d", array(':last_used' => REQUEST_TIME, ':rid' => $r->rid));
 
@@ -377,3 +381,114 @@
 
   return variable_get($name, isset($default) || !isset($defaults[$name]) ? $default : $defaults[$name]);
 }
+
+/**
+ * Implementation of hook_rules_event_info().
+ */
+function path_redirect_rules_event_info() {
+  return array(
+    'path_redirect_rules_event_redirecting' => array(
+      'label' => t('Path is being redirected'),
+      'module' => 'Path Redirect',
+    ),
+  );
+}
+
+/**
+ * Implementation of hook_rules_condition_info().
+ */
+function path_redirect_rules_condition_info() {
+  return array(
+    'path_redirect_rules_condition_redirect_exists' => array(
+      'label' => t('URL redirect exists for path'),
+      'module' => 'Path Redirect',
+      'eval input' => array('path'),
+    ),
+  );
+}
+
+/**
+ * Condition implementation: Check if the URL alias already exists
+ */
+function path_redirect_rules_condition_redirect_exists($settings) {
+  return (bool)path_redirect_load(array('path' => $settings['path'], 'language' => $settings['language']));
+}
+
+function path_redirect_rules_condition_redirect_exists_form($settings, &$form) {
+  $settings += array('path' => '', 'language' => '');
+  $form['settings']['path'] = array(
+    '#type' => 'textfield',
+    '#title' => t('From'),
+    '#default_value' => $settings['path'],
+    '#maxlength' => 256,
+    '#description' => t('Enter an interal Drupal path or path alias to redirect (e.g. node/123 or taxonomy/term/123).'),
+    '#field_prefix' => url('', array('absolute' => TRUE)) . (variable_get('clean_url', 0) ? '' : '?q='),
+    '#required' => TRUE,
+  );
+  $form['settings']['language'] = array(
+    '#type' => 'value',
+    '#title' => t('Language'),
+    '#options' => array('' => t('All languages')),
+    '#default_value' => $settings['language'],
+    '#description' => t('A redirect set for a specific language will always be used when requesting this page in that language, and takes precedence over redirects set for <em>All languages</em>.'),
+  );
+  if (module_exists('locale')) {
+    $form['settings']['language']['#type'] = 'select';
+    $form['settings']['language']['#options'] += locale_language_list('name');
+  }
+}
+
+/**
+ * Implementation of hook_rules_action_info().
+ */
+function path_redirect_rules_action_info() {
+  return array(
+    'path_redirect_rules_action_path_redirect' => array(
+      'label' => t('Create or delete an URL redirect'),
+      'module' => 'Path Redirect',
+      'eval input' => array('path', 'redirect', 'query', 'fragment'),
+    ),
+  );
+}
+
+/**
+ * Action Implementation
+ */
+function path_redirect_rules_action_path_redirect($settings) {
+  // if the redirect is empty, delete; otherwise create a redirect
+  if ( $settings['redirect'] ) {
+    $pr = path_redirect_load(array('path' => $settings['path'], 'language' => $settings['language']));
+    // only create redirects if the path is not already redirected
+    if ( !$pr ) {
+      path_redirect_save(array(
+        'path' => $settings['path'],
+        'redirect' => $settings['redirect']['redirect'],
+        'query' => $settings['redirect']['query'],
+        'fragment' => $settings['redirect']['fragment'],
+        'language' => $settings['language'],
+        'type' => $settings['advanced']['type'],
+      ));
+    }
+  }
+  else {
+    path_redirect_delete(array('path' => $settings['path'], 'language' => $settings['language']));
+  }
+}
+
+function path_redirect_rules_action_path_redirect_form($settings, &$form) {
+  $settings += array('path' => '', 'redirect' => '', 'query' => '', 'fragment' => '', 'language' => '');
+  module_load_include('inc', 'path_redirect', 'path_redirect.admin');
+  $edit_form = path_redirect_edit_form($settings, array(
+      'path' => $settings['path'],
+      'redirect' => $settings['redirect']['redirect'],
+      'query' => $settings['redirect']['query'],
+      'fragment' => $settings['redirect']['fragment'],
+      'language' => $settings['language'],
+      'type' => $settings['advanced']['type'],
+  ));
+  $form['settings']['path'] = $edit_form['path'];
+  $form['settings']['redirect'] = $edit_form['redirect'];
+  $form['settings']['language'] = $edit_form['language'];
+  $form['settings']['advanced'] = $edit_form['advanced'];
+}
+
