diff --git a/includes/rules.core.inc b/includes/rules.core.inc
index d66eddc..86d3daa 100644
--- a/includes/rules.core.inc
+++ b/includes/rules.core.inc
@@ -441,6 +441,7 @@ abstract class RulesPlugin extends RulesExtendable {
 
   /**
    * Gets the element map helper object, which helps mapping elements to ids.
+   *
    * @return RulesElementMap
    */
   public function elementMap() {
@@ -452,6 +453,15 @@ abstract class RulesPlugin extends RulesExtendable {
   }
 
   /**
+   * Do a deep clone.
+   */
+  public function __clone() {
+    // Make sure the element map is cleared.
+    // @see self::elementMap()
+    unset($this->map);
+  }
+
+  /**
    * Returns the depth of this element in the configuration.
    */
   public function depth() {
@@ -1960,6 +1970,7 @@ abstract class RulesContainerPlugin extends RulesPlugin implements IteratorAggre
    * By default we do a deep clone.
    */
   public function __clone() {
+    parent::__clone();
     foreach ($this->children as $key => $child) {
       $this->children[$key] = clone $child;
       $this->children[$key]->parent = $this;
diff --git a/rules_admin/rules_admin.inc b/rules_admin/rules_admin.inc
index f7afa9c..5a2ea4a 100644
--- a/rules_admin/rules_admin.inc
+++ b/rules_admin/rules_admin.inc
@@ -229,7 +229,7 @@ function rules_admin_add_reaction_rule($form, &$form_state, $base_path) {
 
   $form_state += array('rules_config' => $rules_config);
   $form['#validate'][] = 'rules_ui_edit_element_validate';
-  $form['#validate'][] = 'rules_ui_add_event_validate';
+  $form['#submit'][] = 'rules_ui_add_event_apply';
   $form['#submit'][] = 'rules_ui_edit_element_submit';
   return $form;
 }
diff --git a/ui/ui.core.inc b/ui/ui.core.inc
index a7b0829..09bb20c 100644
--- a/ui/ui.core.inc
+++ b/ui/ui.core.inc
@@ -352,12 +352,6 @@ class RulesPluginUI extends FacesExtender implements RulesPluginUIInterface {
     if (!user_access('bypass rules access') && !$this->element->root()->access()) {
       form_set_error('', t('Access violation! You have insufficient access permissions to edit this configuration.'));
     }
-    try {
-      $this->element->integrityCheck();
-    }
-    catch (RulesIntegrityException $e) {
-      form_set_error(implode('][', $e->keys), t('The integrity check failed with the following error message: "!message"', array('!message' => $e->getMessage())));
-    }
     if (!empty($form['settings'])) {
       $this->settingsFormValidate($form, $form_state);
     }
@@ -852,6 +846,17 @@ class RulesAbstractPluginUI extends RulesPluginUI {
       $this->element->negate($form_values['negate']);
     }
   }
+
+  public function form_validate($form, &$form_state) {
+    parent::form_validate($form, $form_state);
+    // Validate the edited element and throw validation errors if it fails.
+    try {
+      $this->element->integrityCheck();
+    }
+    catch (RulesIntegrityException $e) {
+      form_set_error(implode('][', $e->keys), $e->getMessage());
+    }
+  }
 }
 
 /**
diff --git a/ui/ui.forms.inc b/ui/ui.forms.inc
index 892b780..ffd4d6d 100644
--- a/ui/ui.forms.inc
+++ b/ui/ui.forms.inc
@@ -316,31 +316,41 @@ function rules_ui_add_element_submit($form, &$form_state) {
  */
 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, RulesPluginUI::path($rules_config->name), t('This action cannot be undone.'), t('Delete'), t('Cancel'));
-}
 
-/**
- * Rule config deletion form validation callback.
- */
-function rules_ui_delete_element_validate($form, &$form_state) {
-  // Save the parent for determining the right redirect target on submit.
-  $form_state['element_parent'] = $form_state['rules_element']->parentElement();
+  if (empty($form_state['rules_config'])) {
+    // Before modifying the rules config we have to clone it, so any
+    // modifications won't appear in the static cache of the loading controller.
+    $rules_config = clone $rules_config;
+    // Also get the element from the cloned config.
+    $rules_element = $rules_config->elementMap()->lookup($rules_element->elementId());
+
+    $form_state['rules_config'] = $rules_config;
+    $form_state['rules_element'] = $rules_element;
+    $form_state['element_parent'] = $rules_element->parentElement();
+  }
+
+  // Try deleting the element and warn the user if something breaks, but
+  // save the parent for determining the right redirect target on submit.
   $removed_plugin = $form_state['rules_element']->plugin();
-  $form_state['rules_element']->delete();
-  try {
-    $form_state['rules_config']->integrityCheck();
-  }
-  catch (RulesIntegrityException $e) {
-    $args = array(
-      '@plugin' => $e->element->plugin(),
-      '%label' => $e->element->label(),
-      '@removed-plugin' => $removed_plugin,
-      '!url' => url(RulesPluginUI::path($form_state['rules_config']->name, 'edit', $e->element)),
-    );
-    form_set_error('', t('Unable to delete the @removed-plugin as some of its provided variables are utilized by the @plugin <a href="!url">%label</a>.', $args));
+  $rules_element->delete();
+
+  if (empty($rules_config->dirty) && empty($form_state['input'])) {
+    try {
+      $rules_config->integrityCheck();
+    }
+    catch (RulesIntegrityException $e) {
+      $args = array(
+        '@plugin' => $e->element->plugin(),
+        '%label' => $e->element->label(),
+        '@removed-plugin' => $removed_plugin,
+        '!url' => url(RulesPluginUI::path($form_state['rules_config']->name, 'edit', $e->element)),
+      );
+      drupal_set_message(t('Deleting this @removed-plugin would break your configuration as some of its provided variables are utilized by the @plugin <a href="!url">%label</a>.', $args), 'warning');
+    }
   }
+
+  $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, RulesPluginUI::path($rules_config->name), t('This action cannot be undone.'), t('Delete'), t('Cancel'));
 }
 
 /**
@@ -392,7 +402,7 @@ function rules_ui_add_event($form, &$form_state, RulesReactionRule $rules_config
   $events = array_diff_key(rules_fetch_data('event_info'), array_flip($rules_config->events()));
 
   $form['help'] = array(
-    '#markup' => t('Select the event to add, however note that only events providing all utilized variables can be added.'),
+    '#markup' => t('Select the event to add. However note that all added events need to provide all variables that should be available to your rule.'),
   );
   $form['event'] = array(
     '#type' => 'select',
@@ -409,34 +419,36 @@ function rules_ui_add_event($form, &$form_state, RulesReactionRule $rules_config
 }
 
 /**
- * Validate the event configuration.
+ * Submit callback that just adds the selected event.
+ *
+ * @see rules_admin_add_reaction_rule()
  */
-function rules_ui_add_event_validate($form, &$form_state) {
-  if (!empty($form_state['values']['event'])) {
-    $rules_config = $form_state['rules_config'];
-    $rules_config->event($form_state['values']['event']);
-    try {
-      $rules_config->integrityCheck();
-    }
-    catch (RulesIntegrityException $e) {
-      $args = array(
-        '@plugin' => $e->element->plugin(),
-        '%label' => $e->element->label(),
-        '!url' => url(RulesPluginUI::path($form_state['rules_config']->name, 'edit', $e->element)),
-      );
-      form_set_error('', t('Unable to add this event as it does not provide all variables utilized by the @plugin <a href="!url">%label</a>.', $args));
-    }
-  }
+function rules_ui_add_event_apply($form, &$form_state) {
+  $form_state['rules_config']->event($form_state['values']['event']);
 }
 
 /**
  * Submit the event configuration.
  */
 function rules_ui_add_event_submit($form, &$form_state) {
-  if (!empty($form_state['values']['event'])) {
-    $rules_config = $form_state['rules_config'];
-    $rules_config->save();
-    drupal_set_message(t('Added event to rule %label', array('%label' => $rules_config->label())));
+  rules_ui_add_event_apply($form, $form_state);
+  $rules_config = $form_state['rules_config'];
+
+  // Tell the user if this breaks something, but let him proceed.
+  if (empty($rules_config->dirty)) {
+    try {
+      $rules_config->integrityCheck();
+    }
+    catch (RulesIntegrityException $e) {
+      $warning = TRUE;
+      drupal_set_message(t('Added the event, but it does not provide all variables utilized.'), 'warning');
+    }
+  }
+  $rules_config->save();
+  if (!isset($warning)) {
+    $events = rules_fetch_data('event_info');
+    $label = $events[$form_state['values']['event']]['label'];
+    drupal_set_message(t('Added event %event.', array('%event' => $label)));
   }
 }
 
@@ -447,40 +459,32 @@ function rules_ui_remove_event($form, &$form_state, $rules_config, $event, $base
   RulesPluginUI::$basePath = $base_path;
   $form_state += array('rules_config' => $rules_config, 'rules_event' => $event);
   $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'));
+  $form_state['event_label'] = $events[$event]['label'];
+  $confirm_question = t('Are you sure you want to remove the event?');
+  return confirm_form($form, $confirm_question, RulesPluginUI::path($rules_config->name), t('You are about to remove the event %event.', array('%event' => $form_state['event_label'])), t('Remove'), t('Cancel'));
 }
 
 /**
- * Validate the event configuration.
+ * Submit the event configuration.
  */
-function rules_ui_remove_event_validate($form, &$form_state) {
+function rules_ui_remove_event_submit($form, &$form_state) {
   $rules_config = $form_state['rules_config'];
   $rules_config->removeEvent($form_state['rules_event']);
-  try {
-    $rules_config->integrityCheck();
-  }
-  catch (RulesIntegrityException $e) {
-    $args = array(
-      '@plugin' => $e->element->plugin(),
-      '%label' => $e->element->label(),
-      '!url' => url(RulesPluginUI::path($form_state['rules_config']->name, 'edit', $e->element)),
-    );
-    form_set_error('', t('Unable to remove the event as some of its provided variables are utilized by the @plugin <a href="!url">%label</a>.', $args));
+  // Tell the user if this breaks something, but let him proceed.
+  if (empty($rules_config->dirty)) {
+    try {
+      $rules_config->integrityCheck();
+    }
+    catch (RulesIntegrityException $e) {
+      $warning = TRUE;
+      drupal_set_message(t('Removed the event, but it had provided some variables which are now missing.'), 'warning');
+    }
   }
-}
-
-/**
- * Submit the event configuration.
- */
-function rules_ui_remove_event_submit($form, &$form_state) {
-  if ($form_state['values']['confirm']) {
-    $rules_config = $form_state['rules_config'];
-    $rules_config->save();
-    $form_state['redirect'] = RulesPluginUI::path($rules_config->name);
-    drupal_set_message(t('Event %event was removed from %plugin %label', array('%event' => $form_state['rules_event'], '%label' => $rules_config->label(), '%plugin' => $rules_config->plugin())));
+  $rules_config->save();
+  if (!isset($warning)) {
+    drupal_set_message(t('Event %event has been removed.', array('%event' => $form_state['event_label'])));
   }
+  $form_state['redirect'] = RulesPluginUI::path($rules_config->name);
 }
 
 /**
