diff --git a/core/lib/Drupal/Core/Entity/EntityFormController.php b/core/lib/Drupal/Core/Entity/EntityFormController.php
index 440aa50..143d438 100644
--- a/core/lib/Drupal/Core/Entity/EntityFormController.php
+++ b/core/lib/Drupal/Core/Entity/EntityFormController.php
@@ -217,7 +217,6 @@ protected function actionsElement(array $form, array &$form_state) {
     $count = 0;
     foreach (element_children($element) as $action) {
       $element[$action] += array(
-        '#type' => 'submit',
         '#weight' => ++$count * 5,
       );
     }
@@ -231,30 +230,40 @@ protected function actionsElement(array $form, array &$form_state) {
 
   /**
    * Returns an array of supported actions for the current entity form.
+   *
+   * @todo Consider introducing a 'preview' action here, since it is used by
+   *   many entity types.
    */
   protected function actions(array $form, array &$form_state) {
-    return array(
-      // @todo Rename the action key from submit to save.
-      'submit' => array(
-        '#value' => $this->t('Save'),
-        '#validate' => array(
-          array($this, 'validate'),
-        ),
-        '#submit' => array(
-          array($this, 'submit'),
-          array($this, 'save'),
-        ),
+    // @todo Rename the action key from submit to save.
+    $actions['submit'] = array(
+      '#value' => $this->t('Save'),
+      '#validate' => array(
+        array($this, 'validate'),
       ),
-      'delete' => array(
-        '#value' => $this->t('Delete'),
-        // No need to validate the form when deleting the entity.
-        '#submit' => array(
-          array($this, 'delete'),
-        ),
+      '#submit' => array(
+        array($this, 'submit'),
+        array($this, 'save'),
       ),
-      // @todo Consider introducing a 'preview' action here, since it is used by
-      // many entity types.
+      '#type' => 'submit',
     );
+
+    if ($this->entity->hasLinkTemplate('delete-form') && !$this->entity->isNew()) {
+      $route_info = $this->entity->urlInfo('delete-form');
+      $route_info += array(
+        'route_parameters' => array(),
+      );
+      $actions['delete'] = array(
+        '#type' => 'link',
+        '#title' => $this->t('Delete'),
+        '#class' => array('button--danger'),
+        '#options' => $route_info['options'],
+        '#route_name' => $route_info['route_name'],
+        '#route_parameters' => $route_info['route_parameters'],
+      );
+    }
+
+    return $actions;
   }
 
   /**
@@ -302,26 +311,6 @@ public function save(array $form, array &$form_state) {
   }
 
   /**
-   * Form submission handler for the 'delete' action.
-   *
-   * @param array $form
-   *   An associative array containing the structure of the form.
-   * @param array $form_state
-   *   A reference to a keyed array containing the current state of the form.
-   */
-  public function delete(array $form, array &$form_state) {
-    if ($this->entity->hasLinkTemplate('delete-form')) {
-      $form_state['redirect_route'] = $this->entity->urlInfo('delete-form');
-
-      $query = $this->getRequest()->query;
-      if ($query->has('destination')) {
-        $form_state['redirect_route']['options']['query']['destination'] = $query->get('destination');
-        $query->remove('destination');
-      }
-    }
-  }
-
-  /**
    * {@inheritdoc}
    */
   public function getFormLangcode(array &$form_state) {
diff --git a/core/modules/block/lib/Drupal/block/Tests/BlockTest.php b/core/modules/block/lib/Drupal/block/Tests/BlockTest.php
index e7b99e1..b3489e2 100644
--- a/core/modules/block/lib/Drupal/block/Tests/BlockTest.php
+++ b/core/modules/block/lib/Drupal/block/Tests/BlockTest.php
@@ -137,7 +137,7 @@ function testBlock() {
 
     // Test deleting the block from the edit form.
     $this->drupalGet('admin/structure/block/manage/' . $block['id']);
-    $this->drupalPostForm(NULL, array(), t('Delete'));
+    $this->clickLink(t('Delete'));
     $this->assertRaw(t('Are you sure you want to delete the block %name?', array('%name' => $block['settings[label]'])));
     $this->drupalPostForm(NULL, array(), t('Delete'));
     $this->assertRaw(t('The block %name has been removed.', array('%name' => $block['settings[label]'])));
diff --git a/core/modules/forum/lib/Drupal/forum/Form/ForumFormController.php b/core/modules/forum/lib/Drupal/forum/Form/ForumFormController.php
index ae16f90..ae730ce 100644
--- a/core/modules/forum/lib/Drupal/forum/Form/ForumFormController.php
+++ b/core/modules/forum/lib/Drupal/forum/Form/ForumFormController.php
@@ -101,14 +101,23 @@ public function save(array $form, array &$form_state) {
   /**
    * {@inheritdoc}
    */
-  public function delete(array $form, array &$form_state) {
-    $form_state['redirect_route'] = $this->entity->urlInfo('forum-delete-form');
-
-    $query = $this->getRequest()->query;
-    if ($query->has('destination')) {
-      $form_state['redirect_route']['options']['query']['destination'] = $query->get('destination');
-      $query->remove('destination');
+  protected function actions(array $form, array &$form_state) {
+    $actions = parent::actions($form, $form_state);
+
+    if ($this->entity->hasLinkTemplate('forum-delete-form') && !$this->entity->isNew()) {
+      $route_info = $this->entity->urlInfo('forum-delete-form');
+      $route_info += array(
+        'route_parameters' => array(),
+      );
+      $actions['delete']['#options'] = $route_info['options'];
+      $actions['delete']['#route_name'] = $route_info['route_name'];
+      $actions['delete']['#route_parameters'] = $route_info['route_parameters'];
+    }
+    else {
+      unset($actions['delete']);
     }
+
+    return $actions;
   }
 
   /**
diff --git a/core/modules/forum/lib/Drupal/forum/Tests/ForumTest.php b/core/modules/forum/lib/Drupal/forum/Tests/ForumTest.php
index a706f74..2e34305 100644
--- a/core/modules/forum/lib/Drupal/forum/Tests/ForumTest.php
+++ b/core/modules/forum/lib/Drupal/forum/Tests/ForumTest.php
@@ -307,7 +307,7 @@ private function doAdminTests($user) {
     // Test tags vocabulary form is not affected.
     $this->drupalGet('admin/structure/taxonomy/manage/tags');
     $this->assertFieldByName('op', t('Save'), 'Save button found.');
-    $this->assertFieldByName('op', t('Delete'), 'Delete button found.');
+    $this->assertLink(t('Delete'));
     // Test tags vocabulary term form is not affected.
     $this->drupalGet('admin/structure/taxonomy/manage/tags/add');
     $this->assertField('parent[]', 'Parent field found.');
@@ -408,7 +408,8 @@ function createForum($type, $parent = 0) {
    */
   function deleteForum($tid) {
     // Delete the forum.
-    $this->drupalPostForm('admin/structure/forum/edit/forum/' . $tid, array(), t('Delete'));
+    $this->drupalGet('admin/structure/forum/edit/forum/' . $tid);
+    $this->clickLink(t('Delete'));
     $this->assertText('Are you sure you want to delete the forum');
     $this->assertNoText('Add forum');
     $this->assertNoText('Add forum container');
diff --git a/core/modules/node/lib/Drupal/node/NodeFormController.php b/core/modules/node/lib/Drupal/node/NodeFormController.php
index 61767bd..92b6650 100644
--- a/core/modules/node/lib/Drupal/node/NodeFormController.php
+++ b/core/modules/node/lib/Drupal/node/NodeFormController.php
@@ -297,6 +297,7 @@ protected function actions(array $form, array &$form_state) {
         array($this, 'submit'),
         array($this, 'preview'),
       ),
+      '#type' => 'submit',
     );
 
     $element['delete']['#access'] = $node->access('delete');
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermTest.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermTest.php
index a84f400..57fef51 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermTest.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermTest.php
@@ -201,11 +201,13 @@ function testNodeTermCreationAndDeletion() {
     }
 
     // Delete term 1 from the term edit page.
-    $this->drupalPostForm('taxonomy/term/' . $term_objects['term1']->id() . '/edit', array(), t('Delete'));
+    $this->drupalGet('taxonomy/term/' . $term_objects['term1']->id() . '/edit');
+    $this->clickLink(t('Delete'));
     $this->drupalPostForm(NULL, NULL, t('Delete'));
 
     // Delete term 2 from the term delete page.
-    $this->drupalPostForm('taxonomy/term/' . $term_objects['term2']->id() . '/delete', array(), t('Delete'));
+    $this->drupalGet('taxonomy/term/' . $term_objects['term2']->id() . '/delete');
+    $this->clickLink(t('Delete'));
     $term_names = array($term_objects['term3']->label(), $term_objects['term4']->label());
 
     // Get the node.
@@ -359,7 +361,8 @@ function testTermInterface() {
     $this->drupalGet('taxonomy/term/' . $term->id() . '/feed');
 
     // Delete the term.
-    $this->drupalPostForm('taxonomy/term/' . $term->id() . '/edit', array(), t('Delete'));
+    $this->drupalGet('taxonomy/term/' . $term->id() . '/edit');
+    $this->clickLink(t('Delete'));
     $this->drupalPostForm(NULL, NULL, t('Delete'));
 
     // Assert that the term no longer exists.
