diff --git a/scheduler.info b/scheduler.info
index bd69f1a..120e0bf 100644
--- a/scheduler.info
+++ b/scheduler.info
@@ -8,4 +8,8 @@ files[] = scheduler.test
 files[] = scheduler.views.inc
 files[] = scheduler_handler_field_scheduler_countdown.inc
 files[] = tests/scheduler_api.test
+files[] = tests/scheduler_rules.test
+files[] = tests/scheduler_web_test_case.test
 test_dependencies[] = date
+test_dependencies[] = entity
+test_dependencies[] = rules
diff --git a/tests/scheduler_api.test b/tests/scheduler_api.test
index d6bb275..0212c82 100644
--- a/tests/scheduler_api.test
+++ b/tests/scheduler_api.test
@@ -5,14 +5,7 @@
  * Tests for the Scheduler API.
  */
 
-class SchedulerApiTestCase extends DrupalWebTestCase {
-
-  /**
-   * The profile to install as a basis for testing.
-   *
-   * @var string
-   */
-  protected $profile = 'testing';
+class SchedulerApiTestCase extends SchedulerWebTestCase {
 
   /**
    * {@inheritdoc}
@@ -26,17 +19,6 @@ class SchedulerApiTestCase extends DrupalWebTestCase {
   }
 
   /**
-   * {@inheritdoc}
-   */
-  function setUp() {
-    parent::setUp('scheduler', 'scheduler_test');
-
-    // Add scheduler functionality to the 'scheduler_test' node type.
-    variable_set('scheduler_publish_enable_scheduler_test', 1);
-    variable_set('scheduler_unpublish_enable_scheduler_test', 1);
-  }
-
-  /**
    * Tests hook_scheduler_allow().
    *
    * This hook can allow or deny the (un)publication of individual nodes. This
@@ -99,57 +81,4 @@ class SchedulerApiTestCase extends DrupalWebTestCase {
     node_save($node);
   }
 
-  /**
-   * Check to see if a node is not published.
-   *
-   * @param $nid
-   *   The nid of the node to check.
-   * @param $message
-   *   The message to display along with the assertion.
-   * @param $group
-   *   The type of assertion - examples are "Browser", "PHP".
-   *
-   * @return
-   *   TRUE if the assertion succeeded, FALSE otherwise.
-   */
-  public function assertNodeNotPublished($nid, $message = NULL, $group = 'Other') {
-    $message = $message ? $message : format_string('Node %nid is not published', array('%nid' => $nid));
-    return $this->assertFalse($this->getPublicationStatus($nid), $message, $group);
-  }
-
-  /**
-   * Check to see if a node is published.
-   *
-   * @param $nid
-   *   The nid of the node to check.
-   * @param $message
-   *   The message to display along with the assertion.
-   * @param $group
-   *   The type of assertion - examples are "Browser", "PHP".
-   *
-   * @return
-   *   TRUE if the assertion succeeded, FALSE otherwise.
-   */
-  public function assertNodePublished($nid, $message = NULL, $group = 'Other') {
-    $message = $message ? $message : format_string('Node %nid is published', array('%nid' => $nid));
-    return $this->assertTrue($this->getPublicationStatus($nid), $message, $group);
-  }
-
-  /**
-   * Returns the publication status of a node.
-   *
-   * @param int $nid
-   *   The nid of the node for which the publication status is desired.
-   *
-   * @return bool
-   *   TRUE if the node is published, FALSE otherwise.
-   */
-  protected function getPublicationStatus($nid) {
-    return db_select('node', 'n')
-      ->fields('n', array('status'))
-      ->condition('n.nid', $nid)
-      ->execute()
-      ->fetchColumn();
-  }
-
 }
diff --git a/tests/scheduler_rules.test b/tests/scheduler_rules.test
new file mode 100644
index 0000000..13a0591
--- /dev/null
+++ b/tests/scheduler_rules.test
@@ -0,0 +1,40 @@
+<?php
+
+/**
+ * @file
+ * Tests for the integration between Scheduler and the Rules module.
+ */
+
+class SchedulerRulesTestCase extends SchedulerWebTestCase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function getInfo() {
+    return array(
+      'name' => 'Rules integration',
+      'description' => 'Tests the integration with the Rules module.',
+      'group' => 'Scheduler',
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  function setUp() {
+    parent::setUp(array('scheduler', 'scheduler_test', 'rules'));
+  }
+
+  /**
+   * Tests Rules actions.
+   */
+  function testActions() {
+    // Load the rules for testing actions.
+    $rule_remove_publishing = rules_config_load('rules_scheduler_test_action_remove_publishing_date');
+    $rule_remove_unpublishing = rules_config_load('rules_scheduler_test_action_remove_unpublishing_date');
+    $rule_set_publishing = rules_config_load('rules_scheduler_test_action_set_publishing_date');
+    $rule_set_unpublishing = rules_config_load('rules_scheduler_test_action_set_unpublishing_date');
+    debug($rule_set_publishing);
+  }
+
+}
diff --git a/tests/scheduler_test.info b/tests/scheduler_test.info
index 7601353..4296ebe 100644
--- a/tests/scheduler_test.info
+++ b/tests/scheduler_test.info
@@ -3,5 +3,9 @@ description = "Support module for Scheduler related testing."
 package = Testing
 core = 7.x
 hidden = TRUE
+
+dependencies[] = entity
 dependencies[] = list
 dependencies[] = options
+dependencies[] = rules
+dependencies[] = scheduler
diff --git a/tests/scheduler_test.rules_defaults.inc b/tests/scheduler_test.rules_defaults.inc
new file mode 100644
index 0000000..2e1db82
--- /dev/null
+++ b/tests/scheduler_test.rules_defaults.inc
@@ -0,0 +1,197 @@
+<?php
+/**
+ * @file
+ * scheduler_test.rules_defaults.inc
+ */
+
+/**
+ * Implements hook_default_rules_configuration().
+ */
+function scheduler_test_default_rules_configuration() {
+  $items = array();
+  $items['rules_scheduler_test_action_remove_publishing_date'] = entity_import('rules_config', '{ "rules_scheduler_test_action_remove_publishing_date" : {
+      "LABEL" : "Test for action \\u0022Remove publishing date\\u0022",
+      "PLUGIN" : "reaction rule",
+      "ACTIVE" : false,
+      "OWNER" : "rules",
+      "REQUIRES" : [ "scheduler", "rules" ],
+      "ON" : { "node_update" : [] },
+      "DO" : [ { "scheduler_remove_publish_date_action" : { "node" : [ "node" ] } } ]
+    }
+  }');
+  $items['rules_scheduler_test_action_remove_unpublishing_date'] = entity_import('rules_config', '{ "rules_scheduler_test_action_remove_unpublishing_date" : {
+      "LABEL" : "Test for action \\u0022Remove unpublishing date\\u0022",
+      "PLUGIN" : "reaction rule",
+      "ACTIVE" : false,
+      "OWNER" : "rules",
+      "REQUIRES" : [ "scheduler", "rules" ],
+      "ON" : { "node_update" : [] },
+      "DO" : [ { "scheduler_remove_unpublish_date_action" : { "node" : [ "node" ] } } ]
+    }
+  }');
+  $items['rules_scheduler_test_action_set_publishing_date'] = entity_import('rules_config', '{ "rules_scheduler_test_action_set_publishing_date" : {
+      "LABEL" : "Test for action \\u0022Set publishing date\\u0022",
+      "PLUGIN" : "reaction rule",
+      "ACTIVE" : false,
+      "OWNER" : "rules",
+      "REQUIRES" : [ "rules", "scheduler" ],
+      "ON" : { "node_insert" : [] },
+      "DO" : [
+        { "scheduler_set_publish_date_action" : { "node" : [ "node" ], "date" : "+1 day" } }
+      ]
+    }
+  }');
+  $items['rules_scheduler_test_action_set_unpublishing_date'] = entity_import('rules_config', '{ "rules_scheduler_test_action_set_unpublishing_date" : {
+      "LABEL" : "Test for action \\u0022Set unpublishing date\\u0022",
+      "PLUGIN" : "reaction rule",
+      "ACTIVE" : false,
+      "OWNER" : "rules",
+      "REQUIRES" : [ "rules", "scheduler" ],
+      "ON" : { "node_insert" : [] },
+      "DO" : [
+        { "scheduler_set_unpublish_date_action" : { "node" : [ "node" ], "date" : "+2 day" } }
+      ]
+    }
+  }');
+  $items['rules_scheduler_test_condition_scheduled_for_publishing'] = entity_import('rules_config', '{ "rules_scheduler_test_condition_scheduled_for_publishing" : {
+      "LABEL" : "Test for condition \\u0022The node is scheduled for publishing\\u0022",
+      "PLUGIN" : "reaction rule",
+      "ACTIVE" : false,
+      "OWNER" : "rules",
+      "REQUIRES" : [ "scheduler", "rules" ],
+      "ON" : { "node_update" : [] },
+      "IF" : [
+        { "scheduler_condition_node_is_scheduled_for_publishing" : { "node" : [ "node" ] } }
+      ],
+      "DO" : [
+        { "drupal_message" : {
+            "message" : "Node [node:nid] is scheduled for publishing.",
+            "repeat" : 0
+          }
+        }
+      ]
+    }
+  }');
+  $items['rules_scheduler_test_condition_scheduled_for_unpublishing'] = entity_import('rules_config', '{ "rules_scheduler_test_condition_scheduled_for_unpublishing" : {
+      "LABEL" : "Test for condition \\u0022The node is scheduled for unpublishing\\u0022",
+      "PLUGIN" : "reaction rule",
+      "ACTIVE" : false,
+      "OWNER" : "rules",
+      "REQUIRES" : [ "scheduler", "rules" ],
+      "ON" : { "node_update" : [] },
+      "IF" : [
+        { "scheduler_condition_node_is_scheduled_for_unpublishing" : { "node" : [ "node" ] } }
+      ],
+      "DO" : [
+        { "drupal_message" : {
+            "message" : "Node [node:nid] is scheduled for unpublishing.",
+            "repeat" : 0
+          }
+        }
+      ]
+    }
+  }');
+  $items['rules_scheduler_test_condition_scheduled_publishing_enabled'] = entity_import('rules_config', '{ "rules_scheduler_test_condition_scheduled_publishing_enabled" : {
+      "LABEL" : "Test for condition \\u0022Scheduled publishing is enabled for this content type\\u0022",
+      "PLUGIN" : "reaction rule",
+      "ACTIVE" : false,
+      "OWNER" : "rules",
+      "REQUIRES" : [ "scheduler", "rules" ],
+      "ON" : { "node_update" : [] },
+      "IF" : [
+        { "scheduler_condition_publishing_is_enabled" : { "node" : [ "node" ] } }
+      ],
+      "DO" : [
+        { "drupal_message" : {
+            "message" : "Scheduled publishing is enabled for this content type.",
+            "repeat" : 0
+          }
+        }
+      ]
+    }
+  }');
+  $items['rules_scheduler_test_condition_scheduled_unpublishing_enabled'] = entity_import('rules_config', '{ "rules_scheduler_test_condition_scheduled_unpublishing_enabled" : {
+      "LABEL" : "Test for condition \\u0022Scheduled unpublishing is enabled for this content type\\u0022",
+      "PLUGIN" : "reaction rule",
+      "ACTIVE" : false,
+      "OWNER" : "rules",
+      "REQUIRES" : [ "scheduler", "rules" ],
+      "ON" : { "node_update" : [] },
+      "IF" : [
+        { "scheduler_condition_unpublishing_is_enabled" : { "node" : [ "node" ] } }
+      ],
+      "DO" : [
+        { "drupal_message" : {
+            "message" : "Scheduled unpublishing is enabled for this content type.",
+            "repeat" : 0
+          }
+        }
+      ]
+    }
+  }');
+  $items['rules_scheduler_test_event_after_scheduled_publishing'] = entity_import('rules_config', '{ "rules_scheduler_test_event_after_scheduled_publishing" : {
+      "LABEL" : "Test for event \\u0022After a node has been published by Scheduler\\u0022",
+      "PLUGIN" : "reaction rule",
+      "ACTIVE" : false,
+      "OWNER" : "rules",
+      "REQUIRES" : [ "rules", "scheduler" ],
+      "ON" : { "scheduler_node_has_been_published_event" : [] },
+      "DO" : [
+        { "drupal_message" : {
+            "message" : "Node [node:nid] has been published by Scheduler.",
+            "repeat" : 0
+          }
+        }
+      ]
+    }
+  }');
+  $items['rules_scheduler_test_event_after_scheduled_unpublishing'] = entity_import('rules_config', '{ "rules_scheduler_test_event_after_scheduled_unpublishing" : {
+      "LABEL" : "Test for event \\u0022After a node has been unpublished by Scheduler\\u0022",
+      "PLUGIN" : "reaction rule",
+      "ACTIVE" : false,
+      "OWNER" : "rules",
+      "REQUIRES" : [ "rules", "scheduler" ],
+      "ON" : { "scheduler_node_has_been_unpublished_event" : [] },
+      "DO" : [
+        { "drupal_message" : {
+            "message" : "Node [node:nid] has been unpublished by Scheduler.",
+            "repeat" : 0
+          }
+        }
+      ]
+    }
+  }');
+  $items['rules_scheduler_test_event_save_scheduled_publish'] = entity_import('rules_config', '{ "rules_scheduler_test_event_save_scheduled_publish" : {
+      "LABEL" : "Test for event \\u0022On saving a node that is scheduled for publishing\\u0022",
+      "PLUGIN" : "reaction rule",
+      "ACTIVE" : false,
+      "OWNER" : "rules",
+      "REQUIRES" : [ "rules", "scheduler" ],
+      "ON" : { "scheduler_node_is_scheduled_for_publishing_event" : [] },
+      "DO" : [
+        { "drupal_message" : {
+            "message" : "Node [node:nid] that is scheduled for publishing has been saved.",
+            "repeat" : 0
+          }
+        }
+      ]
+    }
+  }');
+  $items['rules_scheduler_test_event_save_scheduled_unpublish'] = entity_import('rules_config', '{ "rules_scheduler_test_event_save_scheduled_unpublish" : {
+      "LABEL" : "Test for event \\u0022On saving a node that is scheduled for unpublishing\\u0022",
+      "PLUGIN" : "reaction rule",
+      "ACTIVE" : false,
+      "OWNER" : "rules",
+      "REQUIRES" : [ "rules", "scheduler" ],
+      "ON" : { "scheduler_node_is_scheduled_for_unpublishing_event" : [] },
+      "DO" : [
+        { "drupal_message" : {
+            "message" : "Node [node:nid] that is scheduled for unpublishing has been saved.",
+            "repeat" : 0
+          }
+        }
+      ]
+    }
+  }');
+  return $items;
+}
diff --git a/tests/scheduler_web_test_case.test b/tests/scheduler_web_test_case.test
new file mode 100644
index 0000000..67cc1b0
--- /dev/null
+++ b/tests/scheduler_web_test_case.test
@@ -0,0 +1,86 @@
+<?php
+
+/**
+ * @file
+ * Base class for Scheduler automated tests.
+ */
+
+class SchedulerWebTestCase extends DrupalWebTestCase {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected $profile = 'testing';
+
+  /**
+   * {@inheritdoc}
+   */
+  function setUp() {
+    // Allow tests to pass in a list of modules to enable. If not, default to
+    // the test module and Scheduler itself.
+    $modules = func_get_args();
+    if (isset($modules[0]) && is_array($modules[0])) {
+      $modules = $modules[0];
+    }
+    $modules = !empty($modules) ? $modules : array('scheduler', 'scheduler_test'); 
+    parent::setUp($modules);
+
+    // Add scheduler functionality to the 'scheduler_test' node type.
+    variable_set('scheduler_publish_enable_scheduler_test', 1);
+    variable_set('scheduler_unpublish_enable_scheduler_test', 1);
+  }
+
+  /**
+   * Check to see if a node is not published.
+   *
+   * @param $nid
+   *   The nid of the node to check.
+   * @param $message
+   *   The message to display along with the assertion.
+   * @param $group
+   *   The type of assertion - examples are "Browser", "PHP".
+   *
+   * @return
+   *   TRUE if the assertion succeeded, FALSE otherwise.
+   */
+  public function assertNodeNotPublished($nid, $message = NULL, $group = 'Other') {
+    $message = $message ? $message : format_string('Node %nid is not published', array('%nid' => $nid));
+    return $this->assertFalse($this->getPublicationStatus($nid), $message, $group);
+  }
+
+  /**
+   * Check to see if a node is published.
+   *
+   * @param $nid
+   *   The nid of the node to check.
+   * @param $message
+   *   The message to display along with the assertion.
+   * @param $group
+   *   The type of assertion - examples are "Browser", "PHP".
+   *
+   * @return
+   *   TRUE if the assertion succeeded, FALSE otherwise.
+   */
+  public function assertNodePublished($nid, $message = NULL, $group = 'Other') {
+    $message = $message ? $message : format_string('Node %nid is published', array('%nid' => $nid));
+    return $this->assertTrue($this->getPublicationStatus($nid), $message, $group);
+  }
+
+  /**
+   * Returns the publication status of a node.
+   *
+   * @param int $nid
+   *   The nid of the node for which the publication status is desired.
+   *
+   * @return bool
+   *   TRUE if the node is published, FALSE otherwise.
+   */
+  protected function getPublicationStatus($nid) {
+    return db_select('node', 'n')
+      ->fields('n', array('status'))
+      ->condition('n.nid', $nid)
+      ->execute()
+      ->fetchColumn();
+  }
+
+}
