diff --git a/core/lib/Drupal/Core/Entity/EntityListBuilder.php b/core/lib/Drupal/Core/Entity/EntityListBuilder.php
index 7f46915..4166a3b 100644
--- a/core/lib/Drupal/Core/Entity/EntityListBuilder.php
+++ b/core/lib/Drupal/Core/Entity/EntityListBuilder.php
@@ -210,8 +210,6 @@ public function buildOperations(EntityInterface $entity) {
    * {@inheritdoc}
    *
    * Builds the entity listing as renderable array for table.html.twig.
-   *
-   * @todo Add a link to add a new item to the #empty text.
    */
   public function render() {
     $build['table'] = [
@@ -219,7 +217,7 @@ public function render() {
       '#header' => $this->buildHeader(),
       '#title' => $this->getTitle(),
       '#rows' => [],
-      '#empty' => $this->t('There is no @label yet.', ['@label' => $this->entityType->getLabel()]),
+      '#empty' => $this->getEmptyText(),
       '#cache' => [
         'contexts' => $this->entityType->getListCacheContexts(),
         'tags' => $this->entityType->getListCacheTags(),
@@ -250,4 +248,65 @@ protected function getTitle() {
     return;
   }
 
+  /**
+   * Returns the text to display when the list is empty.
+   *
+   * @return string
+   *   The translated empty text.
+   */
+  protected function getEmptyText() {
+    $empty_text = (string) $this->t('There is no @label yet.', [
+      '@label' => $this->entityType->getLabel(),
+    ]);
+
+    // Append the add link if it exists and is accessible.
+    $add_link = $this->getAddLink();
+    if (!empty($add_link)) {
+      $empty_text = $empty_text . ' ' . (string) $add_link;
+    }
+
+    return $empty_text;
+  }
+
+  /**
+   * Returns the text for the "Add new entity" link.
+   *
+   * @return \Drupal\Core\StringTranslation\TranslatableMarkup
+   *   The translatable link text.
+   */
+  protected function getAddLinkText() {
+    return $this->t('Add a new @label entity.', [
+      '@label' => $this->entityType->getLabel(),
+    ]);
+  }
+
+  /**
+   * Returns a link to add a new entity.
+   *
+   * @return string|false
+   *   The HTML link or FALSE if no link is available.
+   */
+  protected function getAddLink() {
+    if (has 'add-page') {
+      use add-page;
+    }
+    elseif (has 'add-form') {
+      use add-form;
+    }
+    return FALSE;
+
+    // @todo Dependency injection.
+    if ($this->entityType->hasLinkTemplate('add-entity-form') && \Drupal::entityManager()->getAccessController($this->entityTypeId)->createAccess()) {
+      return \Drupal::linkGenerator()->generate(
+        $this->getAddLinkText(),
+        // @todo The link templates are now defined as a URI instead of a route.
+        $this->entityType->getLinkTemplate('add-entity-form')
+      );
+    }
+    // @todo Micro-optimization: this else statement is not needed.
+    else {
+      return FALSE;
+    }
+  }
+
 }
