diff --git a/core/lib/Drupal/Core/EventSubscriber/RedirectResponseSubscriber.php b/core/lib/Drupal/Core/EventSubscriber/RedirectResponseSubscriber.php
index 8397bdef4e..199b07bec6 100644
--- a/core/lib/Drupal/Core/EventSubscriber/RedirectResponseSubscriber.php
+++ b/core/lib/Drupal/Core/EventSubscriber/RedirectResponseSubscriber.php
@@ -4,6 +4,7 @@
 
 use Drupal\Component\HttpFoundation\SecuredRedirectResponse;
 use Drupal\Component\Utility\UrlHelper;
+use Drupal\Core\Routing\IgnoreDestinationRedirectResponse;
 use Drupal\Core\Routing\LocalRedirectResponse;
 use Drupal\Core\Routing\RequestContext;
 use Drupal\Core\Utility\UnroutedUrlAssemblerInterface;
@@ -50,17 +51,19 @@ public function checkRedirectUrl(FilterResponseEvent $event) {
     if ($response instanceof RedirectResponse) {
       $request = $event->getRequest();
 
-      // Let the 'destination' query parameter override the redirect target.
-      // If $response is already a SecuredRedirectResponse, it might reject the
-      // new target as invalid, in which case proceed with the old target.
-      $destination = $request->query->get('destination');
-      if ($destination) {
-        // The 'Location' HTTP header must always be absolute.
-        $destination = $this->getDestinationAsAbsoluteUrl($destination, $request->getSchemeAndHttpHost());
-        try {
-          $response->setTargetUrl($destination);
-        }
-        catch (\InvalidArgumentException $e) {
+      if (!($response instanceof IgnoreDestinationRedirectResponse)) {
+        // Let the 'destination' query parameter override the redirect target.
+        // If $response is already a SecuredRedirectResponse, it might reject
+        // the new target as invalid, in which case proceed with the old target.
+        $destination = $request->query->get('destination');
+        if ($destination) {
+          // The 'Location' HTTP header must always be absolute.
+          $destination = $this->getDestinationAsAbsoluteUrl($destination, $request->getSchemeAndHttpHost());
+          try {
+            $response->setTargetUrl($destination);
+          }
+          catch (\InvalidArgumentException $e) {
+          }
         }
       }
 
diff --git a/core/lib/Drupal/Core/Form/FormState.php b/core/lib/Drupal/Core/Form/FormState.php
index 5585a76234..8957995179 100644
--- a/core/lib/Drupal/Core/Form/FormState.php
+++ b/core/lib/Drupal/Core/Form/FormState.php
@@ -138,6 +138,13 @@ class FormState implements FormStateInterface {
    */
   protected $redirect;
 
+  /**
+   * Used to ignore destination when redirecting.
+   *
+   * @var bool
+   */
+  protected $ignoreDestination = FALSE;
+
   /**
    * If set to TRUE the form will NOT perform a redirect, even if
    * self::$redirect is set.
@@ -1032,6 +1039,21 @@ public function getRedirect() {
     return $this->redirect;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function ignoreDestination($status = TRUE) {
+    $this->ignoreDestination = $status;
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getIgnoreDestination() {
+    return $this->ignoreDestination;
+  }
+
   /**
    * Sets the global status of errors.
    *
diff --git a/core/lib/Drupal/Core/Form/FormStateDecoratorBase.php b/core/lib/Drupal/Core/Form/FormStateDecoratorBase.php
index 2668f59a41..13da39e7a2 100644
--- a/core/lib/Drupal/Core/Form/FormStateDecoratorBase.php
+++ b/core/lib/Drupal/Core/Form/FormStateDecoratorBase.php
@@ -611,6 +611,20 @@ public function getRedirect() {
     return $this->decoratedFormState->getRedirect();
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function ignoreDestination($status = TRUE) {
+    return $this->decoratedFormState->ignoreDestination($status);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getIgnoreDestination() {
+    return $this->decoratedFormState->getIgnoreDestination();
+  }
+
   /**
    * {@inheritdoc}
    */
diff --git a/core/lib/Drupal/Core/Form/FormStateInterface.php b/core/lib/Drupal/Core/Form/FormStateInterface.php
index 43b2d8ebf6..7943cf2c13 100644
--- a/core/lib/Drupal/Core/Form/FormStateInterface.php
+++ b/core/lib/Drupal/Core/Form/FormStateInterface.php
@@ -158,6 +158,26 @@ public function setRedirectUrl(Url $url);
    */
   public function getRedirect();
 
+  /**
+   * Determines whether the redirect respects the destination query parameter.
+   *
+   * @param bool $status
+   *   (optional) TRUE if the redirect should take precedence over the
+   *   destination query parameter. FALSE if not. Defaults to TRUE.
+   *
+   * @return $this
+   */
+  public function ignoreDestination($status = TRUE);
+
+  /**
+   * Gets whether the redirect respects the destination query parameter.
+   *
+   * @return bool
+   *   TRUE if the redirect should take precedence over the destination query
+   *   parameter.
+   */
+  public function getIgnoreDestination();
+
   /**
    * Sets the entire set of arbitrary data.
    *
diff --git a/core/lib/Drupal/Core/Form/FormSubmitter.php b/core/lib/Drupal/Core/Form/FormSubmitter.php
index 4a4275ef8d..41344be3fa 100644
--- a/core/lib/Drupal/Core/Form/FormSubmitter.php
+++ b/core/lib/Drupal/Core/Form/FormSubmitter.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\Core\Form;
 
+use Drupal\Core\Routing\IgnoreDestinationRedirectResponse;
 use Drupal\Core\Url;
 use Symfony\Component\HttpFoundation\RedirectResponse;
 use Symfony\Component\HttpFoundation\RequestStack;
@@ -136,10 +137,11 @@ public function redirectForm(FormStateInterface $form_state) {
     }
 
     if ($url) {
+      $class = $form_state->getIgnoreDestination() ? IgnoreDestinationRedirectResponse::class : RedirectResponse::class;
       // According to RFC 7231, 303 See Other status code must be used to redirect
       // user agent (and not default 302 Found).
       // @see http://tools.ietf.org/html/rfc7231#section-6.4.4
-      return new RedirectResponse($url, Response::HTTP_SEE_OTHER);
+      return new $class($url, Response::HTTP_SEE_OTHER);
     }
   }
 
diff --git a/core/lib/Drupal/Core/Routing/IgnoreDestinationRedirectResponse.php b/core/lib/Drupal/Core/Routing/IgnoreDestinationRedirectResponse.php
new file mode 100644
index 0000000000..aff3762f1a
--- /dev/null
+++ b/core/lib/Drupal/Core/Routing/IgnoreDestinationRedirectResponse.php
@@ -0,0 +1,11 @@
+<?php
+
+namespace Drupal\Core\Routing;
+
+use Symfony\Component\HttpFoundation\RedirectResponse;
+
+/**
+ * Provides a redirect response which will override the destination query parameter.
+ */
+class IgnoreDestinationRedirectResponse extends RedirectResponse {
+}
diff --git a/core/modules/image/src/Form/ImageStyleEditForm.php b/core/modules/image/src/Form/ImageStyleEditForm.php
index e7cfd50c58..2175a66641 100644
--- a/core/modules/image/src/Form/ImageStyleEditForm.php
+++ b/core/modules/image/src/Form/ImageStyleEditForm.php
@@ -220,6 +220,7 @@ public function effectSave($form, FormStateInterface $form_state) {
         ],
         ['query' => ['weight' => $form_state->getValue('weight')]]
       );
+      $form_state->ignoreDestination();
     }
     // If there's no form, immediately add the image effect.
     else {
diff --git a/core/modules/image/src/ImageStyleListBuilder.php b/core/modules/image/src/ImageStyleListBuilder.php
index 2dcb800afa..62651cd2f8 100644
--- a/core/modules/image/src/ImageStyleListBuilder.php
+++ b/core/modules/image/src/ImageStyleListBuilder.php
@@ -39,17 +39,9 @@ public function getDefaultOperations(EntityInterface $entity) {
       'url' => $entity->urlInfo('flush-form'),
     ];
 
-    $operations = parent::getDefaultOperations($entity) + [
+    return parent::getDefaultOperations($entity) + [
       'flush' => $flush,
     ];
-
-    // Remove destination URL from the edit link to allow editing image
-    // effects.
-    if (isset($operations['edit'])) {
-      $operations['edit']['url'] = $entity->toUrl('edit-form');
-    }
-
-    return $operations;
   }
 
   /**
