diff --git a/modules/image/image.admin.inc b/modules/image/image.admin.inc
index 9f0fab2..5ece639 100644
--- a/modules/image/image.admin.inc
+++ b/modules/image/image.admin.inc
@@ -567,6 +567,7 @@ function image_crop_form($data) {
     'width' => '',
     'height' => '',
     'anchor' => 'center-center',
+    'upcrop' => 1,
   );
 
   $form = image_resize_form($data);
@@ -588,6 +589,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;
 }
@@ -889,7 +896,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/modules/image/image.effects.inc b/modules/image/image.effects.inc
index 35a6a74..4a42f13 100644
--- a/modules/image/image.effects.inc
+++ b/modules/image/image.effects.inc
@@ -181,8 +181,20 @@ function image_crop_effect(&$image, $data) {
   );
 
   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, '%path' => $image->source, '%mimetype' => $image->info['mime_type'], '%dimensions' => $image->info['width'] . 'x' . $image->info['height']), WATCHDOG_ERROR);
     return FALSE;
