diff --git a/core/modules/image/image.admin.inc b/core/modules/image/image.admin.inc
index 1cd2155..3c53316 100644
--- a/core/modules/image/image.admin.inc
+++ b/core/modules/image/image.admin.inc
@@ -8,24 +8,6 @@
 use Symfony\Component\HttpFoundation\RedirectResponse;
 
 /**
- * Menu callback; Listing of all current image styles.
- */
-function image_style_list() {
-  $page = array();
-
-  $styles = entity_load_multiple('image_style');
-  $page['image_style_list'] = array(
-    '#markup' => theme('image_style_list', array('styles' => $styles)),
-    '#attached' => array(
-      'css' => array(drupal_get_path('module', 'image') . '/css/image.admin.css' => array()),
-    ),
-  );
-
-  return $page;
-
-}
-
-/**
  * Form builder; Edit an image style name and effects order.
  *
  * @param $form_state
@@ -502,55 +484,6 @@ function image_rotate_form($data) {
 }
 
 /**
- * Returns HTML for the page containing the list of image styles.
- *
- * @param $variables
- *   An associative array containing:
- *   - styles: An array of all the image styles returned by image_get_styles().
- *
- * @see image_get_styles()
- * @ingroup themeable
- */
-function theme_image_style_list($variables) {
-  $styles = $variables['styles'];
-
-  $header = array(t('Style name'), t('Operations'));
-  $rows = array();
-
-  foreach ($styles as $style) {
-    $row = array();
-    $row[] = l($style->label(), 'admin/config/media/image-styles/manage/' . $style->id());
-    $links = array();
-    $links['edit'] = array(
-      'title' => t('edit'),
-      'href' => 'admin/config/media/image-styles/manage/' . $style->id(),
-      'class' => array('image-style-link'),
-    );
-    $links['delete'] = array(
-      'title' => t('delete'),
-      'href' => 'admin/config/media/image-styles/manage/' . $style->id() . '/delete',
-      'class' => array('image-style-link'),
-    );
-    $row[] = array(
-      'data' => array(
-        '#type' => 'operations',
-        '#links' => $links,
-      ),
-    );
-    $rows[] = $row;
-  }
-
-  if (empty($rows)) {
-    $rows[] = array(array(
-      'colspan' => 4,
-      'data' => t('There are currently no styles. <a href="!url">Add a new one</a>.', array('!url' => url('admin/config/media/image-styles/add'))),
-    ));
-  }
-
-  return theme('table', array('header' => $header, 'rows' => $rows));
-}
-
-/**
  * Returns HTML for a listing of the effects within a specific image style.
  *
  * @param $variables
diff --git a/core/modules/image/image.module b/core/modules/image/image.module
index 62aee35..63ddee1 100644
--- a/core/modules/image/image.module
+++ b/core/modules/image/image.module
@@ -98,17 +98,12 @@ function image_menu() {
   $items['admin/config/media/image-styles'] = array(
     'title' => 'Image styles',
     'description' => 'Configure styles that can be used for resizing or adjusting images on display.',
-    'page callback' => 'image_style_list',
-    'access arguments' => array('administer image styles'),
-    'file' => 'image.admin.inc',
+    'route_name' => 'image_style_list',
   );
   $items['admin/config/media/image-styles/list'] = array(
     'title' => 'List',
     'description' => 'List the current image styles on the site.',
-    'page callback' => 'image_style_list',
-    'access arguments' => array('administer image styles'),
     'type' => MENU_DEFAULT_LOCAL_TASK,
-    'file' => 'image.admin.inc',
   );
   $items['admin/config/media/image-styles/add'] = array(
     'title' => 'Add style',
@@ -188,9 +183,6 @@ function image_theme() {
     ),
 
     // Theme functions in image.admin.inc.
-    'image_style_list' => array(
-      'variables' => array('styles' => NULL),
-    ),
     'image_style_effects' => array(
       'render element' => 'form',
     ),
diff --git a/core/modules/image/image.routing.yml b/core/modules/image/image.routing.yml
index 46a79f1..86d5858 100644
--- a/core/modules/image/image.routing.yml
+++ b/core/modules/image/image.routing.yml
@@ -12,10 +12,16 @@ image_effect_delete:
   requirements:
     _permission: 'administer image styles'
 
+image_style_list:
+  pattern: '/admin/config/media/image-styles'
+  defaults:
+    _entity_list: 'image_style'
+  requirements:
+    _permission: 'administer image styles'
+
 image_style_private:
   pattern: '/system/files/styles/{image_style}/{scheme}'
   defaults:
     _controller:  '\Drupal\image\Controller\ImageStyleDownloadController::deliver'
   requirements:
     _access: 'TRUE'
-
diff --git a/core/modules/image/lib/Drupal/image/ImageStyleAccessController.php b/core/modules/image/lib/Drupal/image/ImageStyleAccessController.php
new file mode 100644
index 0000000..02c43df
--- /dev/null
+++ b/core/modules/image/lib/Drupal/image/ImageStyleAccessController.php
@@ -0,0 +1,33 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\image\ImageStyleAccessController.
+ */
+
+namespace Drupal\image;
+
+use \Drupal\Core\Entity\EntityAccessController;
+use \Drupal\Core\Entity\EntityInterface;
+use \Drupal\Core\Session\AccountInterface;
+
+/**
+ * Defines an access controller for the image style entity.
+ *
+ * @see \Drupal\image\Plugin\Core\Entity\ImageStyle
+ */
+class ImageStyleAccessController extends EntityAccessController {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function checkAccess(EntityInterface $entity, $operation, $langcode, AccountInterface $account) {
+    switch ($operation) {
+      case 'create':
+      case 'update':
+      case 'delete':
+        return $account->hasPermission('administer image styles');
+        break;
+    }
+  }
+}
diff --git a/core/modules/image/lib/Drupal/image/ImageStyleListController.php b/core/modules/image/lib/Drupal/image/ImageStyleListController.php
new file mode 100644
index 0000000..78659df
--- /dev/null
+++ b/core/modules/image/lib/Drupal/image/ImageStyleListController.php
@@ -0,0 +1,106 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\image\ImageStyleListController.
+ */
+
+namespace Drupal\image;
+
+use Drupal\Core\Config\Entity\ConfigEntityListController;
+use Drupal\Core\Entity\EntityControllerInterface;
+use Drupal\Core\Routing\PathBasedGeneratorInterface;
+use Drupal\Core\StringTranslation\TranslationManager;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Drupal\Core\Entity\EntityStorageControllerInterface;
+use Drupal\Core\Extension\ModuleHandlerInterface;
+use Drupal\Core\Entity\EntityInterface;
+use Drupal\Component\Utility\String;
+
+/**
+ * Provides a listing of image styles.
+ */
+class ImageStyleListController extends ConfigEntityListController implements EntityControllerInterface {
+
+  /**
+   * The URL generator.
+   *
+   * @var \Drupal\Core\Routing\PathBasedGeneratorInterface
+   */
+  protected $urlGenerator;
+
+  /**
+   * The translation manager service.
+   *
+   * @var \Drupal\Core\StringTranslation\TranslationManager
+   */
+  protected $translationManager;
+
+  /**
+   * Constructs a new ImageStyleListController object.
+   *
+   * @param string $entity_type
+   *   The type of entity to be listed.
+   * @param array $entity_info
+   *   An array of entity info for the entity type.
+   * @param \Drupal\Core\Entity\EntityStorageControllerInterface $storage
+   *   The entity storage controller class.
+   * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
+   *   The module handler to invoke hooks on.
+   * @param \Drupal\Core\Routing\PathBasedGeneratorInterface $url_generator
+   *   The URL generator.
+   * @param \Drupal\Core\StringTranslation\TranslationManager $translation_manager
+   *   The translation manager.
+   */
+  public function __construct($entity_type, array $entity_info, EntityStorageControllerInterface $storage, ModuleHandlerInterface $module_handler, PathBasedGeneratorInterface $url_generator, TranslationManager $translation_manager) {
+    parent::__construct($entity_type, $entity_info, $storage, $module_handler);
+    $this->urlGenerator = $url_generator;
+    $this->translationManager = $translation_manager;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function createInstance(ContainerInterface $container, $entity_type, array $entity_info) {
+    return new static(
+      $entity_type,
+      $entity_info,
+      $container->get('plugin.manager.entity')->getStorageController($entity_type),
+      $container->get('module_handler'),
+      $container->get('url_generator'),
+      $container->get('string_translation')
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildHeader() {
+    $row = parent::buildHeader();
+    unset($row['id']);
+    $row['label'] = $this->translationManager->translate('Style name');
+    return $row;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildRow(EntityInterface $entity) {
+    $row = parent::buildRow($entity);
+    unset($row['id']);
+    $row['label'] = String::checkPlain($entity->label());
+    return $row;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function render() {
+    $build = parent::render();
+    $build['#empty'] = $this->translationManager->translate('There are currently no styles. <a href="!url">Add a new one</a>.', array(
+      '!url' => $this->urlGenerator->generateFromPath('admin/config/media/image-styles/add'),
+    ));
+    return $build;
+  }
+
+}
diff --git a/core/modules/image/lib/Drupal/image/Plugin/Core/Entity/ImageStyle.php b/core/modules/image/lib/Drupal/image/Plugin/Core/Entity/ImageStyle.php
index 7fc752b..d9ba4d6 100644
--- a/core/modules/image/lib/Drupal/image/Plugin/Core/Entity/ImageStyle.php
+++ b/core/modules/image/lib/Drupal/image/Plugin/Core/Entity/ImageStyle.php
@@ -27,7 +27,9 @@
  *     "form" = {
  *       "delete" = "Drupal\image\Form\ImageStyleDeleteForm"
  *     },
- *     "storage" = "Drupal\image\ImageStyleStorageController"
+ *     "storage" = "Drupal\image\ImageStyleStorageController",
+ *     "list" = "Drupal\image\ImageStyleListController",
+ *     "access" = "Drupal\image\ImageStyleAccessController"
  *   },
  *   uri_callback = "image_style_entity_uri",
  *   config_prefix = "image.style",
diff --git a/core/modules/image/lib/Drupal/image/Tests/ImageStyleListTest.php b/core/modules/image/lib/Drupal/image/Tests/ImageStyleListTest.php
new file mode 100644
index 0000000..b4c905f
--- /dev/null
+++ b/core/modules/image/lib/Drupal/image/Tests/ImageStyleListTest.php
@@ -0,0 +1,56 @@
+<?php
+
+/**
+ * @file
+ * Contains Drupal\image\Tests\ImageStyleListTest.
+ */
+
+namespace Drupal\image\Tests;
+
+use Drupal\simpletest\WebTestBase;
+
+/**
+ * Tests access to overview page and operation links
+ */
+class ImageStyleListTest extends WebTestBase {
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = array('image');
+
+  /**
+   * A user with the permission to administer image styles.
+   *
+   * @var \Drupal\user\UserInterface
+   */
+  protected $adminUser;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Image styles list',
+      'description' => 'Tests access to overview page and operation links.',
+      'group' => 'Image',
+    );
+  }
+
+  function setUp() {
+    parent::setUp();
+
+    $style = entity_create('image_style', array('name' => 'style_foo', 'label' => $this->randomString()));
+    $style->save();
+
+    $this->adminUser = $this->drupalCreateUser(array('administer image styles'));
+    $this->drupalLogin($this->adminUser);
+  }
+
+  /**
+   * Tests access for the image style listing.
+   */
+  function testImageStyleAccess() {
+    $this->drupalGet('admin/config/media/image-styles');
+    $this->clickLink(t('Edit'));
+  }
+}
