diff --git a/core/modules/block/custom_block/custom_block.views.inc b/core/modules/block/custom_block/custom_block.views.inc
new file mode 100644
index 0000000..26af18f
--- /dev/null
+++ b/core/modules/block/custom_block/custom_block.views.inc
@@ -0,0 +1,217 @@
+<?php
+
+/**
+ * @file
+ * Provide views data and handlers for custom_block.module.
+ *
+ * @ingroup views_module_handlers
+ */
+
+
+/**
+ * Implements hook_views_data().
+ */
+function custom_block_views_data() {
+  $data['custom_block']['table']['group'] = t('Custom block');
+
+  $data['custom_block']['table']['base'] = array(
+    'field' => 'id',
+    'title' => t('Custom block'),
+    'defaults' => array(
+      'field' => 'info',
+    ),
+  );
+
+  $data['custom_block']['table']['entity type'] = 'custom_block';
+
+  $data['custom_block']['id'] = array(
+    'title' => t('ID'),
+    'help' => t('The ID of the custom block.'),
+    'field' => array(
+      'id' => 'numeric',
+    ),
+    'filter' => array(
+      'id' => 'numeric',
+    ),
+    'argument' => array(
+      'id' => 'numeric',
+    ),
+    'sort' => array(
+      'id' => 'standard',
+    ),
+  );
+  $data['custom_block']['uuid'] = array(
+    'title' => t('UUID'),
+    'help' => t('The Universally Unique Identifier of the custom block.'),
+    'field' => array(
+      'id' => 'standard',
+    ),
+    'filter' => array(
+      'id' => 'string',
+    ),
+    'argument' => array(
+      'id' => 'string',
+    ),
+    'sort' => array(
+      'id' => 'standard',
+    ),
+  );
+  $data['custom_block']['info'] = array(
+    'title' => t('Information'),
+    'help' => t('The description of the custom block.'),
+    'field' => array(
+      'id' => 'standard',
+    ),
+    'filter' => array(
+      'id' => 'string',
+    ),
+    'argument' => array(
+      'id' => 'string',
+    ),
+    'sort' => array(
+      'id' => 'standard',
+    ),
+  );
+  $data['custom_block']['revision_id'] = array(
+    'title' => t('Revision ID'),
+    'help' => t('The revision ID of the custom block.'),
+    'field' => array(
+      'id' => 'numeric',
+    ),
+    'filter' => array(
+      'id' => 'numeric',
+    ),
+    'argument' => array(
+      'id' => 'numeric',
+    ),
+    'sort' => array(
+      'id' => 'standard',
+    ),
+    'relationship' => array(
+      'label' => t('Custom block revision'),
+      'base' => 'custom_block_revision',
+      'base field' => 'revision_id',
+    ),
+  );
+  $data['custom_block']['type'] = array();
+
+  if (Drupal::moduleHandler()->moduleExists('language')) {
+    $data['custom_block']['langcode'] = array(
+      'title' => t('Language'),
+      'help' => t('The language the custom block is in.'),
+      'field' => array(
+        'id' => 'language',
+      ),
+      'filter' => array(
+        'id' => 'language',
+      ),
+      'argument' => array(
+        'id' => 'language',
+      ),
+      'sort' => array(
+        'id' => 'standard',
+      ),
+    );
+  }
+
+  $data['custom_block']['view_link'] = array(
+    'title' => t('Link to custom block'),
+    'help' => t('Provide a simple link to the custom block.'),
+    'field' => array(
+      'id' => 'entity_link',
+    ),
+  );
+
+  $data['custom_block']['edit_link'] = array(
+    'title' => t('Link to edit the custom block'),
+    'help' => t('Provide a simple link to edit the custom block.'),
+    'field' => array(
+      'id' => 'custom_block_edit_link',
+    ),
+  );
+
+  $data['custom_block_revision']['table']['group'] = t('Custom block revisions');
+
+  $data['custom_block_revision']['table']['base'] = array(
+    'field' => 'revision_id',
+    'title' => t('Custom block revision'),
+    'defaults' => array(
+      'field' => 'revision_id',
+    ),
+  );
+
+  $data['custom_block_revision']['table']['entity type'] = 'custom_block';
+
+  $data['custom_block_revision']['id'] = array(
+    'title' => t('ID'),
+    'help' => t('The ID of the custom block revision.'),
+    'field' => array(
+      'id' => 'numeric',
+    ),
+    'filter' => array(
+      'id' => 'numeric',
+    ),
+    'argument' => array(
+      'id' => 'numeric',
+    ),
+    'sort' => array(
+      'id' => 'standard',
+    ),
+  );
+  $data['custom_block_revision']['revision_id'] = array(
+    'title' => t('Revision ID'),
+    'help' => t('The revision ID of the custom block.'),
+    'field' => array(
+      'id' => 'numeric',
+    ),
+    'filter' => array(
+      'id' => 'numeric',
+    ),
+    'argument' => array(
+      'id' => 'numeric',
+    ),
+    'sort' => array(
+      'id' => 'standard',
+    ),
+    'relationship' => array(
+      'id' => 'standard',
+      'label' => t('Custom block'),
+      'base' => 'custom_block',
+      'base field' => 'revision_id',
+    ),
+  );
+  $data['custom_block_revision']['log'] = array(
+    'title' => t('Log'),
+    'help' => t('The log entry explaining the changes in this version.'),
+    'field' => array(
+      'id' => 'standard',
+    ),
+    'filter' => array(
+      'id' => 'string',
+    ),
+    'argument' => array(
+      'id' => 'string',
+    ),
+    'sort' => array(
+      'id' => 'standard',
+    ),
+  );
+  $data['custom_block_revision']['info'] = array(
+    'title' => t('Information'),
+    'help' => t('The description of the custom block revision.'),
+    'field' => array(
+      'id' => 'standard',
+    ),
+    'filter' => array(
+      'id' => 'string',
+    ),
+    'argument' => array(
+      'id' => 'string',
+    ),
+    'sort' => array(
+      'id' => 'standard',
+    ),
+  );
+
+  return $data;
+}
diff --git a/core/modules/block/custom_block/lib/Drupal/custom_block/Plugin/views/field/DeleteLink.php b/core/modules/block/custom_block/lib/Drupal/custom_block/Plugin/views/field/DeleteLink.php
new file mode 100644
index 0000000..56023d3
--- /dev/null
+++ b/core/modules/block/custom_block/lib/Drupal/custom_block/Plugin/views/field/DeleteLink.php
@@ -0,0 +1,37 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\custom_block\Plugin\views\field\DeleteLink.
+ */
+
+namespace Drupal\custom_block\Plugin\views\field;
+
+use Drupal\Component\Annotation\PluginID;
+use Drupal\Core\Entity\EntityInterface;
+use Drupal\views\Plugin\views\field\EntityLink;
+
+/**
+ * Defines a field handler to provide a link to delete a custom block.
+ *
+ * @ingroup views_field_handlers
+ *
+ * @PluginID("custom_block_link_delete")
+ */
+class DeleteLink extends EntityLink {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected $operation = 'delete';
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getEntityPath(EntityInterface $entity) {
+    $uri = $entity->uri();
+    $path = $uri['path'] . '/delete';
+    return $path;
+  }
+
+}
diff --git a/core/modules/block/custom_block/lib/Drupal/custom_block/Plugin/views/field/EditLink.php b/core/modules/block/custom_block/lib/Drupal/custom_block/Plugin/views/field/EditLink.php
new file mode 100644
index 0000000..e77c389
--- /dev/null
+++ b/core/modules/block/custom_block/lib/Drupal/custom_block/Plugin/views/field/EditLink.php
@@ -0,0 +1,37 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\custom_block\Plugin\views\field\EditLink.
+ */
+
+namespace Drupal\custom_block\Plugin\views\field;
+
+use Drupal\Component\Annotation\PluginID;
+use Drupal\Core\Entity\EntityInterface;
+use Drupal\views\Plugin\views\field\EntityLink;
+
+/**
+ * Defines a field handler to provide a link to edit a custom block
+ *
+ * @ingroup views_field_handlers
+ *
+ * @PluginID("custom_block_link_edit")
+ */
+class EditLink extends EntityLink {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected $operation = 'edit';
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getEntityPath(EntityInterface $entity) {
+    $uri = $entity->uri();
+    $path = $uri['path'] . '/edit';
+    return $path;
+  }
+
+}
diff --git a/core/modules/block/custom_block/lib/Drupal/custom_block/Plugin/views/field/ViewRevisionLink.php b/core/modules/block/custom_block/lib/Drupal/custom_block/Plugin/views/field/ViewRevisionLink.php
new file mode 100644
index 0000000..99dfd3b
--- /dev/null
+++ b/core/modules/block/custom_block/lib/Drupal/custom_block/Plugin/views/field/ViewRevisionLink.php
@@ -0,0 +1,37 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\custom_block\Plugin\views\field\ViewRevisionLink.
+ */
+
+namespace Drupal\custom_block\Plugin\views\field;
+
+use Drupal\Component\Annotation\PluginID;
+use Drupal\Core\Entity\EntityInterface;
+use Drupal\views\Plugin\views\field\EntityLink;
+
+/**
+ * Defines a field handler to link to a revision of a custom block.
+ *
+ * @ingroup views_field_handlers
+ *
+ * @PluginID("custom_block_link_view")
+ */
+class ViewRevisionLink extends EntityLink {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected $operation = 'view';
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getEntityPath(EntityInterface $entity) {
+    $uri = $entity->uri();
+    $path = $uri['path'] . '/delete';
+    return $path;
+  }
+
+}
diff --git a/core/modules/views/lib/Drupal/views/Plugin/views/field/EntityLink.php b/core/modules/views/lib/Drupal/views/Plugin/views/field/EntityLink.php
new file mode 100644
index 0000000..75e58ed
--- /dev/null
+++ b/core/modules/views/lib/Drupal/views/Plugin/views/field/EntityLink.php
@@ -0,0 +1,96 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\views\Plugin\views\field\EntityLink.
+ */
+
+namespace Drupal\views\Plugin\views\field;
+
+use Drupal\Component\Annotation\PluginID;
+use Drupal\Core\Entity\EntityInterface;
+
+/**
+ * Defines a generic field handler to render a link to an entity type.
+ *
+ * @ingroup views_field_handlers
+ *
+ * @PluginID("entity_link")
+ */
+class EntityLink extends FieldPluginBase {
+
+  /**
+   * The operation of the link, for example "view" or "edit".
+   *
+   * @var string
+   */
+  protected $operation = 'view';
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function defineOptions() {
+    $options = parent::defineOptions();
+
+    $options['text'] = array('default' => '', 'translatable' => TRUE);
+    return $options;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildOptionsForm(&$form, &$form_state) {
+    parent::buildOptionsForm($form, $form_state);
+    $form['text'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Text to display'),
+      '#default_value' => $this->options['text'],
+    );
+
+    // The path is set by renderLink function so don't allow to set it.
+    $form['alter']['path']['#access'] = FALSE;
+    $form['alter']['external']['#access'] = FALSE;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function usesGroupBy() {
+    return FALSE;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function render($values) {
+    $value = $this->get_value($values);
+    return $this->renderLink($value, $values);
+  }
+
+  /**
+   * Render a link to an entity.
+   */
+  protected function renderLink($value, $values) {
+    if (($entity = $this->get_entity($values)) && $entity->access($this->operation)) {
+      $this->options['alter']['make_link'] = TRUE;
+      $this->options['alter']['path'] = $this->getEntityPath($entity);
+
+      return $value;
+    }
+  }
+
+  /**
+   * Get the path of the entity link.
+   *
+   * @param \Drupal\Core\Entity\EntityInterface $entity
+   *   The entity to link to.
+   *
+   * @return string
+   *   Returns the link to the entity with a certain operation.
+   */
+  protected function getEntityPath(EntityInterface $entity) {
+    $uri = $entity->uri();
+    return $uri['path'];
+  }
+
+}
