Index: workflow.rules_forms.inc
===================================================================
--- workflow.rules_forms.inc	(revision 0)
+++ workflow.rules_forms.inc	(revision 0)
@@ -0,0 +1,56 @@
+<?php
+// $Id$
+
+/**
+ * @file
+ * Contains configuration forms for workflow rules integration.
+ */
+
+/**
+ * Configuration form for check transition condition.
+ */
+function workflow_check_transition_form($settings, &$form) {
+  $options = array();
+  $options['ANY'] = t('Any state');
+  foreach(workflow_get_all() as $wid => $workflow) {
+    $options[$workflow] = array();
+    foreach (workflow_get_states($wid) as $sid => $state) {
+      $options[$workflow][$sid] = $state;
+    }
+  }
+  $form['settings']['from_state'] = array(
+    '#type' => 'select',
+    '#title' => t('From State'),
+    '#options' => $options,
+    '#default_value' => isset($settings['from_state']) ? $settings['from_state'] : array(),
+    '#required' => TRUE,
+  );
+  $form['settings']['to_state'] = array(
+    '#type' => 'select',
+    '#title' => t('To State'),
+    '#options' => $options,
+    '#default_value' => isset($settings['to_state']) ? $settings['to_state'] : array(),
+    '#required' => TRUE,
+  );
+}
+
+/**
+ * Label callback for check transition condition.
+ */
+function workflow_check_transition_label($settings, $argument_labels) {
+  if ($settings['from_state'] === 'ANY') {
+    $from = t('Any state');
+  }
+  else {
+    $from = workflow_get_state($settings['from_state']);
+    $from = $from['state'];
+  }
+  if ($settings['to_state'] === 'ANY') {
+    $to = t('Any state');
+  }
+  else {
+    $to = workflow_get_state($settings['to_state']);
+    $to = $to['state'];
+  }
+  return t('Check workflow transition from @from to @to', array('@from' => $from, '@to' => $to));
+}
\ No newline at end of file
Index: workflow.rules.inc
===================================================================
--- workflow.rules.inc	(revision 0)
+++ workflow.rules.inc	(revision 0)
@@ -0,0 +1,98 @@
+<?php
+// $Id$
+
+/**
+ * @file
+ * Rules integration for the Workflow module
+ */
+
+/**
+ * Implementation of hook_rules_event_info().
+ */
+function workflow_rules_event_info() {
+  $events = array(
+    'workflow_state_changed' => array(
+      'label' => t('Workflow state has changed'),
+      'module' => 'Workflow',
+      'arguments' =>  workflow_events_workflow_arguments(),
+    ),
+    'workflow_comment_added' => array(
+      'label' => t('Workflow comment was added'),
+      'module' => 'Workflow',
+      'arguments' =>  workflow_events_workflow_arguments(),
+      'description' => t('New workflow comment was added, but the workflow state did not change.'),
+    ),
+  );
+  return $events;
+}
+
+/**
+ * Returns arguments for a workflow event.
+ */
+function workflow_events_workflow_arguments() {
+  return array(
+    'node' => array('type' => 'node', 'label' => t('Updated content')),
+    'old_state' => array('type' => 'workflow_state', 'label' => t('Old workflow state')),
+    'new_state' => array('type' => 'workflow_state', 'label' => t('New workflow state')),
+    'author' => array('type' => 'user', 'label' => t('Content author'), 'handler' => 'rules_events_argument_node_author'),
+  ) + rules_events_global_user_argument();
+}
+
+/**
+ * Implementation of hook_condition_info().
+ */
+function workflow_rules_condition_info() {
+  return array(
+    'workflow_check_transition' => array(
+      'label' => t('Check workflow transition'),
+      'arguments' => array(
+        'old_state' => array('type' => 'workflow_state', 'label' => t('Old workflow state')),
+        'new_state' => array('type' => 'workflow_state', 'label' => t('New workflow state')),
+      ),
+      'help' => t('Evaluates to TRUE, if the workflow being updated is moved from state A to state B'),
+      'module' => 'Workflow',
+    ),
+  );
+}
+
+/**
+ * Condition implementation: check state transition. 
+ */
+function workflow_check_transition($old_state, $new_state, $settings) {
+  if ($settings['from_state'] === 'ANY') {
+    if ($settings['to_state'] === 'ANY') {
+      return TRUE;
+    }
+    return $new_state === $settings['to_state'];
+  }
+  if ($settings['to_state'] === 'ANY') {
+    return $old_state === $settings['from_state'];
+  }
+  return $old_state === $settings['from_state'] && $new_state === $settings['to_state'];
+}
+
+/**
+ * Implementation of hook_rules_action_info_alter().
+ */
+function workflow_rules_action_info_alter(&$actions) {
+  $actions['rules_core_workflow_select_next_state_action']['module'] = 'Workflow';
+  $actions['rules_core_workflow_select_given_state_action']['module'] = 'Workflow';
+}
+
+/**
+ * Implementation of hook_rules_data_type_info().
+ */
+function workflow_rules_data_type_info() {
+  return array(
+    'workflow_state' => array(
+      'label' => t('Workflow state'),
+      'class' => 'rules_data_type',
+      'savable' => FALSE,
+      'identifiable' => TRUE,
+      'uses_input_form' => FALSE,
+      'token type' => FALSE, 
+      'module' => 'Workflow',
+    ),
+  );
+}
+
Index: workflow.module
===================================================================
--- workflow.module	(revision 3041)
+++ workflow.module	(working copy)
@@ -501,6 +501,10 @@ function workflow_execute_transition($node, $sid,
       $result = module_invoke_all('workflow', 'transition pre', $old_sid, $sid, $node);
       _workflow_write_history($node, $sid, $comment);
       $result = module_invoke_all('workflow', 'transition post', $old_sid, $sid, $node);
+      // Rules integration
+      if (module_exists('rules')) {
+        rules_invoke_event('workflow_comment_added', $node, $old_sid, $sid);
+      }
       // Comment has been written, so unset it.
       unset($node->workflow_comment);
     }
@@ -552,6 +556,11 @@ function workflow_execute_transition($node, $sid,
 
   // Clear any references in the scheduled listing.
   db_query('DELETE FROM {workflow_scheduled_transition} WHERE nid = %d', $node->nid);
+  
+  // Rules integration
+  if (module_exists('rules')) {
+    rules_invoke_event('workflow_state_changed', $node, $old_sid, $sid);
+  }
 }
 
 /**
