diff --git a/core/modules/image/image.admin.inc b/core/modules/image/image.admin.inc
index 9ed3aa9..0b5fd30 100644
--- a/core/modules/image/image.admin.inc
+++ b/core/modules/image/image.admin.inc
@@ -341,6 +341,7 @@ function image_effect_form_submit($form, &$form_state) {
   $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();
 }
@@ -436,6 +437,7 @@ function image_crop_form($data) {
     'width' => '',
     'height' => '',
     'anchor' => 'center-center',
+    'upcrop' => 1,
   );
 
   $form = image_resize_form($data);
@@ -457,7 +459,12 @@ function image_crop_form($data) {
     '#default_value' => $data['anchor'],
     '#description' => t('The part of the image that will be retained during the crop.'),
   );
-
+  $form['upcrop'] = array(
+    '#type' => 'checkbox',
+    '#default_value' => (isset($data['upcrop'])) ? $data['upcrop'] : 0,
+    '#title' => t('Allow Upcropping'),
+    '#description' => t('Let crop make images larger than their original size'),
+  );
   return $form;
 }
 
@@ -748,7 +755,8 @@ function theme_image_scale_summary($variables) {
  * @ingroup themeable
  */
 function theme_image_crop_summary($variables) {
-  return theme('image_resize_summary', $variables);
+  $data = $variables['data'];
+  return theme('image_resize_summary', $variables) . ' ' . ($data['upcrop'] ? '(' . t('upcropping allowed') . ')' : '');
 }
 
 /**
diff --git a/core/modules/image/image.effects.inc b/core/modules/image/image.effects.inc
index 619b09b..559f630 100644
--- a/core/modules/image/image.effects.inc
+++ b/core/modules/image/image.effects.inc
@@ -38,7 +38,7 @@ function image_image_effect_info() {
       'label' => t('Crop'),
       'help' => t('Cropping will remove portions of an image to make it the specified dimensions.'),
       'effect callback' => 'image_crop_effect',
-      'dimensions callback' => 'image_resize_dimensions',
+      'dimensions callback' => 'image_crop_dimensions',
       'form callback' => 'image_crop_form',
       'summary theme' => 'image_crop_summary',
     ),
@@ -170,6 +170,8 @@ function image_scale_dimensions(array &$dimensions, array $data) {
  *     of "XOFFSET-YOFFSET". XOFFSET is either a number of pixels or
  *     "left", "center", "right" and YOFFSET is either a number of pixels or
  *     "top", "center", "bottom".
+ *   - "upcrop": A boolean indicating that the image should be upcropped if the
+ *     dimensions are larger than the original image.
  *
  * @return bool
  *   TRUE on success. FALSE on failure to crop image.
@@ -180,11 +182,24 @@ function image_crop_effect($image, array $data) {
   // Set sane default values.
   $data += array(
     'anchor' => 'center-center',
+    'upcrop' => FALSE,
   );
 
   list($x, $y) = explode('-', $data['anchor']);
-  $x = image_filter_keyword($x, $image->info['width'], $data['width']);
-  $y = image_filter_keyword($y, $image->info['height'], $data['height']);
+  if(!$data['upcrop'] && $data['width'] >= $image->info['width']) {
+    $data['width'] = $image->info['width'];
+    $x = 0;
+  }
+  else {
+    $x = image_filter_keyword($x, $image->info['width'], $data['width']);
+  }
+  if(!$data['upcrop'] && $data['height'] >= $image->info['height']) {
+    $data['height'] = $image->info['height'];
+    $y = 0;
+  }
+  else {
+    $y = image_filter_keyword($y, $image->info['height'], $data['height']);
+  }
   if (!image_crop($image, $x, $y, $data['width'], $data['height'])) {
     watchdog('image', 'Image crop failed using the %toolkit toolkit on %path (%mimetype, %dimensions)', array('%toolkit' => $image->toolkit->getPluginId(), '%path' => $image->source, '%mimetype' => $image->info['mime_type'], '%dimensions' => $image->info['width'] . 'x' . $image->info['height']), WATCHDOG_ERROR);
     return FALSE;
@@ -193,6 +208,33 @@ function image_crop_effect($image, array $data) {
 }
 
 /**
+ * Image dimensions callback; Crop.
+ *
+ * @param array $dimensions
+ *   Dimensions to be modified - an array with components width and height, in
+ *   pixels.
+ * @param array $data
+ *   An array of attributes to use when performing the resize effect with the
+ *   following items:
+ *   - "width": An integer representing the desired width in pixels.
+ *   - "height": An integer representing the desired height in pixels.
+ *   - "upcrop": A boolean indicating that the image should be upcropped if the
+ *     dimensions are larger than the original image.
+ */
+function image_crop_dimensions(array &$dimensions, array $data) {
+  // If upcropping is enabled or if the source dimensions are greater than or
+  // equal to the target dimensions, the new image will have the exact
+  // dimensions defined for the effect; otherwise, each dimension will have the
+  // smaller of its respective source or target dimension
+  if($data['upcrop'] || $dimensions['width'] >= $data['width']) {
+    $dimensions['width'] = $data['width'];
+  }
+  if($data['upcrop'] || $dimensions['height'] >= $data['height']) {
+    $dimensions['height'] = $data['height'];
+  }
+}
+
+/**
  * Image effect callback; Scale and crop an image resource.
  *
  * @param object $image
diff --git a/core/modules/image/lib/Drupal/image/Tests/ImageDimensionsTest.php b/core/modules/image/lib/Drupal/image/Tests/ImageDimensionsTest.php
index e7552d2..b0f4ecd 100644
--- a/core/modules/image/lib/Drupal/image/Tests/ImageDimensionsTest.php
+++ b/core/modules/image/lib/Drupal/image/Tests/ImageDimensionsTest.php
@@ -188,6 +188,7 @@ function testImageDimensions() {
         'width' => 30,
         'height' => 30,
         'anchor' => 'center-center',
+        'upcrop' => TRUE,
       ),
       'weight' => 6,
     );
