diff --git a/rules.module b/rules.module
index 3a460e4..fdaad3a 100644
--- a/rules.module
+++ b/rules.module
@@ -9,6 +9,19 @@
 require_once dirname(__FILE__) . '/modules/events.inc';
 
 /**
+ * Implements hook_menu_get_item_alter().
+ */
+function rules_menu_get_item_alter() {
+  // Make sure that event invocation is enabled before menu items are loaded.
+  // Example: modules that implement hook_entity_ENTITY_TYPE_load() might want
+  // to invoke Rules events in that load hook, which is also invoked for menu
+  // item loading. Since this can happen even before hook_init() we need to make
+  // sure that firing Rules events is enabled at that point. A typical use case
+  // for this is Drupal Commerce with commerce_cart_commerce_order_load().
+  rules_event_invocation_enabled(TRUE);
+}
+
+/**
  * Implements hook_init().
  */
 function rules_init() {
diff --git a/tests/rules.test b/tests/rules.test
index 20f1c9d..3b034e8 100644
--- a/tests/rules.test
+++ b/tests/rules.test
@@ -2099,3 +2099,50 @@ class RulesEventDispatcherTestCase extends DrupalWebTestCase {
     }
   }
 }
+
+/**
+ * Test early bootstrap Rules invocation.
+ */
+class RulesInvocationEnabledTestCase extends DrupalWebTestCase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function getInfo() {
+    return array(
+      'name' => 'Rules invocation enabled',
+      'description' => 'Tests that Rules events are enabled during menu item loads.',
+      'group' => 'Rules',
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setUp() {
+    parent::setUp('dblog', 'rules', 'rules_test', 'rules_test_invocation');
+  }
+
+  /**
+   * Tests that a Rules event is triggered on node menu item loading.
+   *
+   * @see rules_test_invocation_node_load()
+   */
+  public function testInvocationOnNodeMenuLoading() {
+    // Create a test node.
+    $node = $this->drupalCreateNode(array('title' => 'Test'));
+    // Enable Rules logging on the INFO level so that entries are written to
+    // dblog.
+    variable_set('rules_log_errors', RulesLog::INFO);
+    // Create an empty rule that will fire in our node load hook.
+    $rule = rules_reaction_rule();
+    $rule->event('rules_test_event');
+    $rule->save('test_rule');
+
+    // Visit the node page which should trigger the load hook.
+    $this->drupalGet('node/' . $node->nid);
+    $result = db_query("SELECT * FROM {watchdog} WHERE type = 'rules' AND message = 'Reacting on event %label.'")->fetch();
+    $this->assertFalse(empty($result), 'Rules event was triggered and logged.');
+  }
+
+}
diff --git a/tests/rules_test_invocation.info b/tests/rules_test_invocation.info
new file mode 100644
index 0000000..257d032
--- /dev/null
+++ b/tests/rules_test_invocation.info
@@ -0,0 +1,5 @@
+name = "Rules Test invocation"
+description = "Helper module to test Rules invocations."
+package = Testing
+core = 7.x
+hidden = TRUE
diff --git a/tests/rules_test_invocation.module b/tests/rules_test_invocation.module
new file mode 100644
index 0000000..5664c5e
--- /dev/null
+++ b/tests/rules_test_invocation.module
@@ -0,0 +1,13 @@
+<?php
+
+/**
+ * @file
+ * Helper module for Rules invocation testing.
+ */
+
+/**
+ * Implements hook_node_load().
+ */
+function rules_test_invocation_node_load($nodes, $types) {
+  rules_invoke_event('rules_test_event');
+}
