diff --git includes/rules.core.inc includes/rules.core.inc
index 260076b..7abf976 100644
--- includes/rules.core.inc
+++ includes/rules.core.inc
@@ -1910,7 +1910,7 @@ class RulesException extends Exception {
    * @param $severity
    *   The RulesLog severity. Defaults to RulesLog::WARN.
    */
-  function __construct($msg, $args = array(), $element = NULL, $severity = RulesLog::WARN) {
+  function __construct($msg, array $args = array(), $element = NULL, $severity = RulesLog::WARN) {
     $this->element = is_array($element) ? array_shift($element) : $element;
     $this->keys = is_array($element) ? $element : array();
     $this->msg = $msg;
diff --git rules.module rules.module
index e72f39e..732e740 100644
--- rules.module
+++ rules.module
@@ -937,7 +937,16 @@ function rules_menu() {
     '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, 6),
+    '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',
diff --git rules_scheduler/includes/rules_scheduler.views.inc rules_scheduler/includes/rules_scheduler.views.inc
new file mode 100644
index 0000000..f81a53a
--- /dev/null
+++ rules_scheduler/includes/rules_scheduler.views.inc
@@ -0,0 +1,84 @@
+<?php
+// $Id$
+
+/**
+ * @file
+ * Views integration for the rules scheduler module.
+ */
+
+/**
+ * Implements hook_views_data(). Specifies the list of future scheduled
+ * tasks displayed on the schedule page.
+ */
+function rules_scheduler_views_data() {
+  $table = array(
+    'rules_scheduler' => array(
+      'table' => array(
+        'group' => 'Rules scheduler',
+        'base' => array(
+          'field' => 'tid',
+          'title' => t('Scheduled Rules components'),
+          'help' => t("Scheduled Rules components that are executed based on time and cron"),
+          'weight' => -10,
+        ),
+      ),
+      'tid' => array(
+        'title' => t('Tid'),
+        'help' => t('The internal ID of the scheduled component'),
+        'field' => array(
+          'click sortable' => TRUE,
+        ),
+        'filter' => array(
+          'handler' => 'views_handler_filter_numeric',
+        ),
+        'sort' => array(
+          'handler' => 'views_handler_sort',
+        ),
+      ),
+      'config' => array(
+        'title' => t('Component name'),
+        'help' => t('The name of the component'),
+        'field' => array(
+          'click sortable' => TRUE,
+        ),
+        'filter' => array(
+          'handler' => 'rules_scheduler_views_filter',
+        ),
+        'argument' => array(
+          'handler' => 'views_handler_argument_string',
+        ),
+        'sort' => array(
+          'handler' => 'views_handler_sort',
+        ),
+      ),
+      'date' => array(
+        'title' => t('Scheduled date'),
+        'help' => t('Scheduled date and time stamp'),
+        'field' => array(
+          'handler' => 'views_handler_field_date',
+          'click sortable' => TRUE,
+        ),
+        'filter' => array(
+          'handler' => 'views_handler_filter',
+        ),
+        'sort' => array(
+          'handler' => 'views_handler_sort',
+        ),
+      ),
+      'identifier' => array(
+        'title' => t('User provided identifier'),
+        'help' => t('ID to recognize this specific scheduled task'),
+        'field' => array(
+          'click sortable' => TRUE,
+        ),
+        'filter' => array(
+          'handler' => 'views_handler_filter',
+        ),
+        'sort' => array(
+          'handler' => 'views_handler_sort',
+        ),
+      ),
+    ),
+  );
+  return $table;
+}
diff --git rules_scheduler/includes/rules_scheduler.views_default.inc rules_scheduler/includes/rules_scheduler.views_default.inc
new file mode 100644
index 0000000..bad4893
--- /dev/null
+++ rules_scheduler/includes/rules_scheduler.views_default.inc
@@ -0,0 +1,181 @@
+<?php
+// $Id$
+
+/**
+ * @file
+ * Views integration for the rules scheduler module.
+ */
+
+/**
+ * Implements hook_views_default_views().
+ */
+function rules_scheduler_views_default_views() {
+  $view = new view;
+  $view->name = 'rules_scheduler';
+  $view->description = 'Scheduled Rules components';
+  $view->tag = '';
+  $view->base_table = 'rules_scheduler';
+  $view->api_version = '3.0-alpha1';
+  $view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */
+
+  /* Display: Defaults */
+  $handler = $view->new_display('default', 'Defaults', 'default');
+  $handler->display->display_options['access']['type'] = 'perm';
+  $handler->display->display_options['access']['perm'] = 'administer rules';
+  $handler->display->display_options['cache']['type'] = 'none';
+  $handler->display->display_options['query']['type'] = 'views_query';
+  $handler->display->display_options['exposed_form']['type'] = 'basic';
+  $handler->display->display_options['pager']['type'] = 'full';
+  $handler->display->display_options['pager']['options']['items_per_page'] = '30';
+  $handler->display->display_options['pager']['options']['offset'] = '0';
+  $handler->display->display_options['pager']['options']['id'] = '0';
+  $handler->display->display_options['style_plugin'] = 'table';
+  $handler->display->display_options['style_options']['columns'] = array(
+    'tid' => 'tid',
+    'config' => 'config',
+    'date' => 'date',
+    'identifier' => 'identifier',
+    'nothing' => 'nothing',
+  );
+  $handler->display->display_options['style_options']['default'] = 'date';
+  $handler->display->display_options['style_options']['info'] = array(
+    'tid' => array(
+      'sortable' => 0,
+      'default_sort_order' => 'asc',
+      'align' => '',
+      'separator' => '',
+    ),
+    'config' => array(
+      'sortable' => 1,
+      'default_sort_order' => 'asc',
+      'align' => '',
+      'separator' => '',
+    ),
+    'date' => array(
+      'sortable' => 1,
+      'default_sort_order' => 'asc',
+      'align' => '',
+      'separator' => '',
+    ),
+    'identifier' => array(
+      'sortable' => 1,
+      'default_sort_order' => 'asc',
+      'align' => '',
+      'separator' => '',
+    ),
+    'nothing' => array(
+      'align' => '',
+      'separator' => '',
+    ),
+  );
+  $handler->display->display_options['style_options']['override'] = 1;
+  $handler->display->display_options['style_options']['sticky'] = 0;
+  /* Empty text: Global: Text area */
+  $handler->display->display_options['empty']['area']['id'] = 'area';
+  $handler->display->display_options['empty']['area']['table'] = 'views';
+  $handler->display->display_options['empty']['area']['field'] = 'area';
+  $handler->display->display_options['empty']['area']['empty'] = FALSE;
+  $handler->display->display_options['empty']['area']['content'] = 'No tasks scheduled.';
+  $handler->display->display_options['empty']['area']['format'] = 'plain_text';
+  /* Field: Rules scheduler: Tid */
+  $handler->display->display_options['fields']['tid']['id'] = 'tid';
+  $handler->display->display_options['fields']['tid']['table'] = 'rules_scheduler';
+  $handler->display->display_options['fields']['tid']['field'] = 'tid';
+  /* Field: Rules scheduler: Component name */
+  $handler->display->display_options['fields']['config']['id'] = 'config';
+  $handler->display->display_options['fields']['config']['table'] = 'rules_scheduler';
+  $handler->display->display_options['fields']['config']['field'] = 'config';
+  $handler->display->display_options['fields']['config']['alter']['alter_text'] = 0;
+  $handler->display->display_options['fields']['config']['alter']['make_link'] = 1;
+  $handler->display->display_options['fields']['config']['alter']['path'] = 'admin/config/workflow/rules/config/[config]';
+  $handler->display->display_options['fields']['config']['alter']['absolute'] = 0;
+  $handler->display->display_options['fields']['config']['alter']['trim'] = 0;
+  $handler->display->display_options['fields']['config']['alter']['word_boundary'] = 1;
+  $handler->display->display_options['fields']['config']['alter']['ellipsis'] = 1;
+  $handler->display->display_options['fields']['config']['alter']['strip_tags'] = 0;
+  $handler->display->display_options['fields']['config']['alter']['html'] = 0;
+  $handler->display->display_options['fields']['config']['element_label_colon'] = 1;
+  $handler->display->display_options['fields']['config']['element_default_classes'] = 1;
+  $handler->display->display_options['fields']['config']['hide_empty'] = 0;
+  $handler->display->display_options['fields']['config']['empty_zero'] = 0;
+  /* Field: Rules scheduler: Scheduled date */
+  $handler->display->display_options['fields']['date']['id'] = 'date';
+  $handler->display->display_options['fields']['date']['table'] = 'rules_scheduler';
+  $handler->display->display_options['fields']['date']['field'] = 'date';
+  /* Field: Rules scheduler: User provided identifier */
+  $handler->display->display_options['fields']['identifier']['id'] = 'identifier';
+  $handler->display->display_options['fields']['identifier']['table'] = 'rules_scheduler';
+  $handler->display->display_options['fields']['identifier']['field'] = 'identifier';
+  /* Field: Global: Custom text */
+  $handler->display->display_options['fields']['nothing']['id'] = 'nothing';
+  $handler->display->display_options['fields']['nothing']['table'] = 'views';
+  $handler->display->display_options['fields']['nothing']['field'] = 'nothing';
+  $handler->display->display_options['fields']['nothing']['label'] = 'Operations';
+  $handler->display->display_options['fields']['nothing']['alter']['text'] = 'delete';
+  $handler->display->display_options['fields']['nothing']['alter']['make_link'] = 1;
+  $handler->display->display_options['fields']['nothing']['alter']['path'] = 'admin/config/workflow/rules/schedule/[tid]/cancel';
+  $handler->display->display_options['fields']['nothing']['alter']['absolute'] = 0;
+  $handler->display->display_options['fields']['nothing']['alter']['alt'] = 'Delete this scheduled task';
+  $handler->display->display_options['fields']['nothing']['alter']['trim'] = 0;
+  $handler->display->display_options['fields']['nothing']['alter']['word_boundary'] = 1;
+  $handler->display->display_options['fields']['nothing']['alter']['ellipsis'] = 1;
+  $handler->display->display_options['fields']['nothing']['alter']['strip_tags'] = 0;
+  $handler->display->display_options['fields']['nothing']['alter']['html'] = 0;
+  $handler->display->display_options['fields']['nothing']['element_label_colon'] = 1;
+  $handler->display->display_options['fields']['nothing']['element_default_classes'] = 1;
+  $handler->display->display_options['fields']['nothing']['hide_empty'] = 0;
+  $handler->display->display_options['fields']['nothing']['empty_zero'] = 0;
+  /* Sort criterion: Rules scheduler: Scheduled date */
+  $handler->display->display_options['sorts']['date']['id'] = 'date';
+  $handler->display->display_options['sorts']['date']['table'] = 'rules_scheduler';
+  $handler->display->display_options['sorts']['date']['field'] = 'date';
+  /* Argument: Rules scheduler: Component name */
+  $handler->display->display_options['arguments']['config']['id'] = 'config';
+  $handler->display->display_options['arguments']['config']['table'] = 'rules_scheduler';
+  $handler->display->display_options['arguments']['config']['field'] = 'config';
+  $handler->display->display_options['arguments']['config']['style_plugin'] = 'default_summary';
+  $handler->display->display_options['arguments']['config']['wildcard'] = '0';
+  $handler->display->display_options['arguments']['config']['default_argument_type'] = 'fixed';
+  $handler->display->display_options['arguments']['config']['glossary'] = 0;
+  $handler->display->display_options['arguments']['config']['limit'] = '0';
+  $handler->display->display_options['arguments']['config']['transform_dash'] = 0;
+  /* Filter: Rules scheduler: Component name */
+  $handler->display->display_options['filters']['config']['id'] = 'config';
+  $handler->display->display_options['filters']['config']['table'] = 'rules_scheduler';
+  $handler->display->display_options['filters']['config']['field'] = 'config';
+  $handler->display->display_options['filters']['config']['exposed'] = TRUE;
+  $handler->display->display_options['filters']['config']['expose']['operator'] = 'config_op';
+  $handler->display->display_options['filters']['config']['expose']['label'] = 'Component filter';
+  $handler->display->display_options['filters']['config']['expose']['identifier'] = 'config';
+  $handler->display->display_options['filters']['config']['expose']['remember'] = 1;
+  $handler->display->display_options['filters']['config']['expose']['use_operator'] = 0;
+  $handler->display->display_options['filters']['config']['expose']['reduce'] = 0;
+  $translatables['rules_scheduler'] = array(
+    t('Defaults'),
+    t('more'),
+    t('Apply'),
+    t('Reset'),
+    t('Sort By'),
+    t('Asc'),
+    t('Desc'),
+    t('Items per page'),
+    t('- All -'),
+    t('Offset'),
+    t('No tasks scheduled.'),
+    t('Tid'),
+    t('Component name'),
+    t('admin/config/workflow/rules/config/[config]'),
+    t('Scheduled date'),
+    t('User provided identifier'),
+    t('Operations'),
+    t('delete'),
+    t('admin/config/workflow/rules/schedule/[tid]/cancel'),
+    t('Delete this scheduled task'),
+    t('All'),
+    t('Component filter'),
+  );
+
+  $views = array();
+  $views[$view->name] = $view;
+  return $views;
+}
diff --git rules_scheduler/includes/rules_scheduler_views_filter.inc rules_scheduler/includes/rules_scheduler_views_filter.inc
new file mode 100644
index 0000000..d0872f9
--- /dev/null
+++ rules_scheduler/includes/rules_scheduler_views_filter.inc
@@ -0,0 +1,23 @@
+<?php
+// $Id$
+
+/**
+ * @file
+ * An extended subclass for component filtering.
+ */
+class rules_scheduler_views_filter extends views_handler_filter_in_operator {
+  function get_value_options() {
+    if (!isset($this->value_options)) {
+      $this->value_title = t('Component');
+      $result = db_select('rules_scheduler', 'r')
+        ->fields('r', array('config'))
+        ->distinct()
+        ->execute();
+      $config_names = array();
+      foreach ($result as $record) {
+        $config_names[$record->config] = $record->config;
+      }
+      $this->value_options = $config_names;
+    }
+  }
+}
\ No newline at end of file
diff --git rules_scheduler/rules_scheduler.admin.inc rules_scheduler/rules_scheduler.admin.inc
new file mode 100644
index 0000000..2a948ff
--- /dev/null
+++ rules_scheduler/rules_scheduler.admin.inc
@@ -0,0 +1,147 @@
+<?php
+// $Id$
+
+/**
+ * @file
+ * Admin forms for scheduling.
+ */
+
+/**
+ * Schedule page with a view for the scheduled tasks.
+ */
+function rules_scheduler_schedule_page() {
+  // Display view for all scheduled tasks
+  if (module_exists('views')) {
+    // We cannot use views_embed_view() here as we need to set the path for the
+    // component filter form.
+    $view = views_get_view('rules_scheduler');
+    $view->override_path = RULES_SCHEDULER_PATH;
+    $task_list = $view->preview();
+  }
+  else {
+    $task_list = t('To display scheduled tasks you have to install the <a href="http://drupal.org/project/views">Views</a> module.');
+  }
+  $page['task_view'] = array(
+    '#markup' => $task_list,
+  );
+  $form = drupal_get_form('rules_scheduler_form');
+  $page['delete'] = array(
+    '#markup' => drupal_render($form),
+  );
+  return $page;
+}
+
+/**
+ * Form for deletion of tasks.
+ */
+function rules_scheduler_form($form, &$form_state) {
+  $result = db_select('rules_scheduler', 'r')
+    ->fields('r', array('config'))
+    ->distinct()
+    ->execute();
+  $config_names = array();
+  foreach ($result as $record) {
+    $config_names[$record->config] = $record->config;
+  }
+
+  // form fieldset for canceling by component name
+  $form['delete_by_config'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Delete tasks by component name'),
+    '#collapsible' => TRUE,
+  );
+  if (empty($config_names)) {
+    $form['delete_by_config']['#description'] = t('There are currently no scheduled tasks available to delete.');
+  }
+  else {
+    $form['delete_by_config']['config'] = array(
+      '#title' => t('Component name'),
+      '#type' => 'select',
+      '#options' => $config_names,
+      '#multiple' => FALSE,
+    );
+    $form['delete_by_config']['submit'] = array(
+      '#type' => 'submit',
+      '#value' => t('Delete tasks'),
+      '#submit' => array('rules_scheduler_cancel_submit'),
+    );
+  }
+  return $form;
+}
+
+/**
+ * Submit handler for deleting/canceling future scheduled tasks.
+ */
+function rules_scheduler_cancel_submit($form, &$form_state) {
+  module_load_include('inc', 'rules_scheduler', 'rules_scheduler.rules');
+  rules_scheduler_action_cancel($form_state['values']['config']);
+  drupal_set_message(t('All tasks associated with %config have been canceled.', array('%config' => $form_state['values']['config'])));
+}
+
+/**
+ * Confirmation form for canceling single tasks.
+ */
+function rules_scheduler_cancel_task($form, &$form_state, $task) {
+  $form_state['task'] = $task;
+
+  $path = array();
+  $path['path'] = isset($_GET['destination']) ? $_GET['destination'] : RULES_SCHEDULER_PATH;
+
+  $title = t('Are you sure you want to cancel task %tid?', array('%tid' => $task['tid']));
+  if (!empty($task['identifier'])) {
+    $msg = t('This task refers to the custom identifier %id and component %config, it will be executed on %date. The delete action cannot be undone.', array(
+      '%config' => $task['config'],
+      '%id' => $task['identifier'],
+      '%date' => format_date($task['date']),
+    ));
+  }
+  else {
+    $msg = t('This task refers to the component %config and will be executed on %date. The delete action cannot be undone.', array(
+      '%config' => $task['config'],
+      '%id' => $task['identifier'],
+      '%date' => format_date($task['date']),
+    ));
+  }
+  return confirm_form($form, $title, $path, $msg, t('Delete'), t('Cancel'));
+}
+
+/**
+ * Submit handler for canceling single tasks.
+ */
+function rules_scheduler_cancel_task_submit($form, &$form_state) {
+  db_delete('rules_scheduler')
+    ->condition('tid', $form_state['task']['tid'])
+    ->execute();
+  drupal_set_message(t("Task %tid has been deleted.", array('%tid' => $form_state['task']['tid'])));
+  $form_state['redirect'] = RULES_SCHEDULER_PATH;
+}
+
+/**
+ * Configuration form to directly schedule a rules component.
+ */
+function rules_scheduler_schedule_form($form, &$form_state, $rules_config) {
+  // Only components can be scheduled.
+  if (!($rules_config instanceof RulesTriggerableInterface)) {
+    $action = rules_action('schedule', array('component' => $rules_config->name));
+    $action->form($form, $form_state);
+    // The component is already fixed.
+    $form['parameter']['component']['#access'] = FALSE;
+    $form['submit'] = array(
+      '#type' => 'submit',
+      '#value' => t('Schedule'),
+    );
+    $form['#validate'] = array('rules_ui_form_rules_config_validate');
+    return $form;
+  }
+  drupal_not_found();
+  exit;
+}
+
+/**
+ * Submit callback to execute the scheduling action.
+ */
+function rules_scheduler_schedule_form_submit($form, &$form_state) {
+  $action = $form_state['rules_element'];
+  $action->execute();
+  drupal_set_message(t('Component %label has been scheduled.', array('%label' => $action->label())));
+}
diff --git rules_scheduler/rules_scheduler.info rules_scheduler/rules_scheduler.info
index 35b8698..a718039 100644
--- rules_scheduler/rules_scheduler.info
+++ rules_scheduler/rules_scheduler.info
@@ -4,7 +4,11 @@ description = Schedule the execution of rule components.
 dependencies[] = rules
 package = Rules
 core = 7.x
+files[] = rules_scheduler.admin.inc
 files[] = rules_scheduler.module
 files[] = rules_scheduler.install
 files[] = rules_scheduler.rules.inc
-files[] = rules_scheduler.test
\ No newline at end of file
+files[] = rules_scheduler.test
+files[] = includes/rules_scheduler.views_default.inc
+files[] = includes/rules_scheduler.views.inc
+files[] = includes/rules_scheduler_views_filter.inc
diff --git rules_scheduler/rules_scheduler.module rules_scheduler/rules_scheduler.module
index 8d1ad27..0b3e495 100644
--- rules_scheduler/rules_scheduler.module
+++ rules_scheduler/rules_scheduler.module
@@ -6,6 +6,8 @@
  * Rules scheduler module.
  */
 
+define('RULES_SCHEDULER_PATH', RULES_UI_PATH . '/schedule');
+
 /**
  * Implements hook_cron().
  */
@@ -40,6 +42,39 @@ function rules_scheduler_cron() {
 }
 
 /**
+ * Implements hook_menu().
+ */
+function rules_scheduler_menu() {
+  $items = array();
+  $items[RULES_SCHEDULER_PATH] = array(
+    'title' => 'Schedule',
+    'type' => MENU_LOCAL_TASK,
+    'page callback' => 'rules_scheduler_schedule_page',
+    'access arguments' => array('administer rules'),
+    'file' => 'rules_scheduler.admin.inc',
+  );
+  $items[RULES_SCHEDULER_PATH .'/%rules_scheduler_task/cancel'] = array(
+    'title' => 'Cancel a scheduled task',
+    'type' => MENU_LOCAL_TASK,
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('rules_scheduler_cancel_task', 5),
+    'access arguments' => array('administer rules'),
+    '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;
+}
+
+/**
  * Load a task by a given task ID.
  */
 function rules_scheduler_task_load($tid) {
@@ -71,3 +106,13 @@ function rules_scheduler_schedule_task($task) {
   }
   drupal_write_record('rules_scheduler', $task);
 }
+
+/**
+ * Implements hook_views_api().
+ */
+function rules_scheduler_views_api() {
+  return array(
+    'api' => '3.0-alpha1',
+    'path' => drupal_get_path('module', 'rules_scheduler') .'/includes',
+  );
+}
diff --git rules_scheduler/rules_scheduler.rules.inc rules_scheduler/rules_scheduler.rules.inc
index ec166cf..37e7f23 100644
--- rules_scheduler/rules_scheduler.rules.inc
+++ rules_scheduler/rules_scheduler.rules.inc
@@ -94,7 +94,7 @@ function rules_scheduler_action_schedule($args, $element) {
     ));
   }
   else {
-    throw new RulesException('Unable to get the component %name'. array('%name' => $args['component']), $element);
+    throw new RulesException('Unable to get the component %name', array('%name' => $args['component']), $element);
   }
 }
 
@@ -163,7 +163,7 @@ function rules_scheduler_action_schedule_form_alter(&$form, &$form_state, $optio
 function rules_scheduler_action_cancel($component_name = NULL, $task_identifier = NULL) {
   $query = db_delete('rules_scheduler');
   if (!empty($component_name)) {
-    $query->condition('name', $component_name);
+    $query->condition('config', $component_name);
   }
   if (!empty($task_identifier)) {
     $query->condition('identifier', $task_identifier);
diff --git ui/ui.core.inc ui/ui.core.inc
index f2f7df5..24b8288 100644
--- ui/ui.core.inc
+++ ui/ui.core.inc
@@ -606,6 +606,8 @@ class RulesPluginUI extends FacesExtender implements RulesPluginUIInterface {
     $rows = array();
     $event_info = rules_fetch_data('event_info');
 
+    $colspan = 4;
+    $scheduler_exists = module_exists('rules_scheduler');
     foreach ($configs as $name => $config) {
       $row = array();
       $row[] = l($config->label(), RulesPluginUI::path($name));
@@ -637,6 +639,17 @@ class RulesPluginUI extends FacesExtender implements RulesPluginUIInterface {
       }
       $row[] = l(t('clone'), RulesPluginUI::path($name, 'clone'), array('query' => drupal_get_destination()));
 
+      // Add execute link for components only.
+      if (!($config instanceof RulesTriggerableInterface)) {
+        $row[] = l(t('execute'), RulesPluginUI::path($name, 'execute'), array('query' => drupal_get_destination()));
+        $colspan = 5;
+        if ($scheduler_exists) {
+          // Add schedule link for components only.
+          $row[] = l(t('schedule'), RulesPluginUI::path($name, 'schedule'), array('query' => drupal_get_destination()));
+          $colspan = 6;
+        }
+      }
+
       // Add either an delete or revert link.
       if ($config->status != ENTITY_IN_CODE) {
         $text = $config->status & ENTITY_IN_CODE ? t('revert') : t('delete');
@@ -652,7 +665,7 @@ class RulesPluginUI extends FacesExtender implements RulesPluginUIInterface {
 
       $rows[] = $row;
     }
-    $header = array(t('Label'), t('Event'), t('Plugin'), t('Status'), array('data' => t('Operations'), 'colspan' => 4));
+    $header = array(t('Label'), t('Event'), t('Plugin'), t('Status'), array('data' => t('Operations'), 'colspan' => $colspan));
     if (!isset($events)) {
       // Remove the event heading as there is no such column.
       unset($header[1]);
diff --git ui/ui.forms.inc ui/ui.forms.inc
index 23d4e0a..5c7b497 100755
--- ui/ui.forms.inc
+++ ui/ui.forms.inc
@@ -51,13 +51,15 @@ function rules_ui_form_edit_rules_config($form, &$form_state, $rules_config) {
   $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));
+  $form['#validate'] = array('rules_ui_form_rules_config_validate');
   return $form;
 }
 
 /**
- * Edit a rules configuration form validation callback.
+ * General rules configuration form validation callback. Also populates the
+ * rules configuration with the form values.
  */
-function rules_ui_form_edit_rules_config_validate($form, &$form_state) {
+function rules_ui_form_rules_config_validate($form, &$form_state) {
   $form_state['rules_element']->form_validate($form, $form_state);
 }
 
@@ -81,7 +83,7 @@ function rules_ui_form_clone_rules_config($form, &$form_state, $rules_config) {
   $rules_config->name = '';
   $rules_config->label .= ' (' . t('cloned') . ')';
 
-  $form['#validate'][] = 'rules_ui_form_edit_rules_config_validate';
+  $form['#validate'][] = 'rules_ui_form_rules_config_validate';
   $form['#submit'][] = 'rules_ui_form_edit_rules_config_submit';
   $form_state += array('rules_element' => $rules_config);
   // Add the rule configuration's form.
@@ -93,6 +95,36 @@ 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) {
+  // Only components can be executed.
+  if (!($rules_config instanceof RulesTriggerableInterface)) {
+    $action = rules_action('component_' . $rules_config->name);
+    $action->form($form, $form_state);
+    $form['submit'] = array(
+      '#type' => 'submit',
+      '#value' => t('Execute'),
+    );
+    // Re-use the validation callback, which will also populate the action with
+    // the configuration settings in the form.
+    $form['#validate'] = array('rules_ui_form_rules_config_validate');
+    return $form;
+  }
+  drupal_not_found();
+  exit;
+}
+
+/**
+ * Submit callback for directly executing a component.
+ */
+function rules_ui_form_execute_rules_config_submit($form, &$form_state) {
+  $action = $form_state['rules_element'];
+  $action->execute();
+  drupal_set_message(t('Component %label has been executed.', array('%label' => $action->label())));
+}
+
+/**
  * Gets the confirmation question for valid operations, or else FALSE.
  */
 function rules_ui_confirm_operations($op, $rules_config) {
