diff --git a/MagickCore/image.c b/MagickCore/image.c
index b51c52d..ebd487e 100644
--- a/MagickCore/image.c
+++ b/MagickCore/image.c
@@ -1058,11 +1058,13 @@
   assert(source_image != (Image *) NULL);
   assert(geometry != (RectangleInfo *) NULL);
   assert(offset != (OffsetInfo *) NULL);
-  if ((geometry->width == 0) || (geometry->height == 0) || (offset->x < 0) ||
-      (offset->y < 0) || (offset->x >= (ssize_t) geometry->width) ||
-      (offset->y >= (ssize_t) geometry->height))
+  if ((offset->x < 0) || (offset->y < 0) ||
+      ((offset->x+geometry->width) >= (ssize_t) image->columns) ||
+      ((offset->y+geometry->height) >= (ssize_t) image->rows))
     ThrowBinaryException(OptionError,"GeometryDoesNotContainImage",
       image->filename);
+  if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
+    return(MagickFalse);
   /*
     Copy image pixels.
   */
diff --git a/MagickWand/convert.c b/MagickWand/convert.c
index 690b33d..232bec7 100644
--- a/MagickWand/convert.c
+++ b/MagickWand/convert.c
@@ -1181,7 +1181,6 @@
               ThrowConvertException(OptionError,"MissingArgument",option);
             if (IsGeometry(argv[i]) == MagickFalse)
               ThrowConvertInvalidArgumentException(option,argv[i]);
-            i++;
             break;
           }
         if (LocaleCompare("crop",option+1) == 0)
diff --git a/MagickWand/mogrify.c b/MagickWand/mogrify.c
index 977527a..708199a 100644
--- a/MagickWand/mogrify.c
+++ b/MagickWand/mogrify.c
@@ -1265,29 +1265,6 @@
             kernel_info=DestroyKernelInfo(kernel_info);
             break;
           }
-        if (LocaleCompare("copy",option+1) == 0)
-          {
-            Image
-              *source_image;
-
-            OffsetInfo
-              offset;
-
-            /*
-              Copy image pixels.
-            */
-            (void) SyncImageSettings(mogrify_info,*image,exception);
-            flags=ParsePageGeometry(*image,argv[i+2],&geometry,exception);
-            offset.x=geometry.x;
-            offset.y=geometry.y;
-            flags=ParsePageGeometry(*image,argv[i+1],&geometry,exception);
-            source_image=(*image);
-            if ((*image)->next != (Image *) NULL)
-              source_image=(*image)->next;
-            status=CopyImagePixels(*image,source_image,&geometry,&offset,
-              exception);
-            break;
-          }
         if (LocaleCompare("crop",option+1) == 0)
           {
             /*
@@ -4393,7 +4370,6 @@
               ThrowMogrifyException(OptionError,"MissingArgument",option);
             if (IsGeometry(argv[i]) == MagickFalse)
               ThrowMogrifyInvalidArgumentException(option,argv[i]);
-            i++;
             break;
           }
         if (LocaleCompare("crop",option+1) == 0)
@@ -7873,6 +7849,33 @@
             *images=image;
             break;
           }
+        if (LocaleCompare("copy",option+1) == 0)
+          {
+            Image
+              *source_image;
+
+            OffsetInfo
+              offset;
+
+            RectangleInfo
+              geometry;
+
+            /*
+              Copy image pixels.
+            */
+            (void) SyncImageSettings(mogrify_info,*images,exception);
+            (void) ParsePageGeometry(*images,argv[i+2],&geometry,exception);
+            offset.x=geometry.x;
+            offset.y=geometry.y;
+            source_image=(*images);
+            if (source_image->next != (Image *) NULL)
+              source_image=source_image->next;
+            (void) ParsePageGeometry(source_image,argv[i+1],&geometry,
+              exception);
+            status=CopyImagePixels(*images,source_image,&geometry,&offset,
+              exception);
+            break;
+          }
         break;
       }
       case 'd':
diff --git a/MagickWand/operation.c b/MagickWand/operation.c
index a3bc47e..14a3ec7 100644
--- a/MagickWand/operation.c
+++ b/MagickWand/operation.c
@@ -2165,32 +2165,6 @@
           kernel_info=DestroyKernelInfo(kernel_info);
           break;
         }
-        if (LocaleCompare("copy",option+1) == 0)
-          {
-            Image
-              *source_image;
-
-            OffsetInfo
-              offset;
-
-            /*
-              Copy image pixels.
-            */
-            if (IfMagickFalse(IsGeometry(arg1)))
-              CLIWandExceptArgBreak(OptionError,"InvalidArgument",option,arg1);
-            if (IfMagickFalse(IsGeometry(arg2)))
-              CLIWandExceptArgBreak(OptionError,"InvalidArgument",option,arg1);
-            flags=ParsePageGeometry(_image,arg2,&geometry,exception);
-            offset.x=geometry.x;
-            offset.y=geometry.y;
-            flags=ParsePageGeometry(_image,arg1,&geometry,exception);
-            source_image=_image;
-            if (_image->next != (Image *) NULL)
-              source_image=_image->next;
-            (void) CopyImagePixels(_image,source_image,&geometry,&offset,
-              exception);
-            break;
-          }
       if (LocaleCompare("crop",option+1) == 0)
         {
           /* WARNING: This can generate multiple images! */
@@ -3897,6 +3871,35 @@
           source_image=DestroyImage(source_image);
           break;
         }
+        if (LocaleCompare("copy",option+1) == 0)
+          {
+            Image
+              *source_image;
+
+            OffsetInfo
+              offset;
+
+            RectangleInfo
+              geometry;
+
+            /*
+              Copy image pixels.
+            */
+            if (IfMagickFalse(IsGeometry(arg1)))
+              CLIWandExceptArgBreak(OptionError,"InvalidArgument",option,arg1);
+            if (IfMagickFalse(IsGeometry(arg2)))
+              CLIWandExceptArgBreak(OptionError,"InvalidArgument",option,arg1);
+            (void) ParsePageGeometry(_images,arg2,&geometry,_exception);
+            offset.x=geometry.x;
+            offset.y=geometry.y;
+            (void) ParsePageGeometry(_images,arg1,&geometry,_exception);
+            source_image=_images;
+            if (source_image->next != (Image *) NULL)
+              source_image=source_image->next;
+            (void) CopyImagePixels(_images,source_image,&geometry,&offset,
+              _exception);
+            break;
+          }
       CLIWandExceptionBreak(OptionError,"UnrecognizedOption",option);
     }
     case 'd':