diff --git a/core/lib/Drupal/Core/ImageToolkit/ImageToolkitBase.php b/core/lib/Drupal/Core/ImageToolkit/ImageToolkitBase.php
index 4f28a6e..d92ac3d 100644
--- a/core/lib/Drupal/Core/ImageToolkit/ImageToolkitBase.php
+++ b/core/lib/Drupal/Core/ImageToolkit/ImageToolkitBase.php
@@ -14,6 +14,46 @@
   /**
    * {@inheritdoc}
    */
+  public function settingsFormValidate(array &$form, array &$form_state) {
+    $plugin_definition = $this->getPluginDefinition();
+    if ($form_state['values']['image_toolkit'] != $plugin_definition['id']) {
+      return;
+    }
+    require_once DRUPAL_ROOT . '/core/includes/install.inc';
+    $requirements = $this->getRequirements();
+    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') {
+        \Drupal::formBuilder()->setErrorByName('image_toolkit', $form_state, $this->t('Selected toolkit %toolkit_title is invalid.', array('%toolkit_title' => $plugin_definition['title'])));
+      }
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function getRequirements() {
     return array();
   }
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 a5f96f3..0b76b29 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()
@@ -231,14 +236,6 @@ public function getInfo(ImageInterface $image);
   public function getRequirements();
 
   /**
-   * Verifies Image Toolkit is set up correctly.
-   *
-   * @return bool
-   *   True if the GD toolkit is available on this machine.
-   */
-  public static function isAvailable();
-
-  /**
    * Returns a list of image types supported by the toolkit.
    *
    * @return array
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 6a59953..c023a1d 100644
--- a/core/modules/image/image.install
+++ b/core/modules/image/image.install
@@ -33,31 +33,29 @@ function image_requirements($phase) {
     return array();
   }
 
-  $toolkit = \Drupal::service('image.toolkit.manager')->getDefaultToolkit();
-  if ($toolkit) {
+  $requirements = array(
+    'image.toolkit' => array(
+      'title' => t('Image toolkit'),
+    ),
+  );
+  try {
+    // Get info about the default toolkit.
+    $toolkit = \Drupal::service('image.toolkit.manager')->getDefaultToolkit();
     $plugin_definition = $toolkit->getPluginDefinition();
-    $requirements = array(
-      'image.toolkit' => array(
-        'title' => t('Image toolkit'),
-        'value' => $toolkit->getPluginId(),
-        'description' => $plugin_definition['title'],
-      ),
-    );
+    $requirements['image.toolkit']['value'] = $toolkit->getPluginId();
+    $requirements['image.toolkit']['description'] = $plugin_definition['title'];
 
+    // Get requirements provided by the toolkit.
     foreach ($toolkit->getRequirements() as $key => $requirement) {
       $namespaced_key = 'image.toolkit.' . $toolkit->getPluginId() . '.' . $key;
       $requirements[$namespaced_key] = $requirement;
     }
   }
-  else {
-    $requirements = array(
-      'image.toolkit' => array(
-        'title' => t('Image toolkit'),
-        'value' => t('None'),
-        'description' => t("No image toolkit is configured on the site. Check PHP installed extensions or add a contributed toolkit that doesn't require a PHP extension. Make sure that at least one valid image toolkit is enabled."),
-        'severity' => REQUIREMENT_ERROR,
-      ),
-    );
+  catch (\Drupal\Core\ImageToolkit\ImageToolkitException $e) {
+    // No default image toolkit.
+    $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 a contributed toolkit that doesn't require a PHP extension. Make sure that at least one valid image toolkit is enabled.");
+    $requirements['image.toolkit']['severity'] = REQUIREMENT_ERROR;
   }
 
   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 1600b58..e0a37e1 100644
--- a/core/modules/system/lib/Drupal/system/Form/ImageToolkitForm.php
+++ b/core/modules/system/lib/Drupal/system/Form/ImageToolkitForm.php
@@ -38,7 +38,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);
     }
   }
@@ -99,6 +99,18 @@ public function buildForm(array $form, array &$form_state) {
   /**
    * {@inheritdoc}
    */
+  public function validateForm(array &$form, array &$form_state) {
+    // Call the form validation handler for each of the toolkits.
+    foreach ($this->availableToolkits as $toolkit) {
+      $toolkit->settingsFormValidate($form, $form_state);
+    }
+
+    parent::validateForm($form, $form_state);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function submitForm(array &$form, array &$form_state) {
     $this->configFactory->get('system.image')
       ->set('toolkit', $form_state['values']['image_toolkit'])
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 e5c5528..3c2d663 100644
--- a/core/modules/system/lib/Drupal/system/Plugin/ImageToolkit/GDToolkit.php
+++ b/core/modules/system/lib/Drupal/system/Plugin/ImageToolkit/GDToolkit.php
@@ -345,14 +345,6 @@ public function getRequirements() {
   /**
    * {@inheritdoc}
    */
-  public static function isAvailable() {
-    // GD2 support is available.
-    return function_exists('imagegd2');
-  }
-
-  /**
-   * {@inheritdoc}
-   */
   public static function supportedTypes() {
     return array(IMAGETYPE_PNG, IMAGETYPE_JPEG, IMAGETYPE_GIF);
   }
diff --git a/core/modules/system/lib/Drupal/system/Tests/Image/ToolkitGdTest.php b/core/modules/system/lib/Drupal/system/Tests/Image/ToolkitGdTest.php
index 805ee22..5b740d4 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Image/ToolkitGdTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Image/ToolkitGdTest.php
@@ -210,6 +210,8 @@ function testManipulations() {
       );
     }
 
+    $config = $this->container->get('config.factory')->get('system.image');
+    $config->set('toolkit', 'gd');
     $toolkit = $this->container->get('image.toolkit.manager')->createInstance('gd');
     $image_factory = $this->container->get('image.factory')->setToolkit($toolkit);
     foreach ($files as $file) {
diff --git a/core/modules/system/lib/Drupal/system/Tests/Image/ToolkitSetupFormTest.php b/core/modules/system/lib/Drupal/system/Tests/Image/ToolkitSetupFormTest.php
index 8489147..f58306d 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Image/ToolkitSetupFormTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Image/ToolkitSetupFormTest.php
@@ -75,5 +75,10 @@ function testToolkitSetupForm() {
     $edit = array('test[test_parameter]' => '20');
     $this->drupalPostForm(NULL, $edit, 'Save configuration');
     $this->assertEqual(\Drupal::config('system.image.test_toolkit')->get('test_parameter'), '20');
+
+    // Try setting the broken toolkit.
+    $edit = array('image_toolkit' => 'broken');
+    $this->drupalPostForm(NULL, $edit, 'Save configuration');
+    $this->assertEqual(\Drupal::config('system.image')->get('toolkit'), 'test');
   }
 }
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 b9e0d32..7ff023b 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..57fa697 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->getRequirements();
+    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..d1edaf3 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 getRequirements() {
+    $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 5d62a82..cd1b3da 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
@@ -153,13 +153,6 @@ protected function logCall($op, $args) {
   /**
    * {@inheritdoc}
    */
-  public static function isAvailable() {
-    return TRUE;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
   public static function supportedTypes() {
     return array(IMAGETYPE_PNG, IMAGETYPE_JPEG, IMAGETYPE_GIF);
   }
