diff --git a/entityreference.module b/entityreference.module
index 5f03c5b..d2548fa 100644
--- a/entityreference.module
+++ b/entityreference.module
@@ -713,6 +713,16 @@ function entityreference_field_widget_info() {
     ),
   );
 
+  $widgets['entityreference_select_exposed'] = array(
+    'label' => t('Select list (with filter)'),
+    'description' => t('A select list with an exposed filter.'),
+    'field types' => array('entityreference'),
+    'settings' => array(
+      'exposed_filter_field' => '',
+      'exposed_filter_label' => '',
+    ),
+  );
+
   return $widgets;
 }
 
@@ -754,6 +764,37 @@ function entityreference_field_widget_settings_form($field, $instance) {
       '#required' => TRUE,
     );
   }
+  elseif ($widget['type'] == 'entityreference_select_exposed') {
+    if (isset($settings['exposed_filter']['exposed_filter_field'])) {
+      $settings['exposed_filter_field'] = $settings['exposed_filter']['exposed_filter_field'];
+      $settings['exposed_filter_label'] = $settings['exposed_filter']['exposed_filter_label'];
+    }
+    $fields = array();
+    foreach (field_info_instances($field['settings']['target_type']) as $bundle_name => $bundle_instances) {
+      foreach ($bundle_instances as $instance_name => $instance_info) {
+        $field_info = field_info_field($instance_name);
+        foreach ($field_info['columns'] as $column_name => $column_info) {
+          $fields[$instance_name . ':' . $column_name] = t('@label (column @column)', array('@label' => $instance_info['label'], '@column' => $column_name));
+        }
+      }
+    }
+    $form['exposed_filter'] = array(
+      '#type' => 'fieldset',
+      '#title' => 'Exposed filter',
+    );
+    $form['exposed_filter']['exposed_filter_field'] = array(
+      '#type' => 'select',
+      '#title' => t('Field'),
+      '#options' => $fields,
+      '#default_value' => $settings['exposed_filter_field'],
+      '#required' => TRUE,
+    );
+    $form['exposed_filter']['exposed_filter_label'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Label'),
+      '#default_value' => $settings['exposed_filter_label'],
+    );
+  }
 
   return $form;
 }
@@ -872,6 +913,104 @@ function entityreference_field_widget_form(&$form, &$form_state, $field, $instan
       return $element;
     }
   }
+  elseif ($instance['widget']['type'] == 'entityreference_select_exposed') {
+    $settings = $instance['widget']['settings'];
+    if (isset($settings['exposed_filter'])) $settings = $settings['exposed_filter'];
+    if (!$options = entityreference_get_selection_handler($field, $instance, $entity_type, $entity)->getReferencableEntities()) {
+      return element();
+    }
+
+    list($exposed_filter_field, $exposed_filter_prop) = ($settings['exposed_filter_field'] != '') ? explode(':', $settings['exposed_filter_field']) : array('', '');
+
+    if (isset($form_state['values'])) {
+      // Find exposed field value if passed
+      $exposed_value_field = $form_state['values'];
+      foreach ($element['#field_parents'] as $parent_field) {
+        $exposed_value_field = $exposed_value_field[$parent_field];
+      }
+      $exposed_value = $exposed_value_field[$instance['field_name']][$langcode][0]['exposed_value'];
+    }
+    elseif (isset($items[$delta]) && $items[$delta]['target_id'] != '') {
+      // Find the saved exposed option from saved reference
+      $target = entity_load($field['settings']['target_type'], array($items[$delta]['target_id']));
+      $target_field = field_get_items($field['settings']['target_type'], array_shift($target), $exposed_filter_field);
+      $exposed_value = $target_field[0][$exposed_filter_prop];
+    }
+
+    $element += array(
+      '#type'   => 'fieldset',
+      '#title'  => $instance['label'],
+      '#prefix' => '<div id="exposed-values-' . $instance['id'] . '-' . $delta . '-' . $form['#delta'] . '-div">',
+      '#suffix' => '</div>',
+    );
+    // Get values for exposed filter
+    $exposed_options = array();
+    $filtered_options = $options; // Duplicate options, so we can pre-filter them at the same time if exposed value is set
+    if ($exposed_filter_field != '') {
+      foreach ($options as $entity_ids) {
+        $entities_loaded = entity_load($field['settings']['target_type'], array_keys($entity_ids));
+        foreach ($entities_loaded as $entity_id => $entity) {
+          $field_items = field_get_items($field['settings']['target_type'], $entity, $exposed_filter_field);
+          foreach ($field_items as $field_item) {
+            $exposed_field_value = $field_item[$exposed_filter_prop];
+            $exposed_options[$exposed_field_value] = $exposed_field_value;
+            // Delete unwanted entities from pre-filtered options
+            if (isset($exposed_value) && $exposed_field_value != $exposed_value) {
+              foreach ($filtered_options as $filtered_bundle => $filtered_entity_ids) {
+                if (isset($filtered_options[$filtered_bundle][$entity_id])) unset($filtered_options[$filtered_bundle][$entity_id]);
+              }
+            }
+          }
+        }
+      }
+      asort($exposed_options);
+    }
+
+    $element['exposed_value'] = array(
+      '#type'     => 'select',
+      '#title'    => $settings['exposed_filter_label'],
+      '#options'  => $exposed_options,
+      '#required' => $element['#required'],
+      '#ajax'     => array(
+        'callback'  => '_entityreference_get_exposed_values',
+        'wrapper'   => 'exposed-values-' . $instance['id'] . '-' . $delta . '-' . $form['#delta'] . '-div',
+      ),
+    );
+
+    if (isset($exposed_value)) {
+      // Select the correct exposed option
+      $element['exposed_value']['#default_value'] = $exposed_value;
+      // Filter the entities by the exposed value
+      // Rebuild the array, by changing the bundle key into the bundle label.
+      $target_type = $field['settings']['target_type'];
+      $entity_info = entity_get_info($target_type);
+      $entities = array();
+      foreach ($filtered_options as $bundle => $entity_ids) {
+        $bundle_label = check_plain($entity_info['bundles'][$bundle]['label']);
+        $entities[$bundle_label] = $entity_ids;
+      }
+      $element['target_id'] = array(
+        '#type'     => 'select',
+        '#title'    => $instance['label'],
+        '#options'  => $entities,
+        '#required' => $element['#required'],
+      );
+      if (isset($items[$delta]) && $items[$delta]['target_id'] != '') $element['target_id']['#default_value'] = $items[$delta]['target_id'];
+    }
+    else $element['exposed_value']['#empty_option'] = t('- Choose -');
+
+    return $element;
+  }
+}
+
+/**
+ * Ajax callback to get entities filtered by the exposed value
+ */
+function _entityreference_get_exposed_values($form, &$form_state) {
+  $parents = array_slice($form_state['triggering_element']['#parents'], 0, -3);
+  $element = $form;
+  foreach ($parents as $parent) $element = $element[$parent];
+  return $element;
 }
 
 function _entityreference_autocomplete_validate($element, &$form_state, $form) {
