diff --git a/rules/modules/taxonomy.rules.inc b/rules/modules/taxonomy.rules.inc
index 7a191d2..a512ab9 100644
--- a/rules/modules/taxonomy.rules.inc
+++ b/rules/modules/taxonomy.rules.inc
@@ -10,6 +10,22 @@
  */
 
 /**
+ * Implements hook_rules_condition_info().
+ */
+function taxonomy_rules_condition_info() {
+  return array(
+    'rules_condition_node_has_term' => array(
+      'label' => t('A node has specific term(s).'),
+      'arguments' => array(
+        'node' => array('type' => 'node', 'description' => t('The node to check')),
+      ),
+      'eval input' => array('taxonomy_node_terms_are', 'taxonomy_node_vocabularies'),
+      'module' => t('Taxonomy'),
+    ),
+  );
+}
+
+/**
  * Implementation of hook_rules_event_info().
  */
 function taxonomy_rules_event_info() {
@@ -249,6 +265,32 @@ function taxonomy_rules_data_type_info() {
 }
 
 /**
+ * Condition: Check if a term is present in the node taxonomy.
+ */
+function rules_condition_node_has_term(&$node, $settings, $element) {
+  if (count($node->taxonomy) > 0) {
+    $match = FALSE;
+    foreach($settings['taxonomy_node_terms_are'] as $term) {
+      foreach($node->taxonomy as $tax_vid => $tax_tid) {
+        if ($tax_tid == $term) {
+          $match = TRUE;
+        }
+        else {
+          $match = FALSE;
+        }
+      }
+      if (!$match) {
+        return FALSE;
+      }
+    }
+    return $match;
+  }
+  else {
+    return FALSE;
+  }
+}
+
+/**
  * Defines the taxonomy term data type.
  */
 class rules_data_type_taxonomy_term extends rules_data_type {
diff --git a/rules/modules/taxonomy.rules_forms.inc b/rules/modules/taxonomy.rules_forms.inc
index fa851a5..ee42328 100644
--- a/rules/modules/taxonomy.rules_forms.inc
+++ b/rules/modules/taxonomy.rules_forms.inc
@@ -176,6 +176,68 @@ function rules_action_taxonomy_add_vocab_submit(&$settings, $form, $form_state)
 }
 
 /**
+ * Configure the vocabulary to expose and select the terms to look for.
+ */
+function rules_condition_node_has_term_form($settings, &$form) {
+  // Add two settings.
+  $settings += array('taxonomy_node_terms_are' => '', 'taxonomy_node_vocabularies' => array());
+
+  // If the vocabularies are not set, first display the list of vocabularies
+  // to narrow the list of terms to display.
+  if (empty($settings['taxonomy_node_vocabularies'])) {
+    $options = array();
+    foreach (taxonomy_get_vocabularies() as $voc) {
+      $options[$voc->vid] = $voc->name;
+    }
+    $form['settings']['taxonomy_node_vocabularies'] = array(
+      '#type' => 'checkboxes',
+      '#title' => t('Select the vocabulary where the terms can belong.'),
+      '#options' => $options,
+      '#default_value' => $settings['taxonomy_node_vocabularies'],
+    );
+    // Hijack the submit callback to create a multistep form.
+    $form['submit']['#submit'] = array('rules_condition_node_has_term_set_vocabularies');
+    $form['submit']['#value'] = t('Continue');
+  }
+  else {
+    // If we have a vocabulary settled, display the terms of this vocabulary.
+    $options = array();
+    foreach($settings['taxonomy_node_vocabularies'] as $vid => $voc_name) {
+      if ($vid > 0) {
+        $tree = taxonomy_get_tree($vid);
+        $options[$voc_name] = array();
+        foreach($tree as $term) {
+          $options[$voc_name][$term->tid] = $term->name;
+        }
+      }
+    }
+    $form['settings']['taxonomy_node_terms_are'] = array(
+      '#type' => 'select',
+      '#multiple' => TRUE,
+      '#description' => t('Selecting multiple terms means that the node will have to be assigned every terms to be evaluated as true.'),
+      '#title' => t('Terms that the node should have.'),
+      '#options' => $options,
+      '#default_value' => $settings['taxonomy_node_terms_are'],
+    );
+  }
+}
+
+/**
+ * Reformat the value to store to be able to display the vocabulary name
+ * to the end user.
+ */
+function rules_condition_node_has_term_set_vocabularies($form, &$form_state) {
+  $save_voc = array();
+  foreach($form_state['values']['settings']['taxonomy_node_vocabularies'] as $voc) {
+    if ($voc != 0) {
+      $save_voc[$voc] = $form['settings']['taxonomy_node_vocabularies']['#options'][$voc];
+    }
+  }
+  // Store the value in the element key instead of values.
+  $form_state['element']['#settings']['taxonomy_node_vocabularies'] = $save_voc;
+}
+
+/**
  * Helper function; Return all existing vocabularies.
  */
 function _rules_action_taxonomy_get_vocab() {
