diff --git a/core/modules/image/image.admin.inc b/core/modules/image/image.admin.inc
index 4d39d05..4f00796 100644
--- a/core/modules/image/image.admin.inc
+++ b/core/modules/image/image.admin.inc
@@ -262,93 +262,6 @@ function image_style_add_form_submit($form, &$form_state) {
 }
 
 /**
- * Form builder; Form for adding and editing image effects.
- *
- * This form is used universally for editing all image effects. Each effect adds
- * its own custom section to the form by calling the 'form callback' specified
- * in hook_image_effect_info().
- *
- * @param $form_state
- *   An associative array containing the current state of the form.
- * @param $style
- *   An image style array.
- * @param $effect
- *   An image effect array.
- *
- * @ingroup forms
- * @see image_resize_form()
- * @see image_scale_form()
- * @see image_rotate_form()
- * @see image_crop_form()
- * @see image_effect_form_submit()
- */
-function image_effect_form($form, &$form_state, $style, $effect) {
-  // If there's no configuration for this image effect, return to
-  // the image style page.
-  if (!isset($effect['form callback'])) {
-    return new RedirectResponse(url('admin/config/media/image-styles/manage/' . $style->id(), array('absolute' => TRUE)));
-  }
-  $form_state['image_style'] = $style;
-  $form_state['image_effect'] = $effect;
-
-  if (!empty($effect['ieid'])) {
-    $title = t('Edit %label effect', array('%label' => $effect['label']));
-  }
-  else{
-    $title = t('Add %label effect', array('%label' => $effect['label']));
-  }
-  drupal_set_title($title, PASS_THROUGH);
-
-  $form['#attached']['css'][drupal_get_path('module', 'image') . '/css/image.admin.css'] = array();
-
-  $form['ieid'] = array(
-    '#type' => 'value',
-    '#value' => !empty($effect['ieid']) ? $effect['ieid'] : NULL,
-  );
-  $form['name'] = array(
-    '#type' => 'value',
-    '#value' => $effect['name'],
-  );
-
-  $form['data'] = call_user_func($effect['form callback'], $effect['data']);
-  $form['data']['#tree'] = TRUE;
-
-  // Check the URL for a weight, then the image effect, otherwise use default.
-  $weight = Drupal::request()->query->get('weight');
-  $form['weight'] = array(
-    '#type' => 'hidden',
-    '#value' => isset($weight) ? intval($weight) : (isset($effect['weight']) ? $effect['weight'] : count($style->effects)),
-  );
-
-  $form['actions'] = array('#type' => 'actions');
-  $form['actions']['submit'] = array(
-    '#type' => 'submit',
-    '#value' => !empty($effect['ieid']) ? t('Update effect') : t('Add effect'),
-  );
-  $form['actions']['cancel'] = array(
-    '#type' => 'link',
-    '#title' => t('Cancel'),
-    '#href' => 'admin/config/media/image-styles/manage/' . $style->id(),
-  );
-
-  return $form;
-}
-
-/**
- * Submit handler for updating an image effect.
- */
-function image_effect_form_submit($form, &$form_state) {
-  form_state_values_clean($form_state);
-
-  $effect = $form_state['values'];
-  $style = $form_state['image_style'];
-  image_effect_save($style, $effect);
-
-  drupal_set_message(t('The image effect was successfully applied.'));
-  $form_state['redirect'] = 'admin/config/media/image-styles/manage/' . $style->id();
-}
-
-/**
  * Element validate handler to ensure a hexadecimal color value.
  */
 function image_effect_color_validate($element, &$form_state) {
diff --git a/core/modules/image/image.module b/core/modules/image/image.module
index 53cb813..5ca0967 100644
--- a/core/modules/image/image.module
+++ b/core/modules/image/image.module
@@ -166,29 +166,6 @@ function image_menu() {
     'weight' => 10,
     'route_name' => 'image_style_delete',
   );
-  $items['admin/config/media/image-styles/manage/%image_style/effects/%image_effect'] = array(
-    'title' => 'Edit image effect',
-    'description' => 'Edit an existing effect within a style.',
-    'load arguments' => array(5, (string) IMAGE_STORAGE_EDITABLE),
-    'page callback' => 'drupal_get_form',
-    'page arguments' => array('image_effect_form', 5, 7),
-    'access arguments' => array('administer image styles'),
-    'file' => 'image.admin.inc',
-  );
-  $items['admin/config/media/image-styles/manage/%image_style/effects/%image_effect/delete'] = array(
-    'title' => 'Delete image effect',
-    'description' => 'Delete an existing effect from a style.',
-    'route_name' => 'image_effect_delete',
-  );
-  $items['admin/config/media/image-styles/manage/%image_style/add/%image_effect_definition'] = array(
-    'title' => 'Add image effect',
-    'description' => 'Add a new effect to a style.',
-    'load arguments' => array(5),
-    'page callback' => 'drupal_get_form',
-    'page arguments' => array('image_effect_form', 5, 7),
-    'access arguments' => array('administer image styles'),
-    'file' => 'image.admin.inc',
-  );
 
   return $items;
 }
diff --git a/core/modules/image/image.routing.yml b/core/modules/image/image.routing.yml
index b178d33..4a349a8 100644
--- a/core/modules/image/image.routing.yml
+++ b/core/modules/image/image.routing.yml
@@ -1,13 +1,27 @@
 image_style_delete:
-  pattern: 'admin/config/media/image-styles/manage/{image_style}/delete'
+  pattern: '/admin/config/media/image-styles/manage/{image_style}/delete'
   defaults:
     _entity_form: 'image_style.delete'
   requirements:
     _permission: 'administer image styles'
 
 image_effect_delete:
-  pattern: 'admin/config/media/image-styles/manage/{image_style}/effects/{image_effect}/delete'
+  pattern: '/admin/config/media/image-styles/manage/{image_style}/effects/{image_effect}/delete'
   defaults:
     _form: '\Drupal\image\Form\ImageEffectDeleteForm'
   requirements:
     _permission: 'administer image styles'
+
+image_effect_form:
+  pattern: '/admin/config/media/image-styles/manage/{image_style}/add/{image_effect}'
+  defaults:
+    _form: '\Drupal\image\Form\ImageEffectForm'
+  requirements:
+    _permission: 'administer image styles'
+
+image_effect_edit_form:
+  pattern: '/admin/config/media/image-styles/manage/{image_style}/effects/{image_effect}'
+  defaults:
+    _form: '\Drupal\image\Form\ImageEffectEditForm'
+  requirements:
+    _permission: 'administer image styles'
diff --git a/core/modules/image/lib/Drupal/image/Form/ImageEffectDeleteForm.php b/core/modules/image/lib/Drupal/image/Form/ImageEffectDeleteForm.php
index 50bf2bb..4af0385 100644
--- a/core/modules/image/lib/Drupal/image/Form/ImageEffectDeleteForm.php
+++ b/core/modules/image/lib/Drupal/image/Form/ImageEffectDeleteForm.php
@@ -62,6 +62,7 @@ public function getFormID() {
    * {@inheritdoc}
    */
   public function buildForm(array $form, array &$form_state, $image_style = NULL, $image_effect = NULL, Request $request = NULL) {
+    drupal_set_message(t('Delete image effect'));
     $this->imageStyle = $image_style;
     $this->imageEffect = image_effect_load($image_effect, $this->imageStyle->id());
 
diff --git a/core/modules/image/lib/Drupal/image/Form/ImageEffectEditForm.php b/core/modules/image/lib/Drupal/image/Form/ImageEffectEditForm.php
new file mode 100644
index 0000000..e50534a
--- /dev/null
+++ b/core/modules/image/lib/Drupal/image/Form/ImageEffectEditForm.php
@@ -0,0 +1,34 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\image\Form\ImageEffectEditForm.
+ */
+
+namespace Drupal\image\Form;
+
+use Drupal\Core\Form\FormInterface;
+use Drupal\image\Plugin\Core\Entity\ImageStyle;
+
+/**
+ * Form for deleting an image effect.
+ */
+class ImageEffectEditForm extends ImageEffectForm {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function imageEffectGet($image_effect, $image_style) {
+    return image_effect_load($image_effect, $image_style->id());
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildForm(array $form, array &$form_state, $image_style = NULL, $image_effect = NULL) {
+    $form = parent::buildForm($form, $form_state, $image_style, $image_effect);
+    drupal_set_title(t('Edit image effect'));
+    return $form;
+  }
+
+}
diff --git a/core/modules/image/lib/Drupal/image/Form/ImageEffectForm.php b/core/modules/image/lib/Drupal/image/Form/ImageEffectForm.php
new file mode 100644
index 0000000..7bcb7ee
--- /dev/null
+++ b/core/modules/image/lib/Drupal/image/Form/ImageEffectForm.php
@@ -0,0 +1,159 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\image\Form\ImageEffectForm.
+ */
+
+namespace Drupal\image\Form;
+
+use Drupal\Core\Form\FormInterface;
+use Drupal\Core\Controller\ControllerInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Drupal\image\Plugin\Core\Entity\ImageStyle;
+use Drupal\Core\Extension\ModuleHandlerInterface;
+
+/**
+ * Form for deleting an image effect.
+ */
+class ImageEffectForm implements FormInterface, ControllerInterface {
+
+  /**
+   * The image style containing the image effect.
+   *
+   * @var \Drupal\image\Plugin\Core\Entity\ImageStyle
+   */
+  protected $imageStyle;
+
+  /**
+   * The image effect.
+   *
+   * @var array;
+   */
+  protected $imageEffect;
+
+  /**
+   * The module handler.
+   *
+   * @var \Drupal\Core\Extension\ModuleHandlerInterface
+   */
+  protected $moduleHandler;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getFormID() {
+    return 'image_effect_form';
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static($container->get('module_handler'));
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function __construct(ModuleHandlerInterface $module_handler) {
+    $this->moduleHandler = $module_handler;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildForm(array $form, array &$form_state, $image_style = NULL, $image_effect = NULL) {
+    drupal_set_title(t('Add image effect'));
+    $this->imageStyle = $image_style;
+    $this->imageEffect = $this->imageEffectGet($image_effect, $image_style);
+
+    // If there's no configuration for this image effect, return to
+    // the image style page.
+    if (!isset($this->imageEffect['form callback'])) {
+      drupal_goto('admin/config/media/image-styles/manage/' . $this->imageStyle->id());
+    }
+    $form_state['image_style'] = $this->imageStyle;
+    $form_state['image_effect'] = $this->imageEffect;
+
+    if (!empty($this->imageEffect['ieid'])) {
+      $title = t('Edit %label effect', array('%label' => $this->imageEffect['label']));
+    }
+    else {
+      $title = t('Add %label effect', array('%label' => $this->imageEffect['label']));
+    }
+    drupal_set_title($title, PASS_THROUGH);
+
+    $form['#attached']['css'][drupal_get_path('module', 'image') . '/image.admin.css'] = array();
+
+    $form['ieid'] = array(
+      '#type' => 'value',
+      '#value' => !empty($this->imageEffect['ieid']) ? $this->imageEffect['ieid'] : NULL,
+    );
+    $form['name'] = array(
+      '#type' => 'value',
+      '#value' => $this->imageEffect['name'],
+    );
+
+    $this->moduleHandler->loadInclude('image', 'inc', 'image.admin');
+
+    $form['data'] = call_user_func($this->imageEffect['form callback'], $this->imageEffect['data']);
+    $form['data']['#tree'] = TRUE;
+
+    // Check the URL for a weight, then the image effect, otherwise use default.
+    $form['weight'] = array(
+      '#type' => 'hidden',
+      '#value' => isset($_GET['weight']) ? intval($_GET['weight']) : (isset($this->imageEffect['weight']) ? $this->imageEffect['weight'] : count($this->imageStyle->effects)),
+    );
+
+    $form['actions'] = array('#type' => 'actions');
+    $form['actions']['submit'] = array(
+      '#type' => 'submit',
+      '#value' => !empty($this->imageEffect['ieid']) ? t('Update effect') : t('Add effect'),
+    );
+    $form['actions']['cancel'] = array(
+      '#type' => 'link',
+      '#title' => t('Cancel'),
+      '#href' => 'admin/config/media/image-styles/manage/' . $this->imageStyle->id(),
+    );
+
+    return $form;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function validateForm(array &$form, array &$form_state) {
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function submitForm(array &$form, array &$form_state) {
+    form_state_values_clean($form_state);
+
+    $this->imageEffect = $form_state['values'];
+    $this->imageStyle = $form_state['image_style'];
+    image_effect_save($this->imageStyle, $this->imageEffect);
+
+    drupal_set_message(t('The image effect was successfully applied.'));
+    $form_state['redirect'] = 'admin/config/media/image-styles/manage/' . $this->imageStyle->id();
+  }
+
+  /**
+   * Loads image effect info.
+   *
+   * @param str $image_effect
+   *   Image effect name.
+   *
+   * @param \Drupal\image\Plugin\Core\Entity\ImageStyle $image_style
+   *   Image style object.
+   *
+   * @return array
+   *   Image effect info.
+   */
+  protected function imageEffectGet($image_effect, $image_style) {
+    return image_effect_definition_load($image_effect);
+  }
+
+}
