diff --git a/core/modules/workflows/src/Form/WorkflowEditForm.php b/core/modules/workflows/src/Form/WorkflowEditForm.php
index 764c0c9..d4f2516 100644
--- a/core/modules/workflows/src/Form/WorkflowEditForm.php
+++ b/core/modules/workflows/src/Form/WorkflowEditForm.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\workflows\Form;
 
+use Drupal\Component\Serialization\Json;
 use Drupal\Core\Form\SubformState;
 use Drupal\workflows\WorkflowTypeFormInterface;
 use Drupal\workflows\Entity\Workflow;
@@ -131,6 +132,9 @@ public function form(array $form, FormStateInterface $form_state) {
       '#title' => $this->t('Transitions'),
       '#open' => TRUE,
     ];
+    $form['transitions_container']['modal-messages'] = [
+      '#type' => 'container',
+    ];
     $form['transitions_container']['transitions'] = [
       '#type' => 'table',
       '#header' => $header,
@@ -148,16 +152,33 @@ public function form(array $form, FormStateInterface $form_state) {
       $links['edit'] = [
         'title' => $this->t('Edit'),
         'url' => Url::fromRoute('entity.workflow.edit_transition_form', ['workflow' => $workflow->id(), 'workflow_transition' => $transition->id()]),
-        'attributes' => ['aria-label' => $this->t('Edit \'@transition\' transition', ['@transition' => $transition->label()])],
+        'attributes' => [
+          'aria-label' => $this->t('Edit \'@transition\' transition', ['@transition' => $transition->label()]),
+          'class' => ['use-ajax'],
+          'data-dialog-type' => 'modal',
+          'data-dialog-options' => Json::encode([
+            'width' => 700,
+          ]),
+        ],
       ];
       $links['delete'] = [
         'title' => t('Delete'),
         'url' => Url::fromRoute('entity.workflow.delete_transition_form', ['workflow' => $workflow->id(), 'workflow_transition' => $transition->id()]),
-        'attributes' => ['aria-label' => $this->t('Delete \'@transition\' transition', ['@transition' => $transition->label()])],
+        'attributes' => [
+          'aria-label' => $this->t('Delete \'@transition\' transition', ['@transition' => $transition->label()]),
+          'class' => ['use-ajax'],
+          'data-dialog-type' => 'modal',
+          'data-dialog-options' => Json::encode([
+            'width' => 700,
+          ]),
+        ],
       ];
       $form['transitions_container']['transitions'][$transition->id()] = [
         '#attributes' => ['class' => ['draggable']],
-        'label' => ['#markup' => $transition->label()],
+        'label' => [
+          '#type' => 'container',
+          '#markup' => $transition->label(),
+        ],
         '#weight' => $transition->weight(),
         'weight' => [
           '#type' => 'weight',
@@ -167,11 +188,13 @@ public function form(array $form, FormStateInterface $form_state) {
           '#attributes' => ['class' => ['transition-weight']],
         ],
         'from' => [
-          '#theme' => 'item_list',
-          '#items' => array_map([State::class, 'labelCallback'], $transition->from()),
-          '#context' => ['list_style' => 'comma-list'],
+          '#type' => 'container',
+          '#markup' => implode(', ', array_map([State::class, 'labelCallback'], $transition->from())),
+        ],
+        'to' => [
+          '#type' => 'container',
+          '#markup' => $transition->to()->label()
         ],
-        'to' => ['#markup' => $transition->to()->label()],
         'operations' => [
           '#type' => 'operations',
           '#links' => $links,
@@ -179,7 +202,16 @@ public function form(array $form, FormStateInterface $form_state) {
       ];
     }
     $form['transitions_container']['transition_add'] = [
-      '#markup' => $workflow->toLink($this->t('Add a new transition'), 'add-transition-form')->toString(),
+      '#type' => 'link',
+      '#title' => $this->t('Add a new transition'),
+      '#url' => Url::fromRoute('entity.workflow.add_transition_form', ['workflow' => $workflow->id()]),
+      '#attributes' => [
+        'class' => ['use-ajax'],
+        'data-dialog-type' => 'modal',
+        'data-dialog-options' => Json::encode([
+          'width' => 700,
+        ]),
+      ],
     ];
 
     if ($workflow->getTypePlugin() instanceof WorkflowTypeFormInterface) {
diff --git a/core/modules/workflows/src/Form/WorkflowTransitionAddForm.php b/core/modules/workflows/src/Form/WorkflowTransitionAddForm.php
index fe3a406..92f1a53 100644
--- a/core/modules/workflows/src/Form/WorkflowTransitionAddForm.php
+++ b/core/modules/workflows/src/Form/WorkflowTransitionAddForm.php
@@ -54,7 +54,7 @@ public function form(array $form, FormStateInterface $form_state) {
       '#options' => $states,
     ];
     $form['to'] = [
-      '#type' => 'radios',
+      '#type' => 'select',
       '#title' => $this->t('To'),
       '#required' => TRUE,
       '#default_value' => [],
diff --git a/core/modules/workflows/src/Form/WorkflowTransitionDeleteForm.php b/core/modules/workflows/src/Form/WorkflowTransitionDeleteForm.php
index abcb41e..7d85adb 100644
--- a/core/modules/workflows/src/Form/WorkflowTransitionDeleteForm.php
+++ b/core/modules/workflows/src/Form/WorkflowTransitionDeleteForm.php
@@ -6,6 +6,10 @@
 use Drupal\Core\Form\ConfirmFormBase;
 use Drupal\Core\Form\FormStateInterface;
 use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
+use Drupal\Core\Ajax\AjaxResponse;
+use Drupal\Core\Ajax\CloseDialogCommand;
+use Drupal\Core\Ajax\HtmlCommand;
+use Drupal\Core\Ajax\RemoveCommand;
 
 /**
  * Builds the form to delete transitions from Workflow entities.
@@ -83,8 +87,21 @@ public function buildForm(array $form, FormStateInterface $form_state, WorkflowI
     catch (\InvalidArgumentException $e) {
       throw new NotFoundHttpException();
     }
+    $this->transitionId = $this->transition->id();
     $this->workflow = $workflow;
-    return parent::buildForm($form, $form_state);
+
+    $form = parent::buildForm($form, $form_state);
+    $form['actions']['submit']['#ajax'] = [
+      'callback' => [$this, 'submitajaxcallback'],
+    ];
+    $form['actions']['cancel'] = [
+      '#type' => 'button',
+      '#value' => $this->getCancelText(),
+      '#ajax' => [
+        'callback' => [$this, 'cancelajaxcallback'],
+      ],
+    ];
+    return $form;
   }
 
   /**
@@ -92,11 +109,53 @@ public function buildForm(array $form, FormStateInterface $form_state, WorkflowI
    */
   public function submitForm(array &$form, FormStateInterface $form_state) {
     $this->workflow
-      ->deleteTransition($this->transition->id())
+      ->deleteTransition($this->transitionId)
       ->save();
 
     drupal_set_message($this->t('%transition transition deleted.', ['%transition' => $this->transition->label()]));
     $form_state->setRedirectUrl($this->getCancelUrl());
   }
 
+  /**
+   *  Ajax callback to close the modal and remove the deleted transition from
+   *  the table.
+   *
+   * @param array $form
+   *   An associative array containing the structure of the form.
+   * @param \Drupal\Core\Form\FormStateInterface $form_state
+   *   The current state of the form.
+   * @return \Drupal\Core\Ajax\AjaxResponse
+   *   An ajax response object.
+   */
+  public function submitAjaxCallback(array &$form, FormStateInterface $form_state) {
+
+    $response = new AjaxResponse();
+
+    $data_selector = 'edit-transitions-' . strtolower(str_replace('_', '-', $this->transitionId));
+
+    $response->addCommand(new CloseDialogCommand());
+    $response->addCommand(new RemoveCommand('[data-drupal-selector="' . $data_selector . '"]'));
+
+    $status_messages = ['#type' => 'status_messages'];
+    $response->addCommand(new HtmlCommand('[data-drupal-selector="edit-modal-messages"]', \Drupal::service('renderer')->renderRoot($status_messages)));
+
+    return $response;
+  }
+
+  /**
+   *  Ajax callback to close the modal when canceling the confirmation form.
+   *
+   * @param array $form
+   *   An associative array containing the structure of the form.
+   * @param \Drupal\Core\Form\FormStateInterface $form_state
+   *   The current state of the form.
+   * @return \Drupal\Core\Ajax\AjaxResponse
+   *   An ajax response object.
+   */
+  public function cancelAjaxCallback(array &$form, FormStateInterface $form_state) {
+    $response = new AjaxResponse();
+    $response->addCommand(new CloseDialogCommand());
+
+    return $response;
+  }
 }
diff --git a/core/modules/workflows/src/Form/WorkflowTransitionEditForm.php b/core/modules/workflows/src/Form/WorkflowTransitionEditForm.php
index 5bbabae..2b6de1f 100644
--- a/core/modules/workflows/src/Form/WorkflowTransitionEditForm.php
+++ b/core/modules/workflows/src/Form/WorkflowTransitionEditForm.php
@@ -7,6 +7,9 @@
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Url;
 use Drupal\workflows\State;
+use Drupal\Core\Ajax\AjaxResponse;
+use Drupal\Core\Ajax\CloseDialogCommand;
+use Drupal\Core\Ajax\HtmlCommand;
 
 /**
  * Class WorkflowTransitionEditForm.
@@ -69,7 +72,7 @@ public function form(array $form, FormStateInterface $form_state) {
       '#options' => $states,
     ];
     $form['to'] = [
-      '#type' => 'radios',
+      '#type' => 'select',
       '#title' => $this->t('To'),
       '#required' => TRUE,
       '#default_value' => $transition->to()->id(),
@@ -156,23 +159,80 @@ protected function actions(array $form, FormStateInterface $form_state) {
       '#type' => 'submit',
       '#value' => $this->t('Save'),
       '#submit' => ['::submitForm', '::save'],
+      '#ajax' => [
+        'callback' => [$this, 'submitajaxcallback'],
+      ],
     ];
-
-    $actions['delete'] = [
-      '#type' => 'link',
-      '#title' => $this->t('Delete'),
-      // Deleting a transition is editing a workflow.
-      '#access' => $this->entity->access('edit'),
-      '#attributes' => [
-        'class' => ['button', 'button--danger'],
+    $actions['cancel'] = [
+      '#type' => 'button',
+      '#value' => $this->t('Cancel'),
+      '#ajax' => [
+        'callback' => [$this, 'cancelajaxcallback'],
       ],
-      '#url' => Url::fromRoute('entity.workflow.delete_transition_form', [
-        'workflow' => $this->entity->id(),
-        'workflow_transition' => $this->transitionId
-      ])
     ];
 
     return $actions;
   }
 
+  /**
+   * Ajax callback to close the modal and update the label, from and to text.
+   *
+   * @return \Drupal\Core\Ajax\AjaxResponse
+   *   An ajax response object.
+   */
+  public function submitAjaxCallback(array &$form, FormStateInterface $form_state) {
+
+    $response = new AjaxResponse();
+
+    // Handle first any form errors.
+    $errors = $form_state->getErrors();
+    if (count($errors)) {
+      $form['status_messages'] = [
+        '#type' => 'status_messages',
+        '#weight' => -10,
+      ];
+      $response->addCommand(new HtmlCommand('#drupal-modal', $form));
+      return $response;
+    }
+
+    $workflow = $this->entity;
+    $transition = $workflow->getTransition($this->transitionId);
+    $data_selector = 'edit-transitions-' . strtolower(str_replace('_', '-', $this->transitionId));
+
+    $response->addCommand(new CloseDialogCommand());
+    $response->addCommand(new HtmlCommand('[data-drupal-selector="' . $data_selector . '-label"]', $transition->label()));
+    $response->addCommand(new HtmlCommand('[data-drupal-selector="' . $data_selector . '-from"]', implode(', ', array_map([State::class, 'labelCallback'], $transition->from()))));
+    $response->addCommand(new HtmlCommand('[data-drupal-selector="' . $data_selector . '-to]', $transition->to()->label()));
+
+    $status_messages = ['#type' => 'status_messages'];
+    $response->addCommand(new HtmlCommand('[data-drupal-selector="edit-modal-messages"]', \Drupal::service('renderer')->renderRoot($status_messages)));
+
+    return $response;
+  }
+
+  /**
+   *  Ajax callback to close the modal when canceling the confirmation form.
+   *
+   * @param array $form
+   *   An associative array containing the structure of the form.
+   * @param \Drupal\Core\Form\FormStateInterface $form_state
+   *   The current state of the form.
+   * @return \Drupal\Core\Ajax\AjaxResponse
+   *   An ajax response object.
+   */
+  public function cancelAjaxCallback(array &$form, FormStateInterface $form_state) {
+    $response = new AjaxResponse();
+    $response->addCommand(new CloseDialogCommand());
+
+    return $response;
+  }
+
+  /**
+   * Route title callback.
+   */
+  public function getTitle($workflow = NULL, $workflow_transition) {
+    $title = $this->t('Edit the @transition transition for the @workflow', ['@transition' => $workflow->getTransition($workflow_transition)->label(), '@workflow' => $workflow->label()]);
+    return $title;
+  }
+
 }
diff --git a/core/modules/workflows/workflows.routing.yml b/core/modules/workflows/workflows.routing.yml
index 329ed10..edd9ded 100644
--- a/core/modules/workflows/workflows.routing.yml
+++ b/core/modules/workflows/workflows.routing.yml
@@ -34,7 +34,7 @@ entity.workflow.edit_transition_form:
   path: '/admin/config/workflow/workflows/manage/{workflow}/transition/{workflow_transition}'
   defaults:
     _entity_form: 'workflow.edit-transition'
-    _title: 'Edit transition'
+    _title_callback: '\Drupal\workflows\Form\WorkflowTransitionEditForm::getTitle'
   requirements:
     _entity_access: 'workflow.edit'
 
