diff --git rules/includes/rules.core.inc rules/includes/rules.core.inc
index 3daec4e..34fda9c 100644
--- rules/includes/rules.core.inc
+++ rules/includes/rules.core.inc
@@ -1306,6 +1306,16 @@ interface RulesPluginImplInterface {
 }
 
 /**
+ * Interface to allow third party modules to optimize rules evaluation.
+ */
+interface RulesOptimizationInterface {
+  /**
+   * Rearranges the internal structure of rules to optimize evaluation.
+   */
+  public function optimize();
+}
+
+/**
  * Class providing default implementations of the methods of the RulesPluginImplInterface.
  *
  * If a plugin implementation does not provide a function for a method, the
diff --git rules/includes/rules.plugins.inc rules/includes/rules.plugins.inc
index c983249..735925c 100644
--- rules/includes/rules.plugins.inc
+++ rules/includes/rules.plugins.inc
@@ -551,6 +551,7 @@ class RulesEventSet extends RulesRuleSet {
         foreach ($rules as $rule) {
           $event->rule($rule);
         }
+        $event->__call('optimize');
         $event->setSkipSetup(TRUE);
         // Allow modules to alter the cached event set.
         drupal_alter('rules_event_set', $name, $event);
@@ -570,3 +571,13 @@ class RulesEventSet extends RulesRuleSet {
     return $this->availableVariables();
   }
 }
+
+/**
+ * Class implementing the default optimization method.
+ */
+class RulesDefaultOptimizer extends FacesExtender implements RulesOptimizationInterface {
+  /**
+   * Default implementation which does nothing.
+   */
+  public function optimize() {}
+}
diff --git rules/rules.module rules/rules.module
index d88e7dd..801de71 100644
--- rules/rules.module
+++ rules/rules.module
@@ -384,6 +384,11 @@ function rules_rules_plugin_info() {
     'event set' => array(
       'class' => 'RulesEventSet',
       'embeddable' => FALSE,
+      'extenders' => array(
+        'RulesOptimizationInterface' => array(
+          'class' => 'RulesDefaultOptimizer',
+        ),
+      ),
     ),
     'rule set' => array(
       'class' => 'RulesRuleSet',
