diff --git a/src/Plugin/EntityReferenceSelection/ParagraphSelection.php b/src/Plugin/EntityReferenceSelection/ParagraphSelection.php
index 98a0b8f..bb682fb 100644
--- a/src/Plugin/EntityReferenceSelection/ParagraphSelection.php
+++ b/src/Plugin/EntityReferenceSelection/ParagraphSelection.php
@@ -226,4 +226,65 @@ class ParagraphSelection extends DefaultSelection {
     return $return_bundles;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function validateReferenceableNewEntities(array $entities) {
+    $bundles = array_keys($this->getSortedAllowedTypes());
+    return array_filter($entities, function ($entity) {
+      if (isset($bundles)) {
+        return in_array($entity->bundle(), $bundles);
+      }
+      return TRUE;
+    });
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function buildEntityQuery($match = NULL, $match_operator = 'CONTAINS') {
+    $target_type = $this->configuration['target_type'];
+    $handler_settings = $this->configuration['handler_settings'];
+    $entity_type = $this->entityManager->getDefinition($target_type);
+
+    $query = $this->entityManager->getStorage($target_type)->getQuery();
+
+    // If 'target_bundles' is NULL, all bundles are referenceable, no further
+    // conditions are needed.
+    if (isset($handler_settings['target_bundles']) && is_array($handler_settings['target_bundles'])) {
+      $target_bundles = array_keys($this->getSortedAllowedTypes());
+
+      // If 'target_bundles' is an empty array, no bundle is referenceable,
+      // force the query to never return anything and bail out early.
+      if ($target_bundles === []) {
+        $query->condition($entity_type->getKey('id'), NULL, '=');
+        return $query;
+      }
+      else {
+        $query->condition($entity_type->getKey('bundle'), $target_bundles, 'IN');
+      }
+    }
+
+    if (isset($match) && $label_key = $entity_type->getKey('label')) {
+      $query->condition($label_key, $match, $match_operator);
+    }
+
+    // Add entity-access tag.
+    $query->addTag($target_type . '_access');
+
+    // Add the Selection handler for system_query_entity_reference_alter().
+    $query->addTag('entity_reference');
+    $query->addMetaData('entity_reference_selection_handler', $this);
+
+    // Add the sort option.
+    if (!empty($handler_settings['sort'])) {
+      $sort_settings = $handler_settings['sort'];
+      if ($sort_settings['field'] != '_none') {
+        $query->sort($sort_settings['field'], $sort_settings['direction']);
+      }
+    }
+
+    return $query;
+  }
+
 }
diff --git a/src/Tests/Experimental/ParagraphsExperimentalConfigTest.php b/src/Tests/Experimental/ParagraphsExperimentalConfigTest.php
index f52e230..2297903 100644
--- a/src/Tests/Experimental/ParagraphsExperimentalConfigTest.php
+++ b/src/Tests/Experimental/ParagraphsExperimentalConfigTest.php
@@ -179,6 +179,30 @@ class ParagraphsExperimentalConfigTest extends ParagraphsExperimentalTestBase {
     $this->drupalGet('node/add/paragraphed_test');
     $this->assertText('Add paragraph_type_test');
     $this->assertNoText('Add text');
+    $edit = [
+      'title[0][value]' => 'Testing included types'
+    ];
+    $this->drupalPostForm(NULL, $edit, 'Save and publish');
+    $this->assertText('paragraphed_test Testing included types has been created.');
+
+    // Include all types.
+    $this->drupalGet('admin/structure/types/manage/paragraphed_test/fields/node.paragraphed_test.paragraphs');
+    $edit = [
+      'settings[handler_settings][negate]' => 0,
+      'settings[handler_settings][target_bundles_drag_drop][text][enabled]' => 1,
+      'settings[handler_settings][target_bundles_drag_drop][paragraph_type_test][enabled]' => 1,
+    ];
+    $this->drupalPostForm(NULL, $edit, 'Save settings');
+    $this->drupalGet('node/add/paragraphed_test');
+    $button_paragraphed_type_test = $this->xpath('//input[@id=:id]', [':id' => 'paragraphs-paragraph-type-test-add-more']);
+    $button_text = $this->xpath('//input[@id=:id]', [':id' => 'paragraphs-text-add-more']);
+    $this->assertNotNull($button_paragraphed_type_test);
+    $this->assertNotNull($button_text);
+    $edit = [
+      'title[0][value]' => 'Testing all excluded types'
+    ];
+    $this->drupalPostForm(NULL, $edit, 'Save and publish');
+    $this->assertText('paragraphed_test Testing all excluded types has been created.');
   }
 
   /**
@@ -202,5 +226,26 @@ class ParagraphsExperimentalConfigTest extends ParagraphsExperimentalTestBase {
     $this->drupalGet('node/add/paragraphed_test');
     $this->assertText('Add paragraph_type_test');
     $this->assertNoText('Add text');
+    $edit = [
+      'title[0][value]' => 'Testing excluded types'
+    ];
+    $this->drupalPostForm(NULL, $edit, 'Save and publish');
+    $this->assertText('paragraphed_test Testing excluded types has been created.');
+
+    // Exclude all types.
+    $this->drupalGet('admin/structure/types/manage/paragraphed_test/fields/node.paragraphed_test.paragraphs');
+    $edit = [
+      'settings[handler_settings][negate]' => 1,
+      'settings[handler_settings][target_bundles_drag_drop][text][enabled]' => 1,
+      'settings[handler_settings][target_bundles_drag_drop][paragraph_type_test][enabled]' => 1,
+    ];
+    $this->drupalPostForm(NULL, $edit, 'Save settings');
+    $this->drupalGet('node/add/paragraphed_test');
+    $this->assertText('You are not allowed to add any of the Paragraph types.');
+    $edit = [
+      'title[0][value]' => 'Testing all excluded types'
+    ];
+    $this->drupalPostForm(NULL, $edit, 'Save and publish');
+    $this->assertText('paragraphed_test Testing all excluded types has been created.');
   }
 }
