diff --git a/messaging.rules.inc b/messaging.rules.inc
new file mode 100644
index 0000000..5924b7a
--- /dev/null
+++ b/messaging.rules.inc
@@ -0,0 +1,279 @@
+<?php
+
+
+/**
+ * Implementation of hook_rules_action_info().
+ * @ingroup rules
+ */
+function messaging_rules_action_info() {
+  return array(
+    'messaging_action_send_user_message' => array(
+      'label' => t('Send a message to a user'),
+      'arguments' => array(
+        'user' => array('type' => 'user', 'label' => t('Recipient')),
+        'sender' => array('type' => 'user', 'label' => t('Sender')),
+      ),
+      'module' => 'Messaging',
+      'help' => t('The message will be sent using the Messaging Framework. The format of the message, subject and sender might vary depending on the sending method that you choose.'),
+      'eval input' => array('subject', 'message', 'from'),
+    ),
+    'messaging_action_send_message' => array(
+      'label' => t('Send a message to an arbitrary recipient'),
+      'arguments' => array(
+        'sender' => array('type' => 'user', 'label' => t('Sender')),
+      ),
+      'module' => 'Messaging',
+      'eval input' => array('subject', 'message', 'from', 'to'),
+      'help' => t('The message will be sent using the Messaging Framework. The format of the message, subject, sender and recipient might vary depending on the sending method that you choose.'),
+    ),
+    'messaging_action_mail_to_users_of_role' => array(
+      'label' => t('Send a message to all users of a role'),
+      'arguments' => array(
+        'sender' => array('type' => 'user', 'label' => t('Sender')),
+      ),
+      'module' => 'Messaging',
+      'eval input' => array('subject', 'message', 'from', 'to'),
+    ),
+  );
+}
+
+/**
+ * Action Implementation: messaging_action_send_user_message
+ * Sends a message to a user.
+ */
+function messaging_action_send_user_message($user, $sender, $settings) {
+  $message = array(
+    'subject' => $settings['subject'],
+    'body' => $settings['message'],
+  );
+  if (!$settings['system_sender']) {
+    $message['sender'] = $sender->uid;
+  }
+
+  if ($settings['method'] == '#user_preferred') {
+    $method = NULL;
+  }
+  else {
+    $method_info = messaging_method_info($settings['method']);
+    if (!$method_info) {
+      watchdog('rules', 'Sending method "%method" not installed.', array('%method' => $settings['method']), WATCHDOG_ALERT);
+      return;
+    }
+    $method = $settings['method'];
+    $message['type'] = $method_info['type'];
+  }
+
+  $success = messaging_message_send_user($user, $message, $method);
+  if ($success) {
+    watchdog('rules', 'Successfully sent message to %recipient using method "%method"', array('%recipient' => $user->name, '%method' => $settings['method']));
+  }
+}
+
+/**
+ * Action Implementation: messaging_action_send_message
+ * Sends a message to an arbitrary recipient.
+ */
+function messaging_action_send_message($sender, $settings) {
+  $to = str_replace(array("\r", "\n"), ',', $settings['to']);
+  $destinations = explode(',', $to);
+
+  $message = array(
+    'subject' => $settings['subject'],
+    'body' => $settings['message'],
+  );
+  if (!$settings['system_sender']) {
+    $message['sender'] = $sender->uid;
+  }
+
+  $method_info = messaging_method_info($settings['method']);
+  if (!$method_info) {
+    watchdog('rules', 'Sending method "%method" not installed.', array('%method' => $settings['method']), WATCHDOG_ALERT);
+    return;
+  }
+  $message['type'] = $method_info['type'];
+
+  $success = messaging_message_send($destinations, $message, $settings['method']);
+  if ($success) {
+    watchdog('rules', 'Successfully sent message to %recipient using method "%method"', array('%recipient' => $to, '%method' => $settings['method']));
+  }
+}
+
+/**
+ * Action Implementation: messaging_action_mail_to_users_of_role
+ * Sends a message to all users of a role.
+ */
+function messaging_action_mail_to_users_of_role($sender, $settings) {
+  $recipients = $settings['to'];
+
+  if (in_array(DRUPAL_AUTHENTICATED_RID, $recipients)) {
+    $result = db_query('SELECT mail FROM {users} WHERE uid > 0');
+  }
+  else {
+    $rids = implode(',', $recipients);
+    $result = db_query('SELECT DISTINCT u.uid FROM {users} u INNER JOIN {users_roles} r ON u.uid = r.uid WHERE r.rid IN ('. $rids .')');
+  }
+
+  $message = array(
+    'subject' => $settings['subject'],
+    'body' => $settings['message'],
+  );
+  if (!$settings['system_sender']) {
+    $message['sender'] = $sender->uid;
+  }
+
+  if ($settings['method'] == '#user_preferred') {
+    $method = NULL;
+  }
+  else {
+    $method_info = messaging_method_info($settings['method']);
+    if (!$method_info) {
+      watchdog('rules', 'Sending method "%method" not installed.', array('%method' => $settings['method']), WATCHDOG_ALERT);
+      return;
+    }
+    $method = $settings['method'];
+    $message['type'] = $method_info['type'];
+  }
+
+  $success = TRUE;
+  while (($user = db_fetch_object($result)) && $success) {
+    $success = messaging_message_send_user($user, $message, $method, $settings['queue']);
+  }
+  if ($success) {
+    $roles = array_intersect_key(user_roles(TRUE), drupal_map_assoc($recipients));
+    watchdog('rules', 'Successfully sent email to the role(s) %roles using method "%method"', array('%roles' => implode(', ', $roles), '%method' => $settings['method']));
+  }
+}
+
+/**
+ * Message to user action configuration form.
+ */
+function messaging_action_send_user_message_form($settings, &$form) {
+  $form['settings']['method'] = array(
+    '#type' => 'select',
+    '#title' => t('Method'),
+    '#options' => array('#user_preferred' => t('- User preferred method -')) + messaging_method_list(),
+    '#default_value' => $settings['method'],
+    '#description' => t('The sending method that should be used.'),
+    '#required' => TRUE,
+    '#weight' => -2,
+  );
+  $form['settings']['system_sender'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Use system as sender instead of argument'),
+    '#default_value' => $settings['system_sender'],
+    '#description' => t('If checked, the Sender argument will be ignored.'),
+  );
+  $form['settings']['subject'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Subject'),
+    '#default_value' => $settings['subject'],
+    '#description' => t("The message subject."),
+  );
+  $form['settings']['message'] = array(
+    '#type' => 'textarea',
+    '#title' => t('Message'),
+    '#default_value' => $settings['message'],
+    '#description' => t("The message body."),
+  );
+}
+
+/**
+ * Action "Send a message to an arbitrary recipient" configuration form
+ */
+function messaging_action_send_message_form($settings = array(), &$form) {
+  $form['settings']['to'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Recipient'),
+    '#default_value' => isset($settings['to']) ? $settings['to'] : '',
+    '#description' => t("The message recipient identifiers (user names, email, phone numbers, etc). You may separate multiple recipients with ','."),
+    '#required' => TRUE,
+    '#weight' => -1,
+  );
+  $form['settings']['method'] = array(
+    '#type' => 'select',
+    '#title' => t('Method'),
+    '#options' => messaging_method_list(),
+    '#default_value' => $settings['method'],
+    '#description' => t('The sending method that should be used.'),
+    '#required' => TRUE,
+    '#weight' => -2,
+  );
+  $form['settings']['system_sender'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Use system as sender instead of argument'),
+    '#default_value' => $settings['system_sender'],
+    '#description' => t('If checked, the Sender argument will be ignored.'),
+  );
+  $form['settings']['subject'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Subject'),
+    '#default_value' => $settings['subject'],
+    '#description' => t("The message subject."),
+  );
+  $form['settings']['message'] = array(
+    '#type' => 'textarea',
+    '#title' => t('Message'),
+    '#default_value' => $settings['message'],
+    '#description' => t("The message body."),
+  );
+}
+
+/**
+ * Action "Send a message to all users of a role" configuration form
+ */
+function messaging_action_mail_to_users_of_role_form($settings, &$form) {
+  // Select only non-anonymous user roles because anonymous users won't have emails.
+  $roles = array_map('filter_xss_admin', user_roles(TRUE));
+
+  $form['settings']['to'] = array(
+    '#type' => 'checkboxes',
+    '#title' => t('Recipient roles'),
+    '#required' => TRUE,
+    '#default_value' => isset($settings['to']) ? $settings['to'] : array(),
+    '#options' => $roles,
+    '#description' => t('Select the roles whose users should receive this message.'),
+    '#weight' => -3,
+  );
+  $form['settings']['method'] = array(
+    '#type' => 'select',
+    '#title' => t('Method'),
+    '#options' => array('#user_preferred' => t('- User preferred method -')) + messaging_method_list(),
+    '#default_value' => $settings['method'],
+    '#description' => t('The sending method that should be used.'),
+    '#required' => TRUE,
+    '#weight' => -2,
+  );
+  $form['settings']['queue'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Queue messages to be processed on cron'),
+    '#default_value' => isset($settings['queue']) ? $settings['queue'] : 0,
+    '#weight' => -1,
+  );
+  $form['settings']['system_sender'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Use system as sender instead of argument'),
+    '#default_value' => $settings['system_sender'],
+    '#description' => t('If checked, the Sender argument will be ignored.'),
+  );
+  $form['settings']['subject'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Subject'),
+    '#default_value' => $settings['subject'],
+    '#description' => t("The message subject."),
+  );
+  $form['settings']['message'] = array(
+    '#type' => 'textarea',
+    '#title' => t('Message'),
+    '#default_value' => $settings['message'],
+    '#description' => t("The message body."),
+  );
+}
+
+/**
+ * Label callback for action messaging_action_send_user_message
+ */
+function messaging_action_send_user_message_label($settings, $argument_labels) {
+  return $settings['method'] == '#user_preferred' ?
+    t('Send a message to the @user', array('@user' => $argument_labels['@user'])) :
+    t('Send a message to the @user using method "@method"', array('@user' => $argument_labels['@user'], '@method' => $settings['method']));
+}
