diff --git a/core/lib/Drupal/Core/ImageToolkit/ImageToolkitException.php b/core/lib/Drupal/Core/ImageToolkit/ImageToolkitException.php
new file mode 100644
index 0000000..c40bc33
--- /dev/null
+++ b/core/lib/Drupal/Core/ImageToolkit/ImageToolkitException.php
@@ -0,0 +1,15 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\ImageToolkit\ImageToolkitException.
+ */
+
+namespace Drupal\Core\ImageToolkit;
+
+use Drupal\Component\Plugin\Exception\PluginException;
+
+/**
+ * ImageToolkit exception class.
+ */
+class ImageToolkitException extends PluginException {}
diff --git a/core/lib/Drupal/Core/ImageToolkit/ImageToolkitInterface.php b/core/lib/Drupal/Core/ImageToolkit/ImageToolkitInterface.php
index 2b86aef..ff40c12 100644
--- a/core/lib/Drupal/Core/ImageToolkit/ImageToolkitInterface.php
+++ b/core/lib/Drupal/Core/ImageToolkit/ImageToolkitInterface.php
@@ -33,7 +33,7 @@
  *
  * Only one toolkit may be selected at a time. If a module author wishes to call
  * a specific toolkit they can check that it is installed by calling
- * \Drupal\Core\ImageToolkit\ImageToolkitManager::getAvailableToolkits(), and
+ * \Drupal\Core\ImageToolkit\ImageToolkitManager::getDefinitions(), and
  * then calling its functions directly.
  */
 
@@ -53,6 +53,11 @@
   public function settingsForm();
 
   /**
+   * Handles validations for toolkit's settings form.
+   */
+  public function settingsFormValidate(array &$form, array &$form_state);
+
+  /**
    * Handles submissions for toolkit's settings form.
    *
    * @see system_image_toolkit_settings_submit()
@@ -174,12 +179,18 @@ public function save(ImageInterface $image, $destination);
   public function getInfo(ImageInterface $image);
 
   /**
-   * Verifies Image Toolkit is set up correctly.
+   * Gets toolkit requirements in a format suitable for hook_requirements().
    *
-   * @return bool
-   *   True if the GD toolkit is available on this machine.
+   * @return array
+   *   An associative requirements array as is returned by hook_requirements().
+   *   If the toolkit claims no requirements to the system, returns an empty
+   *   array. The array can have arbitrary keys and they do not have to be
+   *   prefixed by e.g. the module name or toolkit ID, as the system will make
+   *   the keys globally unique.
+   *
+   * @see hook_requirements()
    */
-  public static function isAvailable();
+  public function requirements();
 
   /**
    * Returns a list of image types supported by the toolkit.
diff --git a/core/lib/Drupal/Core/ImageToolkit/ImageToolkitManager.php b/core/lib/Drupal/Core/ImageToolkit/ImageToolkitManager.php
index 43686ff..f76acd3 100644
--- a/core/lib/Drupal/Core/ImageToolkit/ImageToolkitManager.php
+++ b/core/lib/Drupal/Core/ImageToolkit/ImageToolkitManager.php
@@ -47,48 +47,21 @@ public function __construct(\Traversable $namespaces, CacheBackendInterface $cac
   /**
    * Gets the default image toolkit.
    *
+   * @throws \Drupal\Core\ImageToolkit\ImageToolkitException
+   *   If the toolkit plugin is not valid.
+   *
    * @return \Drupal\Core\ImageToolkit\ImageToolkitInterface
-   *   Object of the default toolkit, or FALSE on error.
+   *   Object of the default toolkit, or NULL on error.
    */
   public function getDefaultToolkit() {
     $toolkit_id = $this->configFactory->get('system.image')->get('toolkit');
-    $toolkits = $this->getAvailableToolkits();
-
-    if (!isset($toolkits[$toolkit_id]) || !class_exists($toolkits[$toolkit_id]['class'])) {
-      // The selected toolkit isn't available so return the first one found. If
-      // none are available this will return FALSE.
-      reset($toolkits);
-      $toolkit_id = key($toolkits);
-    }
-
-    if ($toolkit_id) {
-      $toolkit = $this->createInstance($toolkit_id);
-    }
-    else {
-      $toolkit = FALSE;
-    }
-
-    return $toolkit;
-  }
-
-  /**
-   * Gets a list of available toolkits.
-   *
-   * @return array
-   *   An array with the toolkit names as keys and the descriptions as values.
-   */
-  public function getAvailableToolkits() {
-    // Use plugin system to get list of available toolkits.
     $toolkits = $this->getDefinitions();
 
-    $output = array();
-    foreach ($toolkits as $id => $definition) {
-      // Only allow modules that aren't marked as unavailable.
-      if (call_user_func($definition['class'] . '::isAvailable')) {
-        $output[$id] = $definition;
-      }
+    if (empty($toolkit_id) || !isset($toolkits[$toolkit_id]) || !class_exists($toolkits[$toolkit_id]['class'])) {
+      throw new ImageToolkitException('Images can not be processed because the Image toolkit is missing or not configured properly. Visit the Image toolkit configuration page to correct this.');
     }
 
-    return $output;
+    return $this->createInstance($toolkit_id);
   }
+
 }
diff --git a/core/modules/image/image.install b/core/modules/image/image.install
index 9a14749..ca25ebc 100644
--- a/core/modules/image/image.install
+++ b/core/modules/image/image.install
@@ -29,30 +29,34 @@ function image_uninstall() {
  * @param $phase
  */
 function image_requirements($phase) {
-  $requirements = array();
-
-  if ($phase == 'runtime') {
-    // Check for the PHP GD library.
-    if (function_exists('imagegd2')) {
-      $info = gd_info();
-      $requirements['image_gd'] = array(
-        'value' => $info['GD Version'],
-      );
-
-      // Check for filter and rotate support.
-      if (!function_exists('imagefilter') || !function_exists('imagerotate')) {
-        $requirements['image_gd']['severity'] = REQUIREMENT_WARNING;
-        $requirements['image_gd']['description'] = t('The GD Library for PHP is enabled, but was compiled without support for functions used by the rotate and desaturate effects. It was probably compiled using the official GD libraries from http://www.libgd.org instead of the GD library bundled with PHP. You should recompile PHP --with-gd using the bundled GD library. See <a href="@url">the PHP manual</a>.', array('@url' => 'http://www.php.net/manual/book.image.php'));
-      }
-    }
-    else {
-      $requirements['image_gd'] = array(
-        'value' => t('Not installed'),
-        'severity' => REQUIREMENT_ERROR,
-        'description' => t('The GD library for PHP is missing or outdated. Check the <a href="@url">PHP image documentation</a> for information on how to correct this.', array('@url' => 'http://www.php.net/manual/book.image.php')),
-      );
-    }
-    $requirements['image_gd']['title'] = t('GD library rotate and desaturate effects');
+  if ($phase != 'runtime') {
+    return array();
+  }
+
+  // Get info about the default toolkit.
+  $requirements = array(
+    'image.toolkit' => array(
+      'title' => t('Image toolkit'),
+    ),
+  );
+  try {
+    $toolkit = \Drupal::service('image.toolkit.manager')->getDefaultToolkit();
+    $plugin_definition = $toolkit->getPluginDefinition();
+    $requirements['image.toolkit']['value'] = $toolkit->getPluginId();
+    $requirements['image.toolkit']['description'] = $plugin_definition['title'];
+    $requirements['image.toolkit']['severity'] = REQUIREMENT_INFO;
+  }
+  catch (\Drupal\Core\ImageToolkit\ImageToolkitException $e) {
+    $requirements['image.toolkit']['value'] = t('None');
+    $requirements['image.toolkit']['description'] = t("No image toolkit is configured on the site. Check PHP installed extensions, or add other contributed toolkits that do not require a PHP extension, and make sure that a valid image toolkit is enabled.");
+    $requirements['image.toolkit']['severity'] = REQUIREMENT_ERROR;
+    return $requirements;
+  }
+
+  // Get requirements provided by the toolkit.
+  foreach ($toolkit->requirements() as $key => $requirement) {
+    $namespaced_key = 'image.toolkit.' . $toolkit->getPluginId() . '.' . $key;
+    $requirements[$namespaced_key] = $requirement;
   }
 
   return $requirements;
diff --git a/core/modules/system/lib/Drupal/system/Form/ImageToolkitForm.php b/core/modules/system/lib/Drupal/system/Form/ImageToolkitForm.php
index 93d073b..2c0de92 100644
--- a/core/modules/system/lib/Drupal/system/Form/ImageToolkitForm.php
+++ b/core/modules/system/lib/Drupal/system/Form/ImageToolkitForm.php
@@ -7,6 +7,8 @@
 
 namespace Drupal\system\Form;
 
+use Drupal\Core\Ajax\AjaxResponse;
+use Drupal\Core\Ajax\HtmlCommand;
 use Drupal\Core\Config\ConfigFactory;
 use Drupal\Core\Config\Context\ContextInterface;
 use Drupal\Core\Form\ConfigFormBase;
@@ -38,7 +40,7 @@ class ImageToolkitForm extends ConfigFormBase {
   public function __construct(ConfigFactory $config_factory, ContextInterface $context, ImageToolkitManager $manager) {
     parent::__construct($config_factory, $context);
 
-    foreach ($manager->getAvailableToolkits() as $id => $definition) {
+    foreach ($manager->getDefinitions() as $id => $definition) {
       $this->availableToolkits[$id] = $manager->createInstance($id);
     }
   }
@@ -65,34 +67,63 @@ public function getFormId() {
    * {@inheritdoc}
    */
   public function buildForm(array $form, array &$form_state) {
-    $current_toolkit = $this->configFactory->get('system.image')->get('toolkit');
+    $current_toolkit = isset($form_state['values']['image_toolkit']) ? $form_state['values']['image_toolkit'] : $this->configFactory->get('system.image')->get('toolkit');
 
     $form['image_toolkit'] = array(
       '#type' => 'radios',
       '#title' => t('Select an image processing toolkit'),
       '#default_value' => $current_toolkit,
       '#options' => array(),
+      '#ajax' => array(
+        'callback' => array($this, 'processToolkitDetails'),
+      ),
     );
 
-    // If we have available toolkits, allow the user to select the image toolkit
-    // to use and load the settings forms.
+    // Build options and load the settings forms of the current toolkit.
     foreach ($this->availableToolkits as $id => $toolkit) {
       $definition = $toolkit->getPluginDefinition();
       $form['image_toolkit']['#options'][$id] = $definition['title'];
-      $form['image_toolkit_settings'][$id] = array(
-        '#type' => 'fieldset',
-        '#title' => t('@toolkit settings', array('@toolkit' => $definition['title'])),
-        '#collapsible' => TRUE,
-        '#collapsed' => ($id == $current_toolkit) ? FALSE : TRUE,
-        '#tree' => TRUE,
-      );
-      $form['image_toolkit_settings'][$id] += $toolkit->settingsForm();
+      if ($id == $current_toolkit) {
+        $form['image_toolkit_settings'][$id] = array(
+          '#type' => 'fieldset',
+          '#title' => t('@toolkit settings', array('@toolkit' => $definition['title'])),
+          '#tree' => TRUE,
+        );
+        $form['image_toolkit_settings'][$id] += $toolkit->settingsForm();
+      }
     }
 
     return parent::buildForm($form, $form_state);
   }
 
   /**
+   * Refreshes the form after a change of the selected toolkit.
+   */
+  public function processToolkitDetails($form, $form_state) {
+    drupal_set_message($this->t('Click the <em>Save configuration</em> button to confirm the toolkit selection.'), 'warning');
+    $response = new AjaxResponse();
+    $status_messages = array('#theme' => 'status_messages');
+    $response->addCommand(new HtmlCommand('#console', drupal_render($status_messages)));
+    $response->addCommand(new HtmlCommand('#system-image-toolkit-settings', drupal_render($form)));
+    return $response;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function validateForm(array &$form, array &$form_state) {
+    if ($form_state['triggering_element']['#name'] != 'op') {
+      return;
+    }
+
+    // Call the form validation handler for the selected toolkit.
+    $toolkit = $this->availableToolkits[$form_state['values']['image_toolkit']];
+    $toolkit->settingsFormValidate($form, $form_state);
+
+    parent::validateForm($form, $form_state);
+  }
+
+  /**
    * {@inheritdoc}
    */
   public function submitForm(array &$form, array &$form_state) {
@@ -100,11 +131,8 @@ public function submitForm(array &$form, array &$form_state) {
       ->set('toolkit', $form_state['values']['image_toolkit'])
       ->save();
 
-    // Call the form submit handler for each of the toolkits.
-    // Get the toolkit settings forms.
-    foreach ($this->availableToolkits as $id => $toolkit) {
-      $toolkit->settingsFormSubmit($form, $form_state);
-    }
+    // Call the form submit handler for the selected toolkit.
+    $this->availableToolkits[$form_state['values']['image_toolkit']]->settingsFormSubmit($form, $form_state);
 
     parent::submitForm($form, $form_state);
   }
diff --git a/core/modules/system/lib/Drupal/system/Plugin/ImageToolkit/GDToolkit.php b/core/modules/system/lib/Drupal/system/Plugin/ImageToolkit/GDToolkit.php
index 737ad27..f38dc99 100644
--- a/core/modules/system/lib/Drupal/system/Plugin/ImageToolkit/GDToolkit.php
+++ b/core/modules/system/lib/Drupal/system/Plugin/ImageToolkit/GDToolkit.php
@@ -40,6 +40,43 @@ public function settingsForm() {
   /**
    * {@inheritdoc}
    */
+  public function settingsFormValidate(array &$form, array &$form_state) {
+    require_once DRUPAL_ROOT . '/core/includes/install.inc';
+    $requirements = $this->requirements();
+    foreach ($requirements as $requirement) {
+      $requirement['severity'] = isset($requirement['severity']) ? $requirement['severity'] : REQUIREMENT_OK;
+      switch ($requirement['severity']) {
+        case REQUIREMENT_ERROR:
+          $severity = 'error';
+          break;
+
+        case REQUIREMENT_WARNING:
+          $severity = 'warning';
+          break;
+
+        default:
+          $severity = 'status';
+          break;
+
+      }
+      $message = $requirement['title'];
+      if (isset($requirement['value'])) {
+        $message .= ' - ' . $requirement['value'];
+      }
+      if (isset($requirement['description'])) {
+        $message .= ' - ' . $requirement['description'];
+      }
+      drupal_set_message($message, $severity);
+      if ($severity == 'error') {
+        $plugin_definition = $this->getPluginDefinition();
+        \Drupal::formBuilder()->setErrorByName('image_toolkit', $this->t('Selected toolkit %toolkit_title is invalid.', array('%toolkit_title' => $plugin_definition['title'])));
+      }
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function settingsFormSubmit($form, &$form_state) {
     \Drupal::config('system.image.gd')
       ->set('jpeg_quality', $form_state['values']['gd']['image_jpeg_quality'])
@@ -275,14 +312,33 @@ public function createTmp(ImageInterface $image, $width, $height) {
   /**
    * {@inheritdoc}
    */
-  public static function isAvailable() {
-    if ($check = get_extension_funcs('gd')) {
-      if (in_array('imagegd2', $check)) {
-        // GD2 support is available.
-        return TRUE;
-      }
+  public function requirements() {
+    $requirements = array();
+
+    $check = get_extension_funcs('gd');
+    if (!$check || !in_array('imagegd2', $check)) {
+      $requirements['image_gd'] = array(
+        'title' => t('GD Library'),
+        'value' => t('Not installed'),
+        'description' => t('The GD library for PHP is missing or outdated. Check the <a href="@url">PHP image documentation</a> for information on how to correct this.', array('@url' => 'http://www.php.net/manual/book.image.php')),
+        'severity' => REQUIREMENT_ERROR,
+      );
+      return $requirements;
     }
-    return FALSE;
+
+    $info = gd_info();
+    $requirements['rotate_and_desaturate'] = array(
+      'title' => t('GD library rotate and desaturate effects'),
+      'value' => $info['GD Version'],
+    );
+
+    // Check for filter and rotate support.
+    if (!function_exists('imagefilter') || !function_exists('imagerotate')) {
+      $requirements['rotate_and_desaturate']['severity'] = REQUIREMENT_WARNING;
+      $requirements['rotate_and_desaturate']['description'] = t('The GD Library for PHP is enabled, but was compiled without support for functions used by the rotate and desaturate effects. It was probably compiled using the official GD libraries from http://www.libgd.org instead of the GD library bundled with PHP. You should recompile PHP --with-gd using the bundled GD library. See <a href="@url">the PHP manual</a>.', array('@url' => 'http://www.php.net/manual/book.image.php'));
+    }
+
+    return $requirements;
   }
 
   /**
diff --git a/core/modules/system/lib/Drupal/system/Tests/Image/ToolkitTest.php b/core/modules/system/lib/Drupal/system/Tests/Image/ToolkitTest.php
index 0158249..0a00694 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Image/ToolkitTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Image/ToolkitTest.php
@@ -20,14 +20,17 @@ public static function getInfo() {
   }
 
   /**
-   * Check that ImageToolkitManager::getAvailableToolkits() only returns
-   * available toolkits.
+   * Checks toolkits and their requirements.
    */
-  function testGetAvailableToolkits() {
+  function testGetToolkits() {
     $manager = $this->container->get('image.toolkit.manager');
-    $toolkits = $manager->getAvailableToolkits();
-    $this->assertTrue(isset($toolkits['test']), 'The working toolkit was returned.');
-    $this->assertFalse(isset($toolkits['broken']), 'The toolkit marked unavailable was not returned');
+    $toolkits = $manager->getDefinitions();
+    $this->assertTrue(isset($toolkits['test']), 'The test toolkit was found.');
+    $toolkit = $manager->createInstance('test');
+    $this->assertTrue($this->checkToolkitRequirements($toolkit), 'The test toolkit is valid.');
+    $this->assertTrue(isset($toolkits['broken']), 'The broken toolkit was found.');
+    $toolkit = $manager->createInstance('broken');
+    $this->assertFalse($this->checkToolkitRequirements($toolkit), 'The broken toolkit is invalid.');
     $this->assertToolkitOperationsCalled(array());
   }
 
diff --git a/core/modules/system/lib/Drupal/system/Tests/Image/ToolkitTestBase.php b/core/modules/system/lib/Drupal/system/Tests/Image/ToolkitTestBase.php
index ce328aa..98c1a5e 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Image/ToolkitTestBase.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Image/ToolkitTestBase.php
@@ -9,6 +9,7 @@
 
 use Drupal\simpletest\WebTestBase;
 use Drupal\Component\Utility\String;
+use Drupal\Core\ImageToolkit\ImageToolkitInterface;
 
 /**
  * Base class for image manipulation testing.
@@ -76,6 +77,26 @@ protected function getImage() {
   }
 
   /**
+   * Checks toolkit requirements.
+   *
+   * @param \Drupal\Core\ImageToolkit\ImageToolkitInterface\ImageToolkitInterface $toolkit
+   *   The toolkit object to be checked.
+   */
+  protected function checkToolkitRequirements(ImageToolkitInterface $toolkit) {
+    $check = $toolkit->requirements();
+    if (empty($check)) {
+      return TRUE;
+    }
+    foreach ($check as $requirement) {
+      $requirement['severity'] = isset($requirement['severity']) ? $requirement['severity'] : REQUIREMENT_OK;
+      if ($requirement['severity'] == REQUIREMENT_ERROR) {
+        return FALSE;
+      }
+    }
+    return TRUE;
+  }
+
+  /**
    * Assert that all of the specified image toolkit operations were called
    * exactly once once, other values result in failure.
    *
diff --git a/core/modules/system/tests/modules/image_test/lib/Drupal/image_test/Plugin/ImageToolkit/BrokenToolkit.php b/core/modules/system/tests/modules/image_test/lib/Drupal/image_test/Plugin/ImageToolkit/BrokenToolkit.php
index e5ead27..d415227 100644
--- a/core/modules/system/tests/modules/image_test/lib/Drupal/image_test/Plugin/ImageToolkit/BrokenToolkit.php
+++ b/core/modules/system/tests/modules/image_test/lib/Drupal/image_test/Plugin/ImageToolkit/BrokenToolkit.php
@@ -8,7 +8,7 @@
 namespace Drupal\image_test\Plugin\ImageToolkit;
 
 /**
- * Defines a Test toolkit for image manipulation within Drupal.
+ * Defines a broken test toolkit for image manipulation within Drupal.
  *
  * @ImageToolkit(
  *   id = "broken",
@@ -20,7 +20,15 @@ class BrokenToolkit extends TestToolkit {
   /**
    * {@inheritdoc}
    */
-  public static function isAvailable() {
-    return FALSE;
+  public function requirements() {
+    $requirements = array();
+    $requirements['broken_toolkit'] = array(
+      'title' => t('Broken image toolkit'),
+      'value' => t('Broken'),
+      'description' => t('This toolkit is broken on purpose.'),
+      'severity' => REQUIREMENT_ERROR,
+    );
+    return $requirements;
   }
+
 }
diff --git a/core/modules/system/tests/modules/image_test/lib/Drupal/image_test/Plugin/ImageToolkit/TestToolkit.php b/core/modules/system/tests/modules/image_test/lib/Drupal/image_test/Plugin/ImageToolkit/TestToolkit.php
index 43800617..2f84e3e 100644
--- a/core/modules/system/tests/modules/image_test/lib/Drupal/image_test/Plugin/ImageToolkit/TestToolkit.php
+++ b/core/modules/system/tests/modules/image_test/lib/Drupal/image_test/Plugin/ImageToolkit/TestToolkit.php
@@ -37,6 +37,11 @@ public function settingsFormSubmit($form, &$form_state) {}
   /**
    * {@inheritdoc}
    */
+  public function settingsFormValidate(array &$form, array &$form_state) {}
+
+  /**
+   * {@inheritdoc}
+   */
   public function getInfo(ImageInterface $image) {
     $this->logCall('get_info', array($image));
 
@@ -126,8 +131,8 @@ protected function logCall($op, $args) {
   /**
    * {@inheritdoc}
    */
-  public static function isAvailable() {
-    return TRUE;
+  public function requirements() {
+    return array();
   }
 
   /**
