diff --git a/core/modules/shortcut/config/optional/views.view.shortcuts.yml b/core/modules/shortcut/config/optional/views.view.shortcuts.yml
new file mode 100644
index 0000000..eb0bc56
--- /dev/null
+++ b/core/modules/shortcut/config/optional/views.view.shortcuts.yml
@@ -0,0 +1,280 @@
+langcode: en
+status: true
+dependencies:
+  module:
+    - link
+    - shortcut
+    - user
+id: shortcuts
+label: Shortcuts
+module: views
+description: Shortcuts.
+tag: ''
+base_table: shortcut_field_data
+base_field: id
+core: 8.x
+display:
+  default:
+    display_plugin: default
+    id: default
+    display_title: Master
+    position: 0
+    display_options:
+      access:
+        type: perm
+        options:
+          perm: 'access shortcuts'
+      cache:
+        type: tag
+        options: {  }
+      query:
+        type: views_query
+        options:
+          disable_sql_rewrite: false
+          distinct: false
+          replica: false
+          query_comment: ''
+          query_tags: {  }
+      exposed_form:
+        type: basic
+        options:
+          submit_button: Apply
+          reset_button: false
+          reset_button_label: Reset
+          exposed_sorts_label: 'Sort by'
+          expose_sort_order: true
+          sort_asc_label: Asc
+          sort_desc_label: Desc
+      pager:
+        type: none
+        options:
+          offset: 0
+      style:
+        type: html_list
+      row:
+        type: fields
+        options:
+          default_field_elements: true
+          inline: {  }
+          separator: ''
+          hide_empty: false
+      fields:
+        link__uri:
+          id: link__uri
+          table: shortcut_field_data
+          field: link__uri
+          relationship: none
+          group_type: group
+          admin_label: ''
+          label: ''
+          exclude: true
+          alter:
+            alter_text: false
+            text: ''
+            make_link: false
+            path: ''
+            absolute: false
+            external: false
+            replace_spaces: false
+            path_case: none
+            trim_whitespace: false
+            alt: ''
+            rel: ''
+            link_class: ''
+            prefix: ''
+            suffix: ''
+            target: ''
+            nl2br: false
+            max_length: 0
+            word_boundary: true
+            ellipsis: true
+            more_link: false
+            more_link_text: ''
+            more_link_path: ''
+            strip_tags: false
+            trim: false
+            preserve_tags: ''
+            html: false
+          element_type: ''
+          element_class: ''
+          element_label_type: ''
+          element_label_class: ''
+          element_label_colon: false
+          element_wrapper_type: ''
+          element_wrapper_class: ''
+          element_default_classes: true
+          empty: ''
+          hide_empty: false
+          empty_zero: false
+          hide_alter_empty: true
+          click_sort_column: uri
+          type: link
+          settings:
+            trim_length: 80
+            url_only: false
+            url_plain: false
+            rel: '0'
+            target: '0'
+          group_column: ''
+          group_columns: {  }
+          group_rows: true
+          delta_limit: 0
+          delta_offset: 0
+          delta_reversed: false
+          delta_first_last: false
+          multi_type: separator
+          separator: ', '
+          field_api_classes: false
+          entity_type: shortcut
+          entity_field: link
+          plugin_id: field
+        title:
+          id: title
+          table: shortcut_field_data
+          field: title
+          relationship: none
+          group_type: group
+          admin_label: ''
+          label: ''
+          exclude: false
+          alter:
+            alter_text: false
+            text: ''
+            make_link: true
+            path: '{{ link__uri }}'
+            absolute: false
+            external: false
+            replace_spaces: false
+            path_case: none
+            trim_whitespace: false
+            alt: ''
+            rel: ''
+            link_class: ''
+            prefix: ''
+            suffix: ''
+            target: ''
+            nl2br: false
+            max_length: 0
+            word_boundary: true
+            ellipsis: true
+            more_link: false
+            more_link_text: ''
+            more_link_path: ''
+            strip_tags: false
+            trim: false
+            preserve_tags: ''
+            html: false
+          element_type: ''
+          element_class: ''
+          element_label_type: ''
+          element_label_class: ''
+          element_label_colon: false
+          element_wrapper_type: ''
+          element_wrapper_class: ''
+          element_default_classes: true
+          empty: ''
+          hide_empty: false
+          empty_zero: false
+          hide_alter_empty: true
+          click_sort_column: value
+          type: string
+          settings:
+            link_to_entity: false
+          group_column: value
+          group_columns: {  }
+          group_rows: true
+          delta_limit: 0
+          delta_offset: 0
+          delta_reversed: false
+          delta_first_last: false
+          multi_type: separator
+          separator: ', '
+          field_api_classes: false
+          entity_type: shortcut
+          entity_field: title
+          plugin_id: field
+      filters: {  }
+      sorts:
+        weight:
+          id: weight
+          table: shortcut_field_data
+          field: weight
+          relationship: none
+          group_type: group
+          admin_label: ''
+          order: ASC
+          exposed: false
+          expose:
+            label: ''
+          entity_type: shortcut
+          entity_field: weight
+          plugin_id: standard
+      title: Shortcuts
+      header: {  }
+      footer: {  }
+      empty: {  }
+      relationships: {  }
+      arguments:
+        shortcut_set:
+          id: shortcut_set
+          table: shortcut_field_data
+          field: shortcut_set
+          relationship: none
+          group_type: group
+          admin_label: ''
+          default_action: default
+          exception:
+            value: all
+            title_enable: false
+            title: All
+          title_enable: false
+          title: ''
+          default_argument_type: current_shortcut_set
+          default_argument_options: {  }
+          default_argument_skip_url: false
+          summary_options:
+            base_path: ''
+            count: true
+            items_per_page: 25
+            override: false
+          summary:
+            sort_order: asc
+            number_of_records: 0
+            format: default_summary
+          specify_validation: false
+          validate:
+            type: none
+            fail: 'not found'
+          validate_options: {  }
+          glossary: false
+          limit: 0
+          case: none
+          path_case: none
+          transform_dash: false
+          break_phrase: false
+          entity_type: shortcut
+          entity_field: shortcut_set
+          plugin_id: string
+      display_extenders: {  }
+    cache_metadata:
+      contexts:
+        - 'languages:language_content'
+        - 'languages:language_interface'
+        - url
+        - user
+      cacheable: false
+  shortcut_block:
+    display_plugin: block
+    id: shortcut_block
+    display_title: Block
+    position: 1
+    display_options:
+      display_extenders: {  }
+      block_category: Menus
+    cache_metadata:
+      contexts:
+        - 'languages:language_content'
+        - 'languages:language_interface'
+        - url
+        - user
+      cacheable: false
diff --git a/core/modules/shortcut/config/schema/shortcut.views.schema.yml b/core/modules/shortcut/config/schema/shortcut.views.schema.yml
new file mode 100644
index 0000000..34fb420
--- /dev/null
+++ b/core/modules/shortcut/config/schema/shortcut.views.schema.yml
@@ -0,0 +1,8 @@
+# Schema for the views plugins of the Shortcut module.
+
+views.argument_default.current_shortcut_set:
+  type: sequence
+  label: 'Shortcut set assigned to current user'
+  sequence:
+    type: string
+    label: 'Shortcut set'
diff --git a/core/modules/shortcut/src/Entity/Shortcut.php b/core/modules/shortcut/src/Entity/Shortcut.php
index a2179f9..0616d0f 100644
--- a/core/modules/shortcut/src/Entity/Shortcut.php
+++ b/core/modules/shortcut/src/Entity/Shortcut.php
@@ -25,6 +25,7 @@
  *   label = @Translation("Shortcut link"),
  *   handlers = {
  *     "access" = "Drupal\shortcut\ShortcutAccessControlHandler",
+ *     "views_data" = "Drupal\views\EntityViewsData",
  *     "form" = {
  *       "default" = "Drupal\shortcut\ShortcutForm",
  *       "add" = "Drupal\shortcut\ShortcutForm",
diff --git a/core/modules/shortcut/src/Plugin/Block/ShortcutsBlock.php b/core/modules/shortcut/src/Plugin/Block/ShortcutsBlock.php
deleted file mode 100644
index 379d74d..0000000
--- a/core/modules/shortcut/src/Plugin/Block/ShortcutsBlock.php
+++ /dev/null
@@ -1,41 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\shortcut\Plugin\Block\ShortcutsBlock.
- */
-
-namespace Drupal\shortcut\Plugin\Block;
-
-use Drupal\Core\Access\AccessResult;
-use Drupal\Core\Block\BlockBase;
-use Drupal\Core\Session\AccountInterface;
-
-/**
- * Provides a 'Shortcut' block.
- *
- * @Block(
- *   id = "shortcuts",
- *   admin_label = @Translation("Shortcuts"),
- *   category = @Translation("Menus")
- * )
- */
-class ShortcutsBlock extends BlockBase {
-
-  /**
-   * {@inheritdoc}
-   */
-  public function build() {
-    return array(
-      shortcut_renderable_links(shortcut_current_displayed_set()),
-    );
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function blockAccess(AccountInterface $account) {
-    return AccessResult::allowedIfHasPermission($account, 'access shortcuts');
-  }
-
-}
diff --git a/core/modules/shortcut/src/Plugin/views/argument_default/CurrentShortcutSet.php b/core/modules/shortcut/src/Plugin/views/argument_default/CurrentShortcutSet.php
new file mode 100644
index 0000000..c0af122
--- /dev/null
+++ b/core/modules/shortcut/src/Plugin/views/argument_default/CurrentShortcutSet.php
@@ -0,0 +1,46 @@
+<?php
+
+/**
+ * @file
+ * Contains Drupal\shortcut\Plugin\views\argument_default\CurrentShortcutSet.
+ */
+
+namespace Drupal\shortcut\Plugin\views\argument_default;
+
+use Drupal\views\Plugin\CacheablePluginInterface;
+use Drupal\views\Plugin\views\argument_default\ArgumentDefaultPluginBase;
+
+/**
+ * Default argument plugin to extract the shortcut set assigned to current user.
+ *
+ * @ViewsArgumentDefault(
+ *   id = "current_shortcut_set",
+ *   title = @Translation("Shortcut set assigned to current user")
+ * )
+ */
+class CurrentShortcutSet extends ArgumentDefaultPluginBase implements CacheablePluginInterface {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getArgument() {
+    /** @var \Drupal\shortcut\ShortcutSetInterface $shortcut_set */
+    $shortcut_set = shortcut_current_displayed_set();
+    return $shortcut_set->id();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function isCacheable() {
+    return TRUE;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getCacheContexts() {
+    return ['user'];
+  }
+
+}
diff --git a/core/modules/shortcut/src/Tests/ShortcutLinksTest.php b/core/modules/shortcut/src/Tests/ShortcutLinksTest.php
index 52ec545..6606b3d 100644
--- a/core/modules/shortcut/src/Tests/ShortcutLinksTest.php
+++ b/core/modules/shortcut/src/Tests/ShortcutLinksTest.php
@@ -354,7 +354,7 @@ private function verifyAccessShortcutsPermissionForEditPages() {
    */
   public function testShortcutBlockAccess() {
     // Creates a block instance and place in a region through api.
-    $block = $this->drupalPlaceBlock('shortcuts');
+    $block = $this->drupalPlaceBlock('views_block:shortcuts-shortcut_block');
 
     // Verify that users with the 'access shortcuts' permission can see the
     // shortcut block.
diff --git a/core/modules/shortcut/tests/src/Functional/ShortcutBlockTest.php b/core/modules/shortcut/tests/src/Functional/ShortcutBlockTest.php
new file mode 100644
index 0000000..66aae44
--- /dev/null
+++ b/core/modules/shortcut/tests/src/Functional/ShortcutBlockTest.php
@@ -0,0 +1,55 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Tests\shortcut\Functional\ShortcutBlockTest.
+ */
+
+namespace Drupal\Tests\shortcut\Functional;
+
+use Drupal\simpletest\BrowserTestBase;
+
+/**
+ * Tests Shortcuts block.
+ *
+ * @group shortcut
+ *
+ * @runTestsInSeparateProcesses
+ * @preserveGlobalState disabled
+ */
+class ShortcutBlockTest extends BrowserTestBase {
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = array('block', 'shortcut', 'views');
+
+  /**
+   * Tests shortcuts block.
+   */
+  public function testShortcutBlock() {
+    // Creates a block instance and place in a region through api.
+    $block = $this->drupalPlaceBlock('views_block:shortcuts-shortcut_block');
+    $account = $this->drupalCreateUser(['access shortcuts', 'administer blocks']);
+    $this->drupalLogin($account);
+    /** @var \Drupal\Core\Entity\EntityManagerInterface $entity_manager */
+    $entity_manager = $this->container->get('entity.manager');
+    $shortcut_storage = $entity_manager->getStorage('shortcut');
+
+    $shortcut = $shortcut_storage->create([
+      'title' => $this->randomString(),
+      'link' => 'internal:/admin/structure/block',
+      'shortcut_set' => 'default',
+    ]);
+    $shortcut_storage->save($shortcut);
+    // Visit the homepage.
+    $this->drupalGet('');
+    $this->assertSession()->statusCodeEquals(200);
+    // Check that block appears on the page with shortcut link.
+    $this->getSession()->getPage()->find('css', '#block-' . $block->id());
+    $this->getSession()->getPage()->find('css', 'a[href="/admin/structure/block"]');
+  }
+
+}
diff --git a/core/modules/simpletest/src/BlockCreationTrait.php b/core/modules/simpletest/src/BlockCreationTrait.php
new file mode 100644
index 0000000..18165f3
--- /dev/null
+++ b/core/modules/simpletest/src/BlockCreationTrait.php
@@ -0,0 +1,77 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\simpletest\BlockCreationTrait.
+ */
+
+namespace Drupal\simpletest;
+
+use Drupal\block\Entity\Block;
+use Drupal\Core\Cache\Cache;
+
+/**
+ * Provides methods to create and place block with default settings.
+ *
+ * This trait is meant to be used only by test classes.
+ */
+trait BlockCreationTrait {
+
+  /**
+   * Creates a block instance based on default settings.
+   *
+   * @param string $plugin_id
+   *   The plugin ID of the block type for this block instance.
+   * @param array $settings
+   *   (optional) An associative array of settings for the block entity.
+   *   Override the defaults by specifying the key and value in the array, for
+   *   example:
+   *   @code
+   *     $this->drupalPlaceBlock('system_powered_by_block', array(
+   *       'label' => t('Hello, world!'),
+   *     ));
+   *   @endcode
+   *   The following defaults are provided:
+   *   - label: Random string.
+   *   - ID: Random string.
+   *   - region: 'sidebar_first'.
+   *   - theme: The default theme.
+   *   - visibility: Empty array.
+   *   - cache: array('max_age' => Cache::PERMANENT).
+   *
+   * @return \Drupal\block\Entity\Block
+   *   The block entity.
+   *
+   * @todo
+   *   Add support for creating custom block instances.
+   */
+  protected function drupalPlaceBlock($plugin_id, array $settings = array()) {
+    $config = \Drupal::configFactory();
+    $settings += array(
+      'plugin' => $plugin_id,
+      'region' => 'sidebar_first',
+      'id' => strtolower($this->randomMachineName(8)),
+      'theme' => $config->get('system.theme')->get('default'),
+      'label' => $this->randomMachineName(8),
+      'visibility' => array(),
+      'weight' => 0,
+      'cache' => array(
+        'max_age' => Cache::PERMANENT,
+      ),
+    );
+    $values = [];
+    foreach (array('region', 'id', 'theme', 'plugin', 'weight', 'visibility') as $key) {
+      $values[$key] = $settings[$key];
+      // Remove extra values that do not belong in the settings array.
+      unset($settings[$key]);
+    }
+    foreach ($values['visibility'] as $id => $visibility) {
+      $values['visibility'][$id]['id'] = $id;
+    }
+    $values['settings'] = $settings;
+    $block = Block::create($values);
+    $block->save();
+    return $block;
+  }
+
+}
diff --git a/core/modules/simpletest/src/BrowserTestBase.php b/core/modules/simpletest/src/BrowserTestBase.php
index cd77a98..7fa089f 100644
--- a/core/modules/simpletest/src/BrowserTestBase.php
+++ b/core/modules/simpletest/src/BrowserTestBase.php
@@ -53,6 +53,7 @@
 abstract class BrowserTestBase extends \PHPUnit_Framework_TestCase {
 
   use SessionTestTrait;
+  use BlockCreationTrait;
 
   /**
    * Class loader.
diff --git a/core/modules/simpletest/src/WebTestBase.php b/core/modules/simpletest/src/WebTestBase.php
index 6bd21a5..28569d6 100644
--- a/core/modules/simpletest/src/WebTestBase.php
+++ b/core/modules/simpletest/src/WebTestBase.php
@@ -41,7 +41,7 @@
 abstract class WebTestBase extends TestBase {
 
   use AssertContentTrait;
-
+  use BlockCreationTrait;
   use UserCreationTrait {
     createUser as drupalCreateUser;
     createRole as drupalCreateRole;
@@ -366,62 +366,6 @@ protected function drupalBuildEntityView(EntityInterface $entity, $view_mode = '
   }
 
   /**
-   * Creates a block instance based on default settings.
-   *
-   * @param string $plugin_id
-   *   The plugin ID of the block type for this block instance.
-   * @param array $settings
-   *   (optional) An associative array of settings for the block entity.
-   *   Override the defaults by specifying the key and value in the array, for
-   *   example:
-   *   @code
-   *     $this->drupalPlaceBlock('system_powered_by_block', array(
-   *       'label' => t('Hello, world!'),
-   *     ));
-   *   @endcode
-   *   The following defaults are provided:
-   *   - label: Random string.
-   *   - ID: Random string.
-   *   - region: 'sidebar_first'.
-   *   - theme: The default theme.
-   *   - visibility: Empty array.
-   *   - cache: array('max_age' => Cache::PERMANENT).
-   *
-   * @return \Drupal\block\Entity\Block
-   *   The block entity.
-   *
-   * @todo
-   *   Add support for creating custom block instances.
-   */
-  protected function drupalPlaceBlock($plugin_id, array $settings = array()) {
-    $settings += array(
-      'plugin' => $plugin_id,
-      'region' => 'sidebar_first',
-      'id' => strtolower($this->randomMachineName(8)),
-      'theme' => $this->config('system.theme')->get('default'),
-      'label' => $this->randomMachineName(8),
-      'visibility' => array(),
-      'weight' => 0,
-      'cache' => array(
-        'max_age' => Cache::PERMANENT,
-      ),
-    );
-    $values = [];
-    foreach (array('region', 'id', 'theme', 'plugin', 'weight', 'visibility') as $key) {
-      $values[$key] = $settings[$key];
-      // Remove extra values that do not belong in the settings array.
-      unset($settings[$key]);
-    }
-    foreach ($values['visibility'] as $id => $visibility) {
-      $values['visibility'][$id]['id'] = $id;
-    }
-    $values['settings'] = $settings;
-    $block = entity_create('block', $values);
-    $block->save();
-    return $block;
-  }
-
-  /**
    * Checks to see whether a block appears on the page.
    *
    * @param \Drupal\block\Entity\Block $block
diff --git a/core/modules/system/src/Tests/System/TrustedHostsTest.php b/core/modules/system/src/Tests/System/TrustedHostsTest.php
index e54decc..feaaef5 100644
--- a/core/modules/system/src/Tests/System/TrustedHostsTest.php
+++ b/core/modules/system/src/Tests/System/TrustedHostsTest.php
@@ -87,7 +87,7 @@ public function testFakeRequests() {
    * Tests that shortcut module works together with host verification.
    */
   public function testShortcut() {
-    $this->container->get('module_installer')->install(['block', 'shortcut']);
+    $this->container->get('module_installer')->install(['block', 'shortcut', 'views']);
     $this->rebuildContainer();
     $this->container->get('router.builder')->rebuild();
 
@@ -109,7 +109,7 @@ public function testShortcut() {
     $role = $role_storage->load(reset($roles));
     $role->grantPermission('access shortcuts')->save();
 
-    $this->drupalPlaceBlock('shortcuts');
+    $this->drupalPlaceBlock('views_block:shortcuts-shortcut_block');
 
     $this->drupalGet('');
     $this->assertLink($shortcut->label());
