diff --git rules/includes/rules.plugins.inc rules/includes/rules.plugins.inc
index 15e2f23..4f30533 100644
--- rules/includes/rules.plugins.inc
+++ rules/includes/rules.plugins.inc
@@ -569,9 +569,7 @@ class RulesEventSet extends RulesRuleSet {
       if ($rules = rules_config_load_multiple(FALSE, array('event' => $name, 'active' => TRUE))) {
         $event = new RulesEventSet($info);
         $event->name = $name;
-        foreach ($rules as $rule) {
-          $event->rule($rule);
-        }
+        $event->optimize($rules);
         $event->setSkipSetup();
         cache_set('event_' . $name, $event, 'cache_rules');
         $event->destroy();
@@ -589,3 +587,23 @@ class RulesEventSet extends RulesRuleSet {
     return $this->availableVariables();
   }
 }
+
+/**
+ * Interface for optimized rules
+ */
+interface RulesOptimizationInterface {
+  /**
+   * Convert the input rules into a decision tree structure
+   *
+   * @param $rules
+   *   All the rules trigerrable by the RulesRuleSet or RulesEventSet
+   */
+  public function optimize($rules);
+}
+
+/**
+ * Class implementing optimization method
+ */
+class RulesOptimization extends FacesExtender implements RulesOptimizationInterface {
+  public function optimize($rules){}
+}
diff --git rules/rules.module rules/rules.module
index a2b9046..17a4812 100644
--- rules/rules.module
+++ rules/rules.module
@@ -381,6 +381,11 @@ function rules_rules_plugin_info() {
     'event set' => array(
       'class' => 'RulesEventSet',
       'embeddable' => FALSE,
+      'extenders' => array(
+        'RulesOptimizationInterface' => array(
+          'class' => 'RulesOptimization',
+        ),
+      ),
     ),
     'rule set' => array(
       'class' => 'RulesRuleSet',
