diff --git a/entityreference.module b/entityreference.module
index a9893ab..66398a7 100644
--- a/entityreference.module
+++ b/entityreference.module
@@ -216,19 +216,20 @@ function entityreference_field_validate($entity_type, $entity, $field, $instance
       $ids[$item['target_id']] = $delta;
     }
   }
-
   if ($ids) {
     $valid_ids = entityreference_get_selection_handler($field, $instance, $entity_type, $entity)->validateReferencableEntities(array_keys($ids));
-
     if (!empty($valid_ids)) {
       $invalid_entities = array_diff_key($ids, array_flip($valid_ids));
-      if ($invalid_entities) {
-        foreach ($invalid_entities as $id => $delta) {
-          $errors[$field['field_name']][$langcode][$delta][] = array(
-            'error' => 'entityreference_invalid_entity',
-            'message' => t('The referenced entity (@type: @id) is invalid.', array('@type' => $field['settings']['target_type'], '@id' => $id)),
-          );
-        }
+    }
+    else {
+      $invalid_entities = $ids;
+    }
+    if ($invalid_entities) {
+      foreach ($invalid_entities as $id => $delta) {
+        $errors[$field['field_name']][$langcode][$delta][] = array(
+          'error' => 'entityreference_invalid_entity',
+          'message' => t('The referenced entity (@type: @id) is invalid.', array('@type' => $field['settings']['target_type'], '@id' => $id)),
+        );
       }
     }
   }
diff --git a/plugins/selection/EntityReference_SelectionHandler_Generic.class.php b/plugins/selection/EntityReference_SelectionHandler_Generic.class.php
index 902c55c..6cdcf25 100644
--- a/plugins/selection/EntityReference_SelectionHandler_Generic.class.php
+++ b/plugins/selection/EntityReference_SelectionHandler_Generic.class.php
@@ -195,6 +195,9 @@ class EntityReference_SelectionHandler_Generic implements EntityReference_Select
       $entity_type = $this->field['settings']['target_type'];
       $query = $this->buildEntityFieldQuery();
       $query->entityCondition('entity_id', $ids, 'IN');
+      if (!empty($this->field['settings']['handler_settings']['target_bundles'])) {
+        $query->entityCondition('bundle', $this->field['settings']['handler_settings']['target_bundles'], 'IN');
+      }
       $result = $query->execute();
       if (!empty($result[$entity_type])) {
         return array_keys($result[$entity_type]);
diff --git a/tests/entityreference.handlers.test b/tests/entityreference.handlers.test
index b88e106..f6fb6b8 100644
--- a/tests/entityreference.handlers.test
+++ b/tests/entityreference.handlers.test
@@ -30,14 +30,13 @@ class EntityReferenceHandlersTestCase extends DrupalWebTestCase {
         $this->assertEqual($result, $test['result'], format_string('Valid result set returned by @handler.', array('@handler' => $handler_name)));
 
         $result = call_user_func_array(array($handler, 'countReferencableEntities'), $arguments);
+        $count = 0;
         if (!empty($test['result'])) {
-          $bundle = key($test['result']);
-          $count = count($test['result'][$bundle]);
+          foreach ($test['result'] as $bundle => $bundle_results) {
+            $bundle = key($test['result']);
+            $count += count($bundle_results);
+          }
         }
-        else {
-          $count = 0;
-        }
-
         $this->assertEqual($result, $count, format_string('Valid count returned by @handler.', array('@handler' => $handler_name)));
       }
     }
@@ -197,6 +196,84 @@ class EntityReferenceHandlersTestCase extends DrupalWebTestCase {
   }
 
   /**
+   * Test the bundle-specific overrides of the entity handler.
+   */
+  public function testBundleHandler() {
+    // Build a fake field instance.
+    $field = array(
+      'translatable' => FALSE,
+      'entity_types' => array(),
+      'settings' => array(
+        'handler' => 'base',
+        'target_type' => 'node',
+        'handler_settings' => array(
+          'target_bundles' => array('page', 'article'),
+        ),
+      ),
+      'field_name' => 'test_field',
+      'type' => 'entityreference',
+      'cardinality' => '1',
+    );
+
+    // Build a set of test data.
+    // Titles contain HTML-special characters to test escaping.
+    $nodes = array(
+      'article' => (object) array(
+        'type' => 'article',
+        'status' => 1,
+        'title' => 'Article',
+        'uid' => 1,
+      ),
+      'page' => (object) array(
+        'type' => 'page',
+        'status' => 1,
+        'title' => 'Page',
+        'uid' => 1,
+      ),
+      'news' => (object) array(
+        'type' => 'news',
+        'status' => 1,
+        'title' => 'News',
+        'uid' => 1,
+      ),
+    );
+
+    $node_labels = array();
+    foreach ($nodes as $key => $node) {
+      node_save($node);
+      $node_labels[$key] = $node->title;
+    }
+
+    // Only need to test as admin, since access is tested in testNodeHandler().
+    $admin_user = $this->drupalCreateUser(array('access content', 'bypass node access'));
+    $GLOBALS['user'] = $admin_user;
+    $referencable_tests = array(
+      array(
+        'arguments' => array(
+          array(NULL, 'CONTAINS'),
+        ),
+        'result' => array(
+          'article' => array(
+            $nodes['article']->nid => $node_labels['article'],
+          ),
+          'page' => array(
+            $nodes['page']->nid => $node_labels['page'],
+          ),
+        ),
+      ),
+      array(
+        'arguments' => array(
+          array('News', 'CONTAINS'),
+        ),
+        'result' => array(
+          'news' => array(),
+        ),
+      ),
+    );
+    $this->assertReferencable($field, $referencable_tests, 'Node handler (admin)');
+  }
+
+  /**
    * Test the user-specific overrides of the entity handler.
    */
   public function testUserHandler() {
