diff --git rules.module rules.module
index dafae30..45c7c31 100644
--- rules.module
+++ rules.module
@@ -5,9 +5,6 @@
  * @file Rules engine module
  */
 
-define('RULES_UI_PATH', 'admin/config/workflow/rules');
-define('RULES_UI_RULE_PATH', RULES_UI_PATH . '/config');
-
 // Add the rules autoloader, which cares about auto-loading the faces include.
 // @see http://drupal.org/project/faces
 spl_autoload_register('rules_autoload');
@@ -475,6 +472,7 @@ function rules_entity_info() {
       'export' => array(
         'default hook' => 'default_rules_configuration',
       ),
+      'access callback' => 'rules_config_access',
     ),
   );
 }
@@ -856,106 +854,6 @@ function rules_permission() {
 }
 
 /**
- * Implements hook_menu().
- * Provides some callbacks used by the embeddable UI.
- */
-function rules_menu() {
-  $items[RULES_UI_RULE_PATH . '/%rules_config'] = array(
-    'title callback' => 'rules_get_title',
-    'title arguments' => array('Editing !plugin "!label"', 5),
-    'page callback' => 'drupal_get_form',
-    'page arguments' => array('rules_ui_form_edit_rules_config', 5),
-    'access arguments' => array('administer rules'),
-    'description' => 'Manage reaction rules and rule components.',
-    'type' => MENU_CALLBACK,
-    'file' => 'ui/ui.forms.inc',
-  );
-  $items[RULES_UI_RULE_PATH . '/%rules_config/add/%/%rules_element'] = array(
-    'title callback' => 'rules_get_title',
-    'title arguments' => array('Add a new !plugin', 7),
-    'page callback' => 'drupal_get_form',
-    'page arguments' => array('rules_ui_add_element', 5, 7, 8),
-    'access arguments' => array('administer rules'),
-    'load arguments' => array(5),
-    'type' => MENU_CALLBACK,
-    'file' => 'ui/ui.forms.inc',
-  );
-  $items[RULES_UI_RULE_PATH . '/%rules_config/add/event'] = array(
-    'title callback' => 'rules_get_title',
-    'title arguments' => array('Addin events to !plugin "!label"', 5),
-    'page callback' => 'drupal_get_form',
-    'page arguments' => array('rules_ui_add_event', 5),
-    'access arguments' => array('administer rules'),
-    'load arguments' => array(5),
-    'type' => MENU_CALLBACK,
-    'file' => 'ui/ui.forms.inc',
-  );
-  $items[RULES_UI_RULE_PATH . '/%rules_config/delete/event'] = array(
-    //@todo: improve title.
-    'title' => 'Remove event',
-    'page callback' => 'drupal_get_form',
-    'page arguments' => array('rules_ui_remove_event', 5, 8),
-    'access arguments' => array('administer rules'),
-    'description' => 'Remove an event from a reaction rule.',
-    'type' => MENU_CALLBACK,
-    'file' => 'ui/ui.forms.inc',
-  );
-  $items[RULES_UI_RULE_PATH . '/%rules_config/edit/%rules_element'] = array(
-    'title callback' => 'rules_get_title',
-    'title arguments' => array('Editing !plugin "!label"', 7),
-    'page callback' => 'drupal_get_form',
-    'page arguments' => array('rules_ui_edit_element', 5, 7),
-    'access arguments' => array('administer rules'),
-    'load arguments' => array(5),
-    'type' => MENU_CALLBACK,
-    'file' => 'ui/ui.forms.inc',
-  );
-  $items[RULES_UI_RULE_PATH . '/%rules_config/autocomplete'] = array(
-    'page callback' => 'rules_ui_form_data_selection_auto_completion',
-    'page arguments' => array(7, 8, 9),
-    'access arguments' => array('administer rules'),
-    'type' => MENU_CALLBACK,
-    'file' => 'ui/ui.forms.inc',
-  );
-  $items[RULES_UI_RULE_PATH . '/%rules_config/delete/%rules_element'] = array(
-    'title callback' => 'rules_get_title',
-    'title arguments' => array('Editing !plugin "!label"', 7),
-    'page callback' => 'drupal_get_form',
-    'page arguments' => array('rules_ui_delete_element', 5, 7),
-    'access arguments' => array('administer rules'),
-    'load arguments' => array(5),
-    'type' => MENU_CALLBACK,
-    'file' => 'ui/ui.forms.inc',
-  );
-  $items[RULES_UI_RULE_PATH . '/%rules_config/%'] = array(
-    'page callback' => 'drupal_get_form',
-    'page arguments' => array('rules_ui_form_rules_config_confirm_op', 5, 6),
-    'access arguments' => array('administer rules'),
-    'type' => MENU_CALLBACK,
-    'file' => 'ui/ui.forms.inc',
-  );
-  $items[RULES_UI_RULE_PATH . '/%rules_config/clone'] = array(
-    'title callback' => 'rules_get_title',
-    'title arguments' => array('Cloning !plugin "!label"', 5),
-    'page callback' => 'drupal_get_form',
-    'page arguments' => array('rules_ui_form_clone_rules_config', 5),
-    'access arguments' => array('administer rules'),
-    'type' => MENU_CALLBACK,
-    'file' => 'ui/ui.forms.inc',
-  );
-  $items[RULES_UI_RULE_PATH . '/%rules_config/execute'] = array(
-    'title callback' => 'rules_get_title',
-    'title arguments' => array('Executing !plugin "!label"', 5),
-    'page callback' => 'drupal_get_form',
-    'page arguments' => array('rules_ui_form_execute_rules_config', 5),
-    'access arguments' => array('administer rules'),
-    'type' => MENU_CALLBACK,
-    'file' => 'ui/ui.forms.inc',
-  );
-  return $items;
-}
-
-/**
  * Callback for loading rules configuration elements.
  */
 function rules_element_load($element_id, $config_name) {
@@ -1060,3 +958,12 @@ function rules_modules_disabled($modules) {
   rules_clear_cache();
   //TODO: Disable configs with now broken dependencies?
 }
+
+/**
+ * Access callback for rules configurations.
+ *
+ * @see entity_access()
+ */
+function rules_config_access($op, $rules_config, $account = NULL) {
+  return user_access('administer rules', $account);
+}
diff --git rules_admin/rules_admin.inc rules_admin/rules_admin.inc
index 3188b16..8aeb888 100644
--- rules_admin/rules_admin.inc
+++ rules_admin/rules_admin.inc
@@ -9,8 +9,10 @@
 /**
  * Reaction rules overview.
  */
-function rules_admin_reaction_overview($form, &$form_state) {
+function rules_admin_reaction_overview($form, &$form_state, $base_path) {
   form_load_include($form_state, 'inc', 'rules', 'ui/ui.forms');
+  // Set the static base path.
+  RulesPluginUI::$basePath = $base_path;
 
   $form['filter'] = array(
     '#type' => 'fieldset',
@@ -55,7 +57,10 @@ function rules_admin_reaction_overview($form, &$form_state) {
 /**
  * Components overview.
  */
-function rules_admin_components_overview($form, &$form_state) {
+function rules_admin_components_overview($form, &$form_state, $base_path) {
+  // Set the static base path.
+  RulesPluginUI::$basePath = $base_path;
+
   RulesPluginUI::formDefaults($form, $form_state);
 
   $form['filter'] = array(
@@ -108,7 +113,7 @@ function rules_admin_settings($form, &$form_state) {
 /**
  * Add reaction rules form.
  */
-function rules_admin_add_reaction_rule($form, &$form_state) {
+function rules_admin_add_reaction_rule($form, &$form_state, $base_path) {
   RulesPluginUI::formDefaults($form, $form_state);
 
   $rules_config = rules_reaction_rule();
@@ -126,7 +131,7 @@ function rules_admin_add_reaction_rule($form, &$form_state) {
     $form['settings'][$key]['#access'] = FALSE;
   }
   // Incorporate the form to add the first event.
-  $form['settings'] += rules_ui_add_event(array(), $form_state, $rules_config);
+  $form['settings'] += rules_ui_add_event(array(), $form_state, $rules_config, $base_path);
 
   unset($form['settings']['submit']);
   $form['submit']['#value'] = t('Save');
@@ -148,7 +153,8 @@ function rules_admin_add_reaction_rule_submit($form, &$form_state) {
 /**
  * Add component form.
  */
-function rules_admin_add_component($form, &$form_state) {
+function rules_admin_add_component($form, &$form_state, $base_path) {
+  RulesPluginUI::$basePath = $base_path;
   RulesPluginUI::formDefaults($form, $form_state);
 
   $form['plugin_name'] = array(
@@ -217,3 +223,210 @@ function rules_admin_add_component_submit($form, &$form_state) {
   $rules_config->form_submit($form, $form_state);
   $form_state['redirect'] = RulesPluginUI::path($rules_config->name);
 }
+
+/**
+ * Controller class for customizing the default Entity UI.
+ */
+class RulesUIController extends EntityDefaultUIController {
+
+  public function __construct() {
+    $entity_info = entity_get_info('rules_config');
+    parent::__construct('rules_config', $entity_info);
+  }
+
+  /**
+   * Overrides EntityDefaultUIController::hook_menu()
+   */
+  public function hook_menu() {
+    // Reaction rules UI menu entries.
+    $reaction_path = $this->path . '/reaction';
+    $items = $this->config_menu($reaction_path);
+    $items[$this->path] = array(
+      'title' => 'Rules',
+      'position' => 'right',
+      'page callback' => 'drupal_get_form',
+      'page arguments' => array('rules_admin_reaction_overview', $reaction_path),
+      'description' => 'Manage reaction rules and rule components.',
+      'access arguments' => array('administer rules'),
+      'file' => 'rules_admin.inc',
+      'file path' => drupal_get_path('module', 'rules_admin'),
+    );
+    $items[$reaction_path] = array(
+      'title' => 'Reaction rules',
+      'type' => MENU_DEFAULT_LOCAL_TASK,
+      'weight' => -1,
+    );
+    $items[$reaction_path . '/add'] = array(
+      'title' => 'Add new rule',
+      'page callback' => 'drupal_get_form',
+      'page arguments' => array('rules_admin_add_reaction_rule', $reaction_path),
+      'access arguments' => array('administer rules'),
+      'type' => MENU_LOCAL_ACTION,
+      'file' => 'rules_admin.inc',
+      'file path' => drupal_get_path('module', 'rules_admin'),
+      'weight' => 0,
+    );
+
+    // Components UI menu entries.
+    $component_path = $this->path . '/components';
+    $items += $this->config_menu($component_path);
+    $items[$component_path] = array(
+      'title' => 'Components',
+      'page callback' => 'drupal_get_form',
+      'page arguments' => array('rules_admin_components_overview', $component_path),
+      'access arguments' => array('administer rules'),
+      'type' => MENU_LOCAL_TASK,
+      'file' => 'rules_admin.inc',
+      'file path' => drupal_get_path('module', 'rules_admin'),
+      'weight' => 0,
+    );
+    $items[$component_path . '/add'] = array(
+      'title' => 'Add new component',
+      'page callback' => 'drupal_get_form',
+      'page arguments' => array('rules_admin_add_component', $component_path),
+      'access arguments' => array('administer rules'),
+      'type' => MENU_LOCAL_ACTION,
+      'file' => 'rules_admin.inc',
+      'file path' => drupal_get_path('module', 'rules_admin'),
+      'weight' => 0,
+    );
+
+    $items[$this->path .'/settings'] = array(
+      'title' => 'Settings',
+      'page callback' => 'drupal_get_form',
+      'page arguments' => array('rules_admin_settings'),
+      'access arguments' => array('administer rules'),
+      'type' => MENU_LOCAL_TASK,
+      'file' => 'rules_admin.inc',
+      'file path' => drupal_get_path('module', 'rules_admin'),
+      'weight' => 1,
+    );
+    return $items;
+  }
+
+  /**
+   * Generates menu items to manipulate rules configurations.
+   *
+   * @param $base_path
+   *   The path to the overview page from where the configurations are edited.
+   */
+  public function config_menu($base_path) {
+    $items = array();
+    $base_count = count(explode('/', $base_path));
+    $items[$base_path . '/manage/%rules_config'] = array(
+      'title callback' => 'rules_get_title',
+      'title arguments' => array('Editing !plugin "!label"', $base_count + 1),
+      'page callback' => 'drupal_get_form',
+      'page arguments' => array('rules_ui_form_edit_rules_config', $base_count + 1, $base_path),
+      'access arguments' => array('administer rules'),
+      'description' => 'Manage reaction rules and rule components.',
+      'type' => MENU_VISIBLE_IN_BREADCRUMB,
+      'file' => 'ui/ui.forms.inc',
+      'file path' => drupal_get_path('module', 'rules'),
+    );
+    $items[$base_path . '/manage/%rules_config/add/%rules_element'] = array(
+      'title callback' => 'rules_get_title',
+      'title arguments' => array('Add a new !plugin', $base_count + 3),
+      'page callback' => 'drupal_get_form',
+      'page arguments' => array('rules_ui_add_element', $base_count + 1, $base_count + 4, $base_count + 3, $base_path),
+      'access arguments' => array('administer rules'),
+      'load arguments' => array($base_count + 1),
+      'type' => MENU_VISIBLE_IN_BREADCRUMB,
+      'file' => 'ui/ui.forms.inc',
+      'file path' => drupal_get_path('module', 'rules'),
+    );
+    $items[$base_path . '/manage/%rules_config/add/event'] = array(
+      'title callback' => 'rules_get_title',
+      'title arguments' => array('Addin events to !plugin "!label"', $base_count + 1),
+      'page callback' => 'drupal_get_form',
+      'page arguments' => array('rules_ui_add_event', $base_count + 1, $base_path),
+      'access arguments' => array('administer rules'),
+      'load arguments' => array($base_count + 1),
+      'type' => MENU_VISIBLE_IN_BREADCRUMB,
+      'file' => 'ui/ui.forms.inc',
+      'file path' => drupal_get_path('module', 'rules'),
+    );
+    $items[$base_path . '/manage/%rules_config/delete/event'] = array(
+      //@todo: improve title.
+      'title' => 'Remove event',
+      'page callback' => 'drupal_get_form',
+      'page arguments' => array('rules_ui_remove_event', $base_count + 1, $base_count + 4, $base_path),
+      'access arguments' => array('administer rules'),
+      'description' => 'Remove an event from a reaction rule.',
+      'type' => MENU_VISIBLE_IN_BREADCRUMB,
+      'file' => 'ui/ui.forms.inc',
+      'file path' => drupal_get_path('module', 'rules'),
+    );
+    $items[$base_path . '/manage/%rules_config/edit/%rules_element'] = array(
+      'title callback' => 'rules_get_title',
+      'title arguments' => array('Editing !plugin "!label"', $base_count + 3),
+      'page callback' => 'drupal_get_form',
+      'page arguments' => array('rules_ui_edit_element', $base_count + 1, $base_count + 3, $base_path),
+      'access arguments' => array('administer rules'),
+      'load arguments' => array($base_count + 1),
+      'type' => MENU_VISIBLE_IN_BREADCRUMB,
+      'file' => 'ui/ui.forms.inc',
+      'file path' => drupal_get_path('module', 'rules'),
+    );
+    $items[$base_path . '/manage/%rules_config/autocomplete'] = array(
+      'page callback' => 'rules_ui_form_data_selection_auto_completion',
+      'page arguments' => array($base_count + 3, $base_count + 4, $base_count + 5),
+      'access arguments' => array('administer rules'),
+      'type' => MENU_CALLBACK,
+      'file' => 'ui/ui.forms.inc',
+      'file path' => drupal_get_path('module', 'rules'),
+    );
+    $items[$base_path . '/manage/%rules_config/delete/%rules_element'] = array(
+      'title callback' => 'rules_get_title',
+      'title arguments' => array('Editing !plugin "!label"', $base_count + 3),
+      'page callback' => 'drupal_get_form',
+      'page arguments' => array('rules_ui_delete_element', $base_count + 1, $base_count + 3, $base_path),
+      'access arguments' => array('administer rules'),
+      'load arguments' => array($base_count + 1),
+      'type' => MENU_VISIBLE_IN_BREADCRUMB,
+      'file' => 'ui/ui.forms.inc',
+      'file path' => drupal_get_path('module', 'rules'),
+    );
+    $items[$base_path . '/manage/%rules_config/%'] = array(
+      'page callback' => 'drupal_get_form',
+      'page arguments' => array('rules_ui_form_rules_config_confirm_op', $base_count + 1, $base_count + 2, $base_path),
+      'access arguments' => array('administer rules'),
+      'type' => MENU_VISIBLE_IN_BREADCRUMB,
+      'file' => 'ui/ui.forms.inc',
+      'file path' => drupal_get_path('module', 'rules'),
+    );
+    $items[$base_path . '/manage/%rules_config/clone'] = array(
+      'title callback' => 'rules_get_title',
+      'title arguments' => array('Cloning !plugin "!label"', $base_count + 1),
+      'page callback' => 'drupal_get_form',
+      'page arguments' => array('rules_ui_form_clone_rules_config', $base_count + 1, $base_count + 2, $base_path),
+      'access arguments' => array('administer rules'),
+      'type' => MENU_VISIBLE_IN_BREADCRUMB,
+      'file' => 'ui/ui.forms.inc',
+      'file path' => drupal_get_path('module', 'rules'),
+    );
+    $items[$base_path . '/manage/%rules_config/execute'] = array(
+      'title callback' => 'rules_get_title',
+      'title arguments' => array('Executing !plugin "!label"', $base_count + 1),
+      'page callback' => 'drupal_get_form',
+      'page arguments' => array('rules_ui_form_execute_rules_config', $base_count + 1, $base_path),
+      'access arguments' => array('administer rules'),
+      'type' => MENU_VISIBLE_IN_BREADCRUMB,
+      'file' => 'ui/ui.forms.inc',
+      'file path' => drupal_get_path('module', 'rules'),
+    );
+    if (module_exists('rules_scheduler')) {
+      $items[$base_path . '/manage/%rules_config/schedule'] = array(
+        'title callback' => 'rules_get_title',
+        'title arguments' => array('Schedule !plugin "!label"', $base_count + 1),
+        'page callback' => 'drupal_get_form',
+        'page arguments' => array('rules_scheduler_schedule_form', $base_count + 1, $base_path),
+        'access arguments' => array('administer rules'),
+        'type' => MENU_VISIBLE_IN_BREADCRUMB,
+        'file' => 'rules_scheduler.admin.inc',
+        'file path' => drupal_get_path('module', 'rules_scheduler'),
+      );
+    }
+    return $items;
+  }
+}
diff --git rules_admin/rules_admin.module rules_admin/rules_admin.module
index 90b554c..88346c9 100644
--- rules_admin/rules_admin.module
+++ rules_admin/rules_admin.module
@@ -5,65 +5,15 @@
  * @file Rules Admin UI
  */
 
-define('RULES_ADMIN_REACION_PATH', RULES_UI_PATH . '/reaction');
-define('RULES_ADMIN_COMPONENT_PATH', RULES_UI_PATH . '/components');
-
 /**
- * Implementation of hook_menu()
+ * Implements hook_entity_info_alter().
  */
-function rules_admin_menu() {
-  $items = array();
-  $items[RULES_UI_PATH] = array(
-    'title' => 'Rules',
-    'position' => 'right',
-    'page callback' => 'drupal_get_form',
-    'page arguments' => array('rules_admin_reaction_overview'),
-    'description' => 'Manage reaction rules and rule components.',
-    'access arguments' => array('administer rules'),
-    'file' => 'rules_admin.inc',
-  );
-  $items[RULES_ADMIN_REACION_PATH] = array(
-    'title' => 'Reaction rules',
-    'type' => MENU_DEFAULT_LOCAL_TASK,
-    'weight' => -1,
-  );
-  $items[RULES_ADMIN_REACION_PATH . '/add'] = array(
-    'title' => 'Add new rule',
-    'page callback' => 'drupal_get_form',
-    'page arguments' => array('rules_admin_add_reaction_rule'),
-    'access arguments' => array('administer rules'),
-    'type' => MENU_LOCAL_ACTION,
-    'file' => 'rules_admin.inc',
-    'weight' => 0,
-  );
-  $items[RULES_ADMIN_COMPONENT_PATH] = array(
-    'title' => 'Components',
-    'page callback' => 'drupal_get_form',
-    'page arguments' => array('rules_admin_components_overview'),
-    'access arguments' => array('administer rules'),
-    'type' => MENU_LOCAL_TASK,
+function rules_admin_entity_info_alter(&$entity_info) {
+  // Enable the entity API UI controller. See EntityDefaultUIController.
+  $entity_info['rules_config']['admin ui'] = array(
+    'controller class' => 'RulesUIController',
+    'path' => 'admin/config/workflow/rules',
     'file' => 'rules_admin.inc',
-    'weight' => 0,
+    'file path' => drupal_get_path('module', 'rules_admin'),
   );
-  $items[RULES_ADMIN_COMPONENT_PATH . '/add'] = array(
-    'title' => 'Add new component',
-    'page callback' => 'drupal_get_form',
-    'page arguments' => array('rules_admin_add_component'),
-    'access arguments' => array('administer rules'),
-    'type' => MENU_LOCAL_ACTION,
-    'file' => 'rules_admin.inc',
-    'weight' => 0,
-  );
-  $items[RULES_UI_PATH .'/settings'] = array(
-    'title' => 'Settings',
-    'page callback' => 'drupal_get_form',
-    'page arguments' => array('rules_admin_settings'),
-    'access arguments' => array('administer rules'),
-    'type' => MENU_LOCAL_TASK,
-    'file' => 'rules_admin.inc',
-    'weight' => 1,
-  );
-  return $items;
 }
-
-
diff --git rules_scheduler/rules_scheduler.admin.inc rules_scheduler/rules_scheduler.admin.inc
index 1dbbe5b..1bed169 100644
--- rules_scheduler/rules_scheduler.admin.inc
+++ rules_scheduler/rules_scheduler.admin.inc
@@ -110,9 +110,10 @@ function rules_scheduler_delete_task_submit($form, &$form_state) {
 /**
  * Configuration form to manually schedule a rules component.
  */
-function rules_scheduler_schedule_form($form, &$form_state, $rules_config) {
+function rules_scheduler_schedule_form($form, &$form_state, $rules_config, $base_path) {
   // Only components can be scheduled.
   if (!($rules_config instanceof RulesTriggerableInterface)) {
+    RulesPluginUI::$basePath = $base_path;
     $form_state['component'] = $rules_config->name;
     $action = rules_action('schedule', array('component' => $rules_config->name));
     $action->form($form, $form_state);
diff --git rules_scheduler/rules_scheduler.module rules_scheduler/rules_scheduler.module
index 1a3d314..5f38bbe 100644
--- rules_scheduler/rules_scheduler.module
+++ rules_scheduler/rules_scheduler.module
@@ -6,7 +6,7 @@
  * Rules scheduler module.
  */
 
-define('RULES_SCHEDULER_PATH', RULES_UI_PATH . '/schedule');
+define('RULES_SCHEDULER_PATH', 'admin/config/workflow/rules/schedule');
 
 /**
  * Implements hook_cron().
@@ -62,15 +62,6 @@ function rules_scheduler_menu() {
     'load arguments' => array(5),
     'file' => 'rules_scheduler.admin.inc',
   );
-  $items[RULES_UI_RULE_PATH . '/%rules_config/schedule'] = array(
-    'title callback' => 'rules_get_title',
-    'title arguments' => array('Schedule !plugin "!label"', 5),
-    'page callback' => 'drupal_get_form',
-    'page arguments' => array('rules_scheduler_schedule_form', 5),
-    'access arguments' => array('administer rules'),
-    'type' => MENU_CALLBACK,
-    'file' => 'rules_scheduler.admin.inc',
-  );
   return $items;
 }
 
diff --git ui/ui.core.inc ui/ui.core.inc
index dd6e852..ed86dae 100644
--- ui/ui.core.inc
+++ ui/ui.core.inc
@@ -147,6 +147,18 @@ class RulesPluginUI extends FacesExtender implements RulesPluginUIInterface {
   protected $element;
 
   /**
+   * The base path determines where a Rules overview UI lives. All forms that
+   * want to display Rules (overview) forms need to set this variable. This is
+   * necessary in order to get correct operation links, paths, redirects, bread
+   * crumbs etc. for the form() and overviewTable() methods.
+   *
+   * @see RulesUIController
+   * @see rules_admin_reaction_overview()
+   * @see rules_admin_components_overview()
+   */
+  public static $basePath = NULL;
+
+  /**
    * Provide $this->element to make the code more meaningful.
    */
   public function __construct(FacesExtendable $object) {
@@ -157,6 +169,9 @@ class RulesPluginUI extends FacesExtender implements RulesPluginUIInterface {
   /**
    * Implements RulesPluginUIInterface.
    * Generates the element edit form.
+   *
+   * Note: Make sure that you set RulesPluginUI::$basePath before using this
+   * method, otherwise paths, links, redirects etc. won't be correct.
    */
   public function form(&$form, &$form_state, $options = array()) {
     self::formDefaults($form, $form_state);
@@ -586,6 +601,9 @@ class RulesPluginUI extends FacesExtender implements RulesPluginUIInterface {
    * Generates the render array for a overview configuration table for arbitrary
    * rule configs that match the given conditions.
    *
+   * Note: Make sure that you set RulesPluginUI::$basePath before using this
+   * method, otherwise paths, links, redirects etc. won't be correct.
+   *
    * @param $conditions
    *   An array of conditions as needed by rules_config_load_multiple().
    * @param $options
@@ -697,9 +715,10 @@ class RulesPluginUI extends FacesExtender implements RulesPluginUIInterface {
    * Generates a path using the given operation for the element with the given
    * id of the configuration with the given name.
    */
-  public static function path($name, $op = NULL, RulesPlugin $element = NULL) {
+  public static function path($name, $op = NULL, RulesPlugin $element = NULL, $parameter = FALSE) {
     $element_id = isset($element) ? $element->elementId() : FALSE;
-    return implode('/', array_filter(array(RULES_UI_RULE_PATH, $name, $op, $element_id)));
+    $base_path = isset(self::$basePath) ? self::$basePath : 'admin/config/workflow/rules';
+    return implode('/', array_filter(array($base_path . '/manage', $name, $op, $element_id, $parameter)));
   }
 
   /**
@@ -755,6 +774,13 @@ class RulesPluginUI extends FacesExtender implements RulesPluginUIInterface {
     // Specify the wrapper div used by #ajax.
     $form['#prefix'] = '<div id="rules-form-wrapper">';
     $form['#suffix'] = '</div>';
+
+    // Preserve the base path in the form state. The after build handler will
+    // set self::$basePath again for cached forms.
+    if (isset(self::$basePath)) {
+      $form_state['_rules_base_path'] = self::$basePath;
+      $form['#after_build'][] = 'rules_form_after_build_restore_base_path';
+    }
   }
 }
 
@@ -890,7 +916,7 @@ class RulesContainerPluginUI extends RulesPluginUI {
       if (!empty($info['embeddable']) && $this->element instanceof $info['embeddable']) {
         $render['#links']['add_' . $plugin] = array(
           'title' => t('Add !name', array('!name' => $plugin)),
-          'href' => RulesPluginUI::path($name, 'add/' . $plugin, $this->element),
+          'href' => RulesPluginUI::path($name, 'add', $this->element, $plugin),
         );
       }
     }
diff --git ui/ui.forms.inc ui/ui.forms.inc
index 9945424..eabaca1 100755
--- ui/ui.forms.inc
+++ ui/ui.forms.inc
@@ -47,7 +47,8 @@ function rules_form_submit_rebuild($form, &$form_state) {
 /**
  * Edit a rules configuration.
  */
-function rules_ui_form_edit_rules_config($form, &$form_state, $rules_config) {
+function rules_ui_form_edit_rules_config($form, &$form_state, $rules_config, $base_path) {
+  RulesPluginUI::$basePath = $base_path;
   $form_state += array('rules_element' => $rules_config);
   // Add the rule configuration's form.
   $rules_config->form($form, $form_state, array('show settings' => TRUE, 'button' => TRUE));
@@ -76,7 +77,8 @@ function rules_ui_form_edit_rules_config_submit($form, &$form_state) {
 /**
  * Clone a rules configuration form.
  */
-function rules_ui_form_clone_rules_config($form, &$form_state, $rules_config) {
+function rules_ui_form_clone_rules_config($form, &$form_state, $rules_config, $base_path) {
+  RulesPluginUI::$basePath = $base_path;
   $rules_config = clone $rules_config;
   $rules_config->module = 'rules';
   $rules_config->id = FALSE;
@@ -97,9 +99,10 @@ function rules_ui_form_clone_rules_config($form, &$form_state, $rules_config) {
 /**
  * Configuration form to directly execute a rules configuration.
  */
-function rules_ui_form_execute_rules_config($form, &$form_state, $rules_config) {
+function rules_ui_form_execute_rules_config($form, &$form_state, $rules_config, $base_path) {
   // Only components can be executed.
   if (!($rules_config instanceof RulesTriggerableInterface)) {
+    RulesPluginUI::$basePath = $base_path;
     // Create either the appropriate action or condition element.
     $element = rules_plugin_factory($rules_config instanceof RulesActionInterface ? 'action' : 'condition', 'component_' . $rules_config->name);
     $form['exec_help'] = array(
@@ -162,10 +165,11 @@ function rules_ui_confirm_operations($op, $rules_config) {
 /**
  * Confirmation form for applying the operation to the config.
  */
-function rules_ui_form_rules_config_confirm_op($form, &$form_state, $rules_config, $op) {
+function rules_ui_form_rules_config_confirm_op($form, &$form_state, $rules_config, $op, $base_path) {
   if ($confirm_question = rules_ui_confirm_operations($op, $rules_config)) {
+    RulesPluginUI::$basePath = $base_path;
     $form_state += array('rules_config' => $rules_config, 'op' => $op);
-    return confirm_form($form, $confirm_question, RULES_UI_PATH, t('This action cannot be undone.'), t('Confirm'), t('Cancel'));
+    return confirm_form($form, $confirm_question, $base_path, t('This action cannot be undone.'), t('Confirm'), t('Cancel'));
   }
   else {
     drupal_not_found();
@@ -220,12 +224,13 @@ function rules_ui_form_rules_config_confirm_op_submit($form, &$form_state) {
 /**
  * Add a new element a rules configuration.
  */
-function rules_ui_add_element($form, &$form_state, $rules_config, $plugin_name, RulesContainerPlugin $parent) {
+function rules_ui_add_element($form, &$form_state, $rules_config, $plugin_name, RulesContainerPlugin $parent, $base_path) {
   $cache = rules_get_cache();
   if (!isset($cache['plugin_info'][$plugin_name]['class'])) {
     drupal_not_found();
     exit;
   }
+  RulesPluginUI::$basePath = $base_path;
   $plugin_is_abstract = in_array('RulesAbstractPlugin', class_parents($cache['plugin_info'][$plugin_name]['class']));
   // In the first step create the element and in the second step show its edit
   // form.
@@ -293,10 +298,11 @@ function rules_ui_add_element_submit($form, &$form_state) {
 /**
  * Delete elements.
  */
-function rules_ui_delete_element($form, &$form_state, $rules_config, $rules_element) {
+function rules_ui_delete_element($form, &$form_state, $rules_config, $rules_element, $base_path) {
+  RulesPluginUI::$basePath = $base_path;
   $form_state += array('rules_config' => $rules_config, 'rules_element' => $rules_element);
   $confirm_question = t('Are you sure you want to delete the %element_plugin %element_name?', array('%element_plugin' => $rules_element->plugin(), '%element_name' => $rules_element->label(), '%plugin' => $rules_config->plugin(), '%label' => $rules_config->label()));
-  return confirm_form($form, $confirm_question, RULES_UI_PATH, t('This action cannot be undone.'), t('Delete'), t('Cancel'));
+  return confirm_form($form, $confirm_question, RulesPluginUI::path($rules_config->name), t('This action cannot be undone.'), t('Delete'), t('Cancel'));
 }
 
 /**
@@ -330,7 +336,8 @@ function rules_ui_delete_element_submit($form, &$form_state) {
 /**
  * Configure a rule element.
  */
-function rules_ui_edit_element($form, &$form_state, $rules_config, $element) {
+function rules_ui_edit_element($form, &$form_state, $rules_config, $element, $base_path) {
+  RulesPluginUI::$basePath = $base_path;
   $form_state += array('rules_element' => $element);
   $form_state['rules_element']->form($form, $form_state, array('button' => TRUE));
   return $form;
@@ -356,7 +363,8 @@ function rules_ui_edit_element_submit($form, &$form_state) {
 /**
  * Add a new event.
  */
-function rules_ui_add_event($form, &$form_state, $rules_config) {
+function rules_ui_add_event($form, &$form_state, $rules_config, $base_path) {
+  RulesPluginUI::$basePath = $base_path;
   $form_state += array('rules_config' => $rules_config);
   $form['event'] = array(
     '#type' => 'select',
@@ -397,10 +405,13 @@ function rules_ui_add_event_submit($form, &$form_state) {
 /**
  * Form to remove a event from a rule.
  */
-function rules_ui_remove_event($form, &$form_state, $rules_config, $event) {
+function rules_ui_remove_event($form, &$form_state, $rules_config, $event, $base_path) {
+  RulesPluginUI::$basePath = $base_path;
   $form_state += array('rules_config' => $rules_config, 'rules_event' => $event);
-  $confirm_question = t('Are you sure you want to remove %event from the %plugin %label?', array('%plugin' => $rules_config->plugin(), '%label' => $rules_config->label(), '%event' => $event));
-  return confirm_form($form, $confirm_question, RULES_UI_RULE_PATH, t('This action cannot be undone.'), t('Remove'), t('Cancel'));
+  $events = rules_fetch_data('event_info');
+  $event_label = $events[$event]['label'];
+  $confirm_question = t('Are you sure you want to remove the event %event from the %plugin %label?', array('%plugin' => $rules_config->plugin(), '%label' => $rules_config->label(), '%event' => $event_label));
+  return confirm_form($form, $confirm_question, RulesPluginUI::path($rules_config->name), t('This action cannot be undone.'), t('Remove'), t('Cancel'));
 }
 
 /**
@@ -678,3 +689,15 @@ function rules_element_sort_helper($a, $b) {
   }
   return ($a['weight'] < $b['weight']) ? -1 : 1;
 }
+
+/**
+ * Form after build handler to set the static base path.
+ *
+ * @see RulesPluginUI::formDefaults()
+ */
+function rules_form_after_build_restore_base_path($form, &$form_state) {
+  if (isset($form_state['_rules_base_path'])) {
+    RulesPluginUI::$basePath = $form_state['_rules_base_path'];
+  }
+  return $form;
+}
