diff --git a/context.core.inc b/context.core.inc
index 5a85e8a..7a27e52 100644
--- a/context.core.inc
+++ b/context.core.inc
@@ -148,6 +148,9 @@ function context_node_condition(&$node, $op) {
   if ($plugin = context_get_plugin('condition', 'node')) {
     $plugin->execute($node, $op);
   }
+  if ($plugin = context_get_plugin('condition', 'node_field')) {
+    $plugin->execute($node, $op);
+  }
   if (module_exists('taxonomy')) {
     if ($plugin = context_get_plugin('condition', 'node_taxonomy')) {
       $plugin->execute($node, $op);
diff --git a/context.plugins.inc b/context.plugins.inc
index 46dfac1..4774783 100644
--- a/context.plugins.inc
+++ b/context.plugins.inc
@@ -16,6 +16,11 @@ function _context_context_registry() {
       'description' => t('Set this context when viewing a node page or using the add/edit form of one of these content types.'),
       'plugin' => 'context_condition_node',
     ),
+    'node_field' => array(
+      'title' => t('Node field'),
+      'description' => t('Set this context when the selected node field of the current node matches the defined value.'),
+      'plugin' => 'context_condition_node_field',
+    ),
     'sitewide' => array(
       'title' => t('Sitewide context'),
       'description' => t('Should this context always be set? If <strong>true</strong>, this context will be active across your entire site.'),
@@ -163,6 +168,14 @@ function _context_context_plugins() {
       'parent' => 'context_condition',
     ),
   );
+  $plugins['context_condition_node_field'] = array(
+    'handler' => array(
+      'path' => drupal_get_path('module', 'context') . '/plugins',
+      'file' => 'context_condition_node_field.inc',
+      'class' => 'context_condition_node_field',
+      'parent' => 'context_condition',
+    ),
+  );
   $plugins['context_condition_sitewide'] = array(
     'handler' => array(
       'path' => drupal_get_path('module', 'context') . '/plugins',
diff --git a/plugins/context_condition_node_field.inc b/plugins/context_condition_node_field.inc
new file mode 100644
index 0000000..af371a0
--- /dev/null
+++ b/plugins/context_condition_node_field.inc
@@ -0,0 +1,124 @@
+<?php
+
+/**
+ * Expose node fields as a context condition.
+ *
+ * @todo: Handle any additional core field types that don't have a 'value' member.
+ *
+ */
+class context_condition_node_field extends context_condition {
+  function condition_values() {
+    $values = array('test' => 'foo');
+    return $values;
+  }
+
+  function condition_form($context) {
+    $form = array(
+      'description' => array(
+        '#markup' => $this->description,
+      ),
+    );
+
+    $defaults = $this->fetch_from_context($context, 'values');
+
+    // Generate a select filled with available node fields.
+    $instance_fields = field_info_instances('node');
+    $options = array();
+
+    if (isset($context->conditions['node']['values'])) {
+      foreach ($instance_fields as $node_type => $fields) {
+        if (array_key_exists($node_type, $context->conditions['node']['values'])) { // Only load the fields for the selected node types.
+          foreach ($fields as $key => $field_info) {
+            $options[$key] = $field_info['label'];
+          }
+        }
+      }
+    }
+    else { // Load all fields
+      foreach ($instance_fields as $node_type => $fields) {
+        foreach ($fields as $key => $field_info) { // Only load the fields for the selected node types.
+          $options[$key] = $field_info['label'];
+        }
+      }
+    }
+    $default = isset($defaults['node_field']) ? $defaults['node_field'] : FALSE;
+    $form['node_field'] = array(
+      '#title' => 'Field',
+      '#type' => 'select',
+      '#options' => $options,
+      '#default_value' => $default,
+      '#description' => 'Select which field in the node you want to compare',
+    );
+
+    $default = isset($defaults['value']) ? $defaults['value'] : '';
+    $form['value'] = array(
+      '#type' => 'textfield',
+      '#title' => 'Value',
+      '#default_value' => $default,
+      '#description' => 'Enter text or a term name to compare for text or term reference fields. You may also use the keywords "&lt;empty&gt;" or "&lt;not-empty&gt;", which will apply to most field types. For multiple value fields, only the first value is compared.',
+    );
+
+    return $form;
+  }
+
+  function condition_form_submit($values) {
+    return $values;
+  }
+
+  function execute($node, $op) {
+    if ($op == 'view') {
+      foreach ($this->get_contexts() as $context) {
+        if (isset($context->conditions['node_field']['values']['node_field'])) {
+          $field_name = $context->conditions['node_field']['values']['node_field'];
+          $field_value = $context->conditions['node_field']['values']['value'];
+          if ($field_value == '<empty>') { // Check if the field is not set/empty.
+            if (count($node->{$field_name}) == 0 || $node->{$field_name}[$node->language][0]['value'] == '') {
+              $this->condition_met($context);
+            }
+          }
+          elseif ($field_value == '<not-empty>') { // Check if the field is not set/empty.
+            if (array_key_exists($node->language, $node->{$field_name})) {
+              if (isset($node->{$field_name}[$node->language][0])) {
+                $met = FALSE;
+                if ($node->{$field_name}[$node->language][0]['type'] == 'image' && $node->{$field_name}[$node->language][0]['fid'] > 0) {
+                  $met = TRUE;
+                }
+                elseif (isset($node->{$field_name}[$node->language][0]['tid']) && $node->{$field_name}[$node->language][0]['tid'] > 0) {
+                  $met = TRUE;
+                }
+                elseif (isset($node->{$field_name}[$node->language][0]['value']) && $node->{$field_name}[$node->language][0]['value'] != '') {
+                  $met = TRUE;
+                }
+                if ($met) {
+                  $this->condition_met($context);
+                }
+              }
+            }
+          }
+          else { // Test the value.
+            if (array_key_exists($node->language, $node->{$field_name})) {
+              if (isset($node->{$field_name}[$node->language][0])) {
+                $met = FALSE;
+                if (isset($node->{$field_name}[$node->language][0]['tid']) && $node->{$field_name}[$node->language][0]['tid'] > 0) {
+                  // Load the taxonomy term.
+                  $term = taxonomy_term_load($node->{$field_name}[$node->language][0]['tid']);
+                  if (is_object($term) && ($term->name == $field_value)) {
+                    $met = TRUE;
+                  }
+                }
+                elseif (isset($node->{$field_name}[$node->language][0]['value']) && $node->{$field_name}[$node->language][0]['value'] != '') {
+                  if ($node->{$field_name}[$node->language][0]['value'] == $field_value) {
+                    $met = TRUE;
+                  }
+                }
+                if ($met) {
+                  $this->condition_met($context);
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
