diff --git a/core/modules/image/image.api.php b/core/modules/image/image.api.php
index 7678142..b376629 100644
--- a/core/modules/image/image.api.php
+++ b/core/modules/image/image.api.php
@@ -38,6 +38,36 @@ function hook_image_style_flush($style) {
   cache('mymodule')->deleteAll();
 }
 
+/**
+ * Respond to image style derivative creation.
+ *
+ * This hook enables modules to take action before a derivative image is
+ * created for a style. For example, this can be used to log the creation
+ * of the image, or to set variables that are common to more effects within
+ * the style.
+ *
+ * @param \Drupal\image\ImageStyleInterface $style
+ *   The image style object for which the derivative is being created.
+ * @param string $original_uri
+ *   Original image file URI.
+ * @param string $derivative_uri
+ *   Derivative image file URI.
+ */
+function hook_image_create_derivative(\Drupal\image\ImageStyleInterface $style, $original_uri, $derivative_uri) {
+  // Log creation of the derivative image.
+  watchdog(
+    'image',
+    t(
+      'Creating derivative image: %derivative for style: %style from image: %original',
+      array(
+        '%style' => $style->id(),
+        '%derivative' => $derivative_uri,
+        '%original' => $original_uri,
+      )
+    )
+  );
+}
+
  /**
   * @} End of "addtogroup hooks".
   */
diff --git a/core/modules/image/lib/Drupal/image/Entity/ImageStyle.php b/core/modules/image/lib/Drupal/image/Entity/ImageStyle.php
index aabef1e..cbb3866 100644
--- a/core/modules/image/lib/Drupal/image/Entity/ImageStyle.php
+++ b/core/modules/image/lib/Drupal/image/Entity/ImageStyle.php
@@ -91,6 +91,19 @@ class ImageStyle extends ConfigEntityBase implements ImageStyleInterface {
   protected $effectsBag;
 
   /**
+   * The array of run-time parameters for this image style.
+   *
+   * Parameters can be used by to carry on run-time information between image
+   * effects. This can be the case when there are effects that depend on the
+   * result of other effects, or when effect need e.g to access a common CDN.
+   * Modules can preset the content of the parameters before a derivative image
+   * creation is executed by hooking into hook_image_create_derivative().
+   *
+   * @var array
+   */
+  protected $parameters = array();
+
+  /**
    * Overrides Drupal\Core\Entity\Entity::id().
    */
   public function id() {
@@ -279,6 +292,11 @@ public function flush($path = NULL) {
    * {@inheritdoc}
    */
   public function createDerivative($original_uri, $derivative_uri) {
+
+    // Let other modules update as necessary.
+    $module_handler = \Drupal::moduleHandler();
+    $module_handler->invokeAll('image_style_create_derivative', array($this, $original_uri, $derivative_uri));
+
     // Get the folder for the final location of this style.
     $directory = drupal_dirname($derivative_uri);
 
@@ -294,7 +312,7 @@ public function createDerivative($original_uri, $derivative_uri) {
     }
 
     foreach ($this->getEffects() as $effect) {
-      $effect->applyEffect($image);
+      $effect->applyEffect($image, $this);
     }
 
     if (!$image->save($derivative_uri)) {
@@ -378,4 +396,25 @@ public function getExportProperties() {
     return $properties;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function getParameter($parameter) {
+    return isset($this->parameters[$parameter]) ? $this->parameters[$parameter] : FALSE;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getParameters() {
+    return $this->parameters;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setParameter($parameter, $value) {
+    $this->parameters[$parameter] = $value;
+  }
+
 }
diff --git a/core/modules/image/lib/Drupal/image/ImageEffectInterface.php b/core/modules/image/lib/Drupal/image/ImageEffectInterface.php
index 66b7f4e..514960a 100644
--- a/core/modules/image/lib/Drupal/image/ImageEffectInterface.php
+++ b/core/modules/image/lib/Drupal/image/ImageEffectInterface.php
@@ -10,6 +10,7 @@
 use Drupal\Component\Plugin\PluginInspectionInterface;
 use Drupal\Component\Plugin\ConfigurablePluginInterface;
 use Drupal\Core\Image\ImageInterface;
+use Drupal\image\ImageStyleInterface;
 
 /**
  * Defines the interface for image effects.
@@ -21,11 +22,13 @@
    *
    * @param \Drupal\Core\Image\ImageInterface $image
    *   An image file object.
+   * @param \Drupal\image\ImageStyleInterface $style
+   *   The image style object for which the effect is being applied.
    *
    * @return bool
    *   TRUE on success. FALSE if unable to perform the image effect on the image.
    */
-  public function applyEffect(ImageInterface $image);
+  public function applyEffect(ImageInterface $image, ImageStyleInterface $style);
 
   /**
    * Determines the dimensions of the styled image.
diff --git a/core/modules/image/lib/Drupal/image/ImageStyleInterface.php b/core/modules/image/lib/Drupal/image/ImageStyleInterface.php
index 3783fc4..90e60e5 100644
--- a/core/modules/image/lib/Drupal/image/ImageStyleInterface.php
+++ b/core/modules/image/lib/Drupal/image/ImageStyleInterface.php
@@ -130,4 +130,32 @@ public function saveImageEffect(array $configuration);
    */
   public function deleteImageEffect(ImageEffectInterface $effect);
 
+  /**
+   * Returns a run-time parameter.
+   *
+   * @param string $parameter
+   *   The parameter name.
+   *
+   * @return mixed
+   *   The value of the run-time parameter.
+   */
+  public function getParameter($parameter);
+
+  /**
+   * Returns the run-time parameters for this style.
+   *
+   * @return array
+   *   The array of run-time parameters.
+   */
+  public function getParameters();
+
+  /**
+   * Sets a run-time parameter.
+   *
+   * @param string $parameter
+   *   The parameter name.
+   * @param mixed $value
+   *   The parameter value.
+   */
+  public function setParameter($parameter, $value);
 }
diff --git a/core/modules/image/lib/Drupal/image/Plugin/ImageEffect/CropImageEffect.php b/core/modules/image/lib/Drupal/image/Plugin/ImageEffect/CropImageEffect.php
index 39f58f3..da6a2c8 100644
--- a/core/modules/image/lib/Drupal/image/Plugin/ImageEffect/CropImageEffect.php
+++ b/core/modules/image/lib/Drupal/image/Plugin/ImageEffect/CropImageEffect.php
@@ -10,6 +10,7 @@
 use Drupal\Core\Annotation\Translation;
 use Drupal\Core\Image\ImageInterface;
 use Drupal\image\Annotation\ImageEffect;
+use Drupal\image\ImageStyleInterface;
 
 /**
  * Crops an image resource.
@@ -25,7 +26,7 @@ class CropImageEffect extends ResizeImageEffect {
   /**
    * {@inheritdoc}
    */
-  public function applyEffect(ImageInterface $image) {
+  public function applyEffect(ImageInterface $image, ImageStyleInterface $style) {
     list($x, $y) = explode('-', $this->configuration['anchor']);
     $x = image_filter_keyword($x, $image->getWidth(), $this->configuration['width']);
     $y = image_filter_keyword($y, $image->getHeight(), $this->configuration['height']);
diff --git a/core/modules/image/lib/Drupal/image/Plugin/ImageEffect/DesaturateImageEffect.php b/core/modules/image/lib/Drupal/image/Plugin/ImageEffect/DesaturateImageEffect.php
index 912bec9..4c17100 100644
--- a/core/modules/image/lib/Drupal/image/Plugin/ImageEffect/DesaturateImageEffect.php
+++ b/core/modules/image/lib/Drupal/image/Plugin/ImageEffect/DesaturateImageEffect.php
@@ -11,6 +11,7 @@
 use Drupal\Core\Image\ImageInterface;
 use Drupal\image\Annotation\ImageEffect;
 use Drupal\image\ImageEffectBase;
+use Drupal\image\ImageStyleInterface;
 
 /**
  * Desaturates (grayscale) an image resource.
@@ -32,7 +33,7 @@ public function transformDimensions(array &$dimensions) {
   /**
    * {@inheritdoc}
    */
-  public function applyEffect(ImageInterface $image) {
+  public function applyEffect(ImageInterface $image, ImageStyleInterface $style) {
     if (!$image->desaturate()) {
       watchdog('image', 'Image desaturate failed using the %toolkit toolkit on %path (%mimetype, %dimensions)', array('%toolkit' => $image->getToolkitId(), '%path' => $image->getSource(), '%mimetype' => $image->getMimeType(), '%dimensions' => $image->getWidth() . 'x' . $image->getHeight()), WATCHDOG_ERROR);
       return FALSE;
diff --git a/core/modules/image/lib/Drupal/image/Plugin/ImageEffect/ResizeImageEffect.php b/core/modules/image/lib/Drupal/image/Plugin/ImageEffect/ResizeImageEffect.php
index 27d5538..e4477ec 100644
--- a/core/modules/image/lib/Drupal/image/Plugin/ImageEffect/ResizeImageEffect.php
+++ b/core/modules/image/lib/Drupal/image/Plugin/ImageEffect/ResizeImageEffect.php
@@ -12,6 +12,7 @@
 use Drupal\image\Annotation\ImageEffect;
 use Drupal\image\ConfigurableImageEffectInterface;
 use Drupal\image\ImageEffectBase;
+use Drupal\image\ImageStyleInterface;
 
 /**
  * Resizes an image resource.
@@ -27,7 +28,7 @@ class ResizeImageEffect extends ImageEffectBase implements ConfigurableImageEffe
   /**
    * {@inheritdoc}
    */
-  public function applyEffect(ImageInterface $image) {
+  public function applyEffect(ImageInterface $image, ImageStyleInterface $style) {
     if (!$image->resize($this->configuration['width'], $this->configuration['height'])) {
       watchdog('image', 'Image resize failed using the %toolkit toolkit on %path (%mimetype, %dimensions)', array('%toolkit' => $image->getToolkitId(), '%path' => $image->getSource(), '%mimetype' => $image->getMimeType(), '%dimensions' => $image->getWidth() . 'x' . $image->getHeight()), WATCHDOG_ERROR);
       return FALSE;
diff --git a/core/modules/image/lib/Drupal/image/Plugin/ImageEffect/RotateImageEffect.php b/core/modules/image/lib/Drupal/image/Plugin/ImageEffect/RotateImageEffect.php
index 23c0560..0f0101a 100644
--- a/core/modules/image/lib/Drupal/image/Plugin/ImageEffect/RotateImageEffect.php
+++ b/core/modules/image/lib/Drupal/image/Plugin/ImageEffect/RotateImageEffect.php
@@ -12,6 +12,7 @@
 use Drupal\image\Annotation\ImageEffect;
 use Drupal\image\ConfigurableImageEffectInterface;
 use Drupal\image\ImageEffectBase;
+use Drupal\image\ImageStyleInterface;
 
 /**
  * Rotates an image resource.
@@ -27,7 +28,7 @@ class RotateImageEffect extends ImageEffectBase implements ConfigurableImageEffe
   /**
    * {@inheritdoc}
    */
-  public function applyEffect(ImageInterface $image) {
+  public function applyEffect(ImageInterface $image, ImageStyleInterface $style) {
     // Convert short #FFF syntax to full #FFFFFF syntax.
     if (strlen($this->configuration['bgcolor']) == 4) {
       $c = $this->configuration['bgcolor'];
diff --git a/core/modules/image/lib/Drupal/image/Plugin/ImageEffect/ScaleAndCropImageEffect.php b/core/modules/image/lib/Drupal/image/Plugin/ImageEffect/ScaleAndCropImageEffect.php
index 39bd2ec..29b5ff5 100644
--- a/core/modules/image/lib/Drupal/image/Plugin/ImageEffect/ScaleAndCropImageEffect.php
+++ b/core/modules/image/lib/Drupal/image/Plugin/ImageEffect/ScaleAndCropImageEffect.php
@@ -10,6 +10,7 @@
 use Drupal\Core\Annotation\Translation;
 use Drupal\Core\Image\ImageInterface;
 use Drupal\image\Annotation\ImageEffect;
+use Drupal\image\ImageStyleInterface;
 
 /**
  * Scales and crops an image resource.
@@ -25,7 +26,7 @@ class ScaleAndCropImageEffect extends ResizeImageEffect {
   /**
    * {@inheritdoc}
    */
-  public function applyEffect(ImageInterface $image) {
+  public function applyEffect(ImageInterface $image, ImageStyleInterface $style) {
     if (!$image->scaleAndCrop($this->configuration['width'], $this->configuration['height'])) {
       watchdog('image', 'Image scale and crop failed using the %toolkit toolkit on %path (%mimetype, %dimensions)', array('%toolkit' => $image->getToolkitId(), '%path' => $image->getSource(), '%mimetype' => $image->getMimeType(), '%dimensions' => $image->getWidth() . 'x' . $image->getHeight()), WATCHDOG_ERROR);
       return FALSE;
diff --git a/core/modules/image/lib/Drupal/image/Plugin/ImageEffect/ScaleImageEffect.php b/core/modules/image/lib/Drupal/image/Plugin/ImageEffect/ScaleImageEffect.php
index 87b0dac..31f8b7c 100644
--- a/core/modules/image/lib/Drupal/image/Plugin/ImageEffect/ScaleImageEffect.php
+++ b/core/modules/image/lib/Drupal/image/Plugin/ImageEffect/ScaleImageEffect.php
@@ -11,6 +11,7 @@
 use Drupal\Component\Utility\Image;
 use Drupal\Core\Image\ImageInterface;
 use Drupal\image\Annotation\ImageEffect;
+use Drupal\image\ImageStyleInterface;
 
 /**
  * Scales an image resource.
@@ -26,7 +27,7 @@ class ScaleImageEffect extends ResizeImageEffect {
   /**
    * {@inheritdoc}
    */
-  public function applyEffect(ImageInterface $image) {
+  public function applyEffect(ImageInterface $image, ImageStyleInterface $style) {
     if (!$image->scale($this->configuration['width'], $this->configuration['height'], $this->configuration['upscale'])) {
       watchdog('image', 'Image scale failed using the %toolkit toolkit on %path (%mimetype, %dimensions)', array('%toolkit' => $image->getToolkitId(), '%path' => $image->getSource(), '%mimetype' => $image->getMimeType(), '%dimensions' => $image->getWidth() . 'x' . $image->getHeight()), WATCHDOG_ERROR);
       return FALSE;
diff --git a/core/modules/image/lib/Drupal/image/Tests/ImageEffectsTest.php b/core/modules/image/lib/Drupal/image/Tests/ImageEffectsTest.php
index 74f41ec..c693b7e 100644
--- a/core/modules/image/lib/Drupal/image/Tests/ImageEffectsTest.php
+++ b/core/modules/image/lib/Drupal/image/Tests/ImageEffectsTest.php
@@ -29,6 +29,13 @@ class ImageEffectsTest extends ToolkitTestBase {
    */
   protected $manager;
 
+  /**
+   * A dummy image style entity for testing.
+   *
+   * @var \Drupal\image\ImageStyleManager
+   */
+  protected $style;
+
   public static function getInfo() {
     return array(
       'name' => 'Image effects',
@@ -39,6 +46,7 @@ public static function getInfo() {
 
   public function setUp() {
     parent::setUp();
+    $this->style = entity_create('image_style', array());
     $this->manager = $this->container->get('plugin.manager.image.effect');
   }
 
@@ -143,6 +151,16 @@ function testRotateEffect() {
   }
 
   /**
+   * Test passing parameters between effect and style.
+   */
+  function testParameterEffect() {
+    $this->assertImageEffect('image_module_test_parameter', array());
+
+    // Check that the effect has set the test parameter.
+    $this->assertEqual($this->style->getParameter('test_parameter'), 'test_value', 'Style parameter was set correctly by the effect');
+  }
+
+  /**
    * Test image effect caching.
    */
   function testImageEffectsCaching() {
@@ -174,7 +192,7 @@ function testImageEffectsCaching() {
    */
   protected function assertImageEffect($effect_name, array $data) {
     $effect = $this->manager->createInstance($effect_name, array('data' => $data));
-    return $this->assertTrue($effect->applyEffect($this->image), 'Function returned the expected value.');
+    return $this->assertTrue($effect->applyEffect($this->image, $this->style), 'Function returned the expected value.');
   }
 
 }
diff --git a/core/modules/image/tests/modules/image_module_test/lib/Drupal/image_module_test/Plugin/ImageEffect/NullTestImageEffect.php b/core/modules/image/tests/modules/image_module_test/lib/Drupal/image_module_test/Plugin/ImageEffect/NullTestImageEffect.php
index 52731fe..43d0d88 100644
--- a/core/modules/image/tests/modules/image_module_test/lib/Drupal/image_module_test/Plugin/ImageEffect/NullTestImageEffect.php
+++ b/core/modules/image/tests/modules/image_module_test/lib/Drupal/image_module_test/Plugin/ImageEffect/NullTestImageEffect.php
@@ -11,6 +11,7 @@
 use Drupal\Core\Image\ImageInterface;
 use Drupal\image\Annotation\ImageEffect;
 use Drupal\image\ImageEffectBase;
+use Drupal\image\ImageStyleInterface;
 
 /**
  * Performs no operation on an image resource.
@@ -25,7 +26,7 @@ class NullTestImageEffect extends ImageEffectBase {
   /**
    * {@inheritdoc}
    */
-  public function applyEffect(ImageInterface $image) {
+  public function applyEffect(ImageInterface $image, ImageStyleInterface $style) {
     return TRUE;
   }
 
diff --git a/core/modules/image/tests/modules/image_module_test/lib/Drupal/image_module_test/Plugin/ImageEffect/ParameterTestImageEffect.php b/core/modules/image/tests/modules/image_module_test/lib/Drupal/image_module_test/Plugin/ImageEffect/ParameterTestImageEffect.php
new file mode 100644
index 0000000..8775214
--- /dev/null
+++ b/core/modules/image/tests/modules/image_module_test/lib/Drupal/image_module_test/Plugin/ImageEffect/ParameterTestImageEffect.php
@@ -0,0 +1,32 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\image_module_test\Plugin\ImageEffect\ParameterTestImageEffect.
+ */
+
+namespace Drupal\image_module_test\Plugin\ImageEffect;
+
+use Drupal\Core\Image\ImageInterface;
+use Drupal\image\ImageEffectBase;
+use Drupal\image\ImageStyleInterface;
+
+/**
+ * Sets a style parameter, performing no operation on an image resource.
+ *
+ * @ImageEffect(
+ *   id = "image_module_test_parameter",
+ *   label = @Translation("Image module parameter setting test")
+ * )
+ */
+class ParameterTestImageEffect extends ImageEffectBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function applyEffect(ImageInterface $image, ImageStyleInterface $style) {
+    $style->setParameter('test_parameter', 'test_value');
+    return TRUE;
+  }
+
+}
