diff --git a/src/Plugin/EntityBrowser/Widget/View.php b/src/Plugin/EntityBrowser/Widget/View.php
index c743a73..175b4c5 100644
--- a/src/Plugin/EntityBrowser/Widget/View.php
+++ b/src/Plugin/EntityBrowser/Widget/View.php
@@ -3,6 +3,7 @@
 namespace Drupal\entity_browser\Plugin\EntityBrowser\Widget;

 use Drupal\Component\Plugin\Exception\PluginNotFoundException;
+use Drupal\Core\Access\AccessResult;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Render\Element;
 use Drupal\entity_browser\WidgetBase;
@@ -267,7 +268,7 @@ public function submitConfigurationForm(array &$form, FormStateInterface $form_s
   /**
    * {@inheritdoc}
    */
-  public function isVisible() {
+  public function access($return_as_object = FALSE) {
     // Mark the widget as not visible if the user has no access to the view.
     /** @var \Drupal\views\ViewExecutable $view */
     $view = $this->entityTypeManager
@@ -275,12 +276,10 @@ public function isVisible() {
       ->load($this->configuration['view'])
       ->getExecutable();

-    // Check if the current user has access to this view.
-    if (!$view->access($this->configuration['view_display'])) {
-      return FALSE;
-    }

-    return TRUE;
+    // Check if the current user has access to this view.
+    $result = AccessResult::allowedIf($view->access($this->configuration['view_display']));
+    return $return_as_object ? $result : $result->isAllowed();
   }

 }
diff --git a/src/Plugin/EntityBrowser/WidgetSelector/DropDown.php b/src/Plugin/EntityBrowser/WidgetSelector/DropDown.php
index 1cb3483..784df3a 100644
--- a/src/Plugin/EntityBrowser/WidgetSelector/DropDown.php
+++ b/src/Plugin/EntityBrowser/WidgetSelector/DropDown.php
@@ -2,8 +2,11 @@

 namespace Drupal\entity_browser\Plugin\EntityBrowser\WidgetSelector;

+use Drupal\Core\Entity\EntityTypeManagerInterface;
+use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
 use Drupal\entity_browser\WidgetSelectorBase;
 use Drupal\Core\Form\FormStateInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;

 /**
  * Displays widgets in a select list.
@@ -14,7 +17,35 @@
  *   description = @Translation("Displays the widgets in a drop down.")
  * )
  */
-class DropDown extends WidgetSelectorBase {
+class DropDown extends WidgetSelectorBase implements ContainerFactoryPluginInterface {
+
+  /**
+   * The Entity Type Manager
+   *
+   * @var \Drupal\Core\Entity\EntityTypeManagerInterface
+   */
+  protected $entityTypeManager;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function __construct($configuration, $plugin_id, $plugin_definition, EntityTypeManagerInterface $entity_type_manager) {
+    parent::__construct($configuration, $plugin_id, $plugin_definition);
+
+    $this->entityTypeManager = $entity_type_manager;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
+    return new static(
+      $configuration,
+      $plugin_id,
+      $plugin_definition,
+      $container->get('entity_type.manager')
+    );
+  }

   /**
    * {@inheritdoc}
@@ -24,9 +55,17 @@ public function getForm(array &$form = array(), FormStateInterface &$form_state
     $form['#prefix'] = '<div id="entity-browser-form">';
     $form['#suffix'] = '</div>';

+    $browser_id = substr(substr($form_state->getBuildInfo()['form_id'], 15), 0, -5);
+    /** @var \Drupal\entity_browser\EntityBrowserInterface $browser */
+    $browser = $this->entityTypeManager->getStorage('entity_browser')->load($browser_id);
+
+    $widget_ids = array_filter($this->widget_ids, function ($id) use ($browser) {
+      return $browser->getWidget($id)->access();
+    }, ARRAY_FILTER_USE_KEY);
+
     $element['widget'] = array(
       '#type' => 'select',
-      '#options' => $this->widget_ids,
+      '#options' => $widget_ids,
       '#default_value' => $this->getDefaultWidget(),
       '#executes_submit_callback' => TRUE,
       '#limit_validation_errors' => array(array('widget')),
diff --git a/src/Plugin/EntityBrowser/WidgetSelector/Tabs.php b/src/Plugin/EntityBrowser/WidgetSelector/Tabs.php
index b96c84b..fc1e6db 100644
--- a/src/Plugin/EntityBrowser/WidgetSelector/Tabs.php
+++ b/src/Plugin/EntityBrowser/WidgetSelector/Tabs.php
@@ -2,8 +2,11 @@

 namespace Drupal\entity_browser\Plugin\EntityBrowser\WidgetSelector;

+use Drupal\Core\Entity\EntityTypeManagerInterface;
+use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
 use Drupal\entity_browser\WidgetSelectorBase;
 use Drupal\Core\Form\FormStateInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;

 /**
  * Displays entity browser widgets as tabs.
@@ -14,7 +17,35 @@
  *   description = @Translation("Creates horizontal tabs on the top of the entity browser, each tab representing one available widget.")
  * )
  */
-class Tabs extends WidgetSelectorBase {
+class Tabs extends WidgetSelectorBase implements ContainerFactoryPluginInterface {
+
+  /**
+   * The Entity Type Manager
+   *
+   * @var \Drupal\Core\Entity\EntityTypeManagerInterface
+   */
+  protected $entityTypeManager;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function __construct($configuration, $plugin_id, $plugin_definition, EntityTypeManagerInterface $entity_type_manager) {
+    parent::__construct($configuration, $plugin_id, $plugin_definition);
+
+    $this->entityTypeManager = $entity_type_manager;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
+    return new static(
+      $configuration,
+      $plugin_id,
+      $plugin_definition,
+      $container->get('entity_type.manager')
+    );
+  }

   /**
    * {@inheritdoc}
@@ -22,11 +53,10 @@ class Tabs extends WidgetSelectorBase {
   public function getForm(array &$form = array(), FormStateInterface &$form_state = NULL) {
     $element = [];
     $browser_id = substr(substr($form_state->getBuildInfo()['form_id'], 15), 0, -5);
-    // @TODO Use DI to get $this->entityTypeManager here.
     /** @var \Drupal\entity_browser\EntityBrowserInterface $browser */
-    $browser = \Drupal::entityTypeManager()->getStorage('entity_browser')->load($browser_id);
+    $browser = $this->entityTypeManager->getStorage('entity_browser')->load($browser_id);
     foreach ($this->widget_ids as $id => $label) {
-      if (!empty($browser) && $browser->getWidget($id)->isVisible()) {
+      if (!empty($browser) && $browser->getWidget($id)->access()) {
         $name = 'tab_selector_' . $id;
         $element[$name] = array(
           '#type' => 'button',
diff --git a/src/WidgetBase.php b/src/WidgetBase.php
index 52a5690..7378f8d 100644
--- a/src/WidgetBase.php
+++ b/src/WidgetBase.php
@@ -2,6 +2,7 @@

 namespace Drupal\entity_browser;

+use Drupal\Core\Access\AccessResult;
 use Drupal\Core\Entity\EntityTypeManagerInterface;
 use Drupal\Core\Plugin\PluginBase;
 use Drupal\Core\Form\FormStateInterface;
@@ -325,8 +326,9 @@ protected function selectEntities(array $entities, FormStateInterface $form_stat
   /**
    * {@inheritdoc}
    */
-  public function isVisible() {
-    return TRUE;
+  public function access($return_as_object = FALSE) {
+    $result = AccessResult::allowed();
+    return $return_as_object ? $result : $result->isAllowed();
   }

 }
diff --git a/src/WidgetInterface.php b/src/WidgetInterface.php
index 6854644..f43e97f 100644
--- a/src/WidgetInterface.php
+++ b/src/WidgetInterface.php
@@ -110,12 +110,16 @@ public function validate(array &$form, FormStateInterface $form_state);
   public function submit(array &$element, array &$form, FormStateInterface $form_state);

   /**
-   * Defines if the widget is visible / accesible in a given context.
+   * Defines if the widget is visible / accessible in a given context.
    *
-   * @return bool
-   *   TRUE if the widget is to be considered accesible (visible) by other
-   *   plugins (such as the selector plugin), FALSE otherwise.
+   * @return bool|\Drupal\Core\Access\AccessResultInterface
+   *   The access result. Returns a boolean if $return_as_object is FALSE (this
+   *   is the default) and otherwise an AccessResultInterface object.
+   *   When a boolean is returned, the result of AccessInterface::isAllowed() is
+   *   returned, i.e. TRUE means access is explicitly allowed, thus the widget
+   *   is to be considered accessible by other plugins. FALSE means
+   *   access is either explicitly forbidden or "no opinion".
    */
-  public function isVisible();
+  public function access($return_as_object = FALSE);

 }
