diff --git a/sites/all/modules/imagecache/imagecache.module b/sites/all/modules/imagecache/imagecache.module
index 5a44163..320ca52 100644
--- a/sites/all/modules/imagecache/imagecache.module
+++ b/sites/all/modules/imagecache/imagecache.module
@@ -570,6 +570,7 @@ function imagecache_build_derivative($actions, $src, $dst) {
     watchdog('imagecache', 'Cached image file %dst already exists but is being regenerated. There may be an issue with your rewrite configuration.', array('%dst' => $dst), WATCHDOG_WARNING);
   }
 
+  $unchanged = TRUE;
   foreach ($actions as $action) {
     if (!empty($action['data'])) {
       // Make sure the width and height are computed first so they can be used
@@ -587,13 +588,22 @@ function imagecache_build_derivative($actions, $src, $dst) {
         $action['data']['yoffset'] = _imagecache_keyword_filter($action['data']['yoffset'], $image->info['height'], $action['data']['height']);
       }
     }
-    if (!_imagecache_apply_action($action, $image)) {
+    
+    $action_result = _imagecache_apply_action($action, $image);
+    if ($action_result !== IMAGEAPI_UNCHANGED) { $unchanged = false; }
+    if (!$action_result) {
       watchdog('imagecache', 'action(id:%id): %action failed for %src', array('%id' => $action['actionid'], '%action' => $action['action'], '%src' => $src), WATCHDOG_ERROR);
       return FALSE;
     }
   }
 
-  if (!imageapi_image_close($image, $dst)) {
+  if ($unchanged) {
+    $closed = file_copy($src, $dst, FILE_EXISTS_REPLACE);
+  } else {
+    $closed = imageapi_image_close($image, $dst);
+  }
+  
+  if (!closed) {
     watchdog('imagecache', 'There was an error saving the new image file %dst.', array('%dst' => $dst), WATCHDOG_ERROR);
     return FALSE;
   }
diff --git a/sites/all/modules/imagecache/imagecache_actions.inc b/sites/all/modules/imagecache/imagecache_actions.inc
index a0f520b..89bf883 100644
--- a/sites/all/modules/imagecache/imagecache_actions.inc
+++ b/sites/all/modules/imagecache/imagecache_actions.inc
@@ -55,11 +55,12 @@ function imagecache_scale_image(&$image, $data) {
   // Set impossibly large values if the width and height aren't set.
   $data['width'] = $data['width'] ? $data['width'] : 9999999;
   $data['height'] = $data['height'] ? $data['height'] : 9999999;
-  if (!imageapi_image_scale($image, $data['width'], $data['height'], $data['upscale'])) {
+  $success = imageapi_image_scale($image, $data['width'], $data['height'], $data['upscale']);
+  if (!$success) {
     watchdog('imagecache', 'imagecache_scale_image failed. image: %image, data: %data.', array('%image' => $image->source, '%data' => print_r($data, TRUE)), WATCHDOG_ERROR);
     return FALSE;
   }
-  return TRUE;
+  return $success;
 }
 
 
