diff --git a/coders/uyvy.c b/coders/uyvy.c
new file mode 100644
index 0000000..65b5c7d
--- /dev/null
+++ b/coders/uyvy.c
@@ -0,0 +1,368 @@
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%                        U   U  Y   Y  V   V  Y   Y                           %
+%                        U   U   Y Y   V   V   Y Y                            %
+%                        U   U    Y    V   V    Y                             %
+%                        U   U    Y     V V     Y                             %
+%                         UUU     Y      V      Y                             %
+%                                                                             %
+%                                                                             %
+%            Read/Write 16bit/pixel Interleaved YUV Image Format              %
+%                                                                             %
+%                              Software Design                                %
+%                                John Cristy                                  %
+%                                 July 1992                                   %
+%                                                                             %
+%                                                                             %
+%  Copyright 1999-2009 ImageMagick Studio LLC, a non-profit organization      %
+%  dedicated to making software imaging solutions freely available.           %
+%                                                                             %
+%  You may not use this file except in compliance with the License.  You may  %
+%  obtain a copy of the License at                                            %
+%                                                                             %
+%    http://www.imagemagick.org/script/license.php                            %
+%                                                                             %
+%  Unless required by applicable law or agreed to in writing, software        %
+%  distributed under the License is distributed on an "AS IS" BASIS,          %
+%  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   %
+%  See the License for the specific language governing permissions and        %
+%  limitations under the License.                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%
+*/
+
+/*
+  Include declarations.
+*/
+#include "magick/studio.h"
+#include "magick/blob.h"
+#include "magick/blob-private.h"
+#include "magick/cache.h"
+#include "magick/color.h"
+#include "magick/colorspace.h"
+#include "magick/exception.h"
+#include "magick/exception-private.h"
+#include "magick/image.h"
+#include "magick/image-private.h"
+#include "magick/list.h"
+#include "magick/magick.h"
+#include "magick/memory_.h"
+#include "magick/monitor.h"
+#include "magick/monitor-private.h"
+#include "magick/quantum-private.h"
+#include "magick/static.h"
+#include "magick/string_.h"
+#include "magick/module.h"
+
+/*
+  Forward declarations.
+*/
+static MagickBooleanType
+  WriteUYVYImage(const ImageInfo *,Image *);
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%   R e a d U Y V Y I m a g e                                                 %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  ReadUYVYImage() reads an image in the UYVY format and returns it.  It
+%  allocates the memory necessary for the new Image structure and returns a
+%  pointer to the new image.
+%
+%  The format of the ReadUYVYImage method is:
+%
+%      Image *ReadUYVYImage(const ImageInfo *image_info,
+%        ExceptionInfo *exception)
+%
+%  A description of each parameter follows:
+%
+%    o image_info: the image info.
+%
+%    o exception: return any errors or warnings in this structure.
+%
+%
+*/
+static Image *ReadUYVYImage(const ImageInfo *image_info,
+  ExceptionInfo *exception)
+{
+  Image
+    *image;
+
+  long
+    y;
+
+  MagickBooleanType
+    status;
+
+  register long
+    x;
+
+  register PixelPacket
+    *q;
+
+  register long
+    i;
+
+  unsigned char
+    u,
+    v,
+    y1,
+    y2;
+
+  /*
+    Open image file.
+  */
+  assert(image_info != (const ImageInfo *) NULL);
+  assert(image_info->signature == MagickSignature);
+  if (image_info->debug != MagickFalse)
+    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
+      image_info->filename);
+  assert(exception != (ExceptionInfo *) NULL);
+  assert(exception->signature == MagickSignature);
+  image=AcquireImage(image_info);
+  if ((image->columns == 0) || (image->rows == 0))
+    ThrowReaderException(OptionError,"MustSpecifyImageSize");
+  if ((image->columns % 2) != 0)
+    image->columns++;
+  (void) CopyMagickString(image->filename,image_info->filename,MaxTextExtent);
+  status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
+  if (status == MagickFalse)
+    return((Image *) NULL);
+  for (i=0; i < image->offset; i++)
+    if (ReadBlobByte(image) == EOF)
+      {
+        ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile",
+          image->filename);
+        break;
+      }
+  image->depth=8;
+  if (image_info->ping != MagickFalse)
+    {
+      (void) CloseBlob(image);
+      return(GetFirstImageInList(image));
+    }
+  /*
+    Accumulate UYVY, then unpack into two pixels.
+  */
+  for (y=0; y < (long) image->rows; y++)
+  {
+    q=QueueAuthenticPixels(image,0,y,image->columns,1,exception);
+    if (q == (PixelPacket *) NULL)
+      break;
+    for (x=0; x < (long) (image->columns >> 1); x++)
+    {
+      u=(unsigned char) ReadBlobByte(image);
+      y1=(unsigned char) ReadBlobByte(image);
+      v=(unsigned char) ReadBlobByte(image);
+      y2=(unsigned char) ReadBlobByte(image);
+      q->red=ScaleCharToQuantum(y1);
+      q->green=ScaleCharToQuantum(u);
+      q->blue=ScaleCharToQuantum(v);
+      q++;
+      q->red=ScaleCharToQuantum(y2);
+      q->green=ScaleCharToQuantum(u);
+      q->blue=ScaleCharToQuantum(v);
+      q++;
+    }
+    if (SyncAuthenticPixels(image,exception) == MagickFalse)
+      break;
+    status=SetImageProgress(image,LoadImageTag,y,image->rows);
+    if (status == MagickFalse)
+      break;
+  }
+  image->colorspace=YCbCrColorspace;
+  if (EOFBlob(image) != MagickFalse)
+    ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile",
+      image->filename);
+  (void) CloseBlob(image);
+  return(GetFirstImageInList(image));
+}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%   R e g i s t e r U Y V Y I m a g e                                         %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  RegisterUYVYImage() adds attributes for the UYVY image format to
+%  the list of supported formats.  The attributes include the image format
+%  tag, a method to read and/or write the format, whether the format
+%  supports the saving of more than one frame to the same file or blob,
+%  whether the format supports native in-memory I/O, and a brief
+%  description of the format.
+%
+%  The format of the RegisterUYVYImage method is:
+%
+%      unsigned long RegisterUYVYImage(void)
+%
+*/
+ModuleExport unsigned long RegisterUYVYImage(void)
+{
+  MagickInfo
+    *entry;
+
+  entry=SetMagickInfo("PAL");
+  entry->decoder=(DecodeImageHandler *) ReadUYVYImage;
+  entry->encoder=(EncodeImageHandler *) WriteUYVYImage;
+  entry->adjoin=MagickFalse;
+  entry->raw=MagickTrue;
+  entry->endian_support=MagickTrue;
+  entry->description=ConstantString("16bit/pixel interleaved YUV");
+  entry->module=ConstantString("UYVY");
+  (void) RegisterMagickInfo(entry);
+  entry=SetMagickInfo("UYVY");
+  entry->decoder=(DecodeImageHandler *) ReadUYVYImage;
+  entry->encoder=(EncodeImageHandler *) WriteUYVYImage;
+  entry->adjoin=MagickFalse;
+  entry->raw=MagickTrue;
+  entry->endian_support=MagickTrue;
+  entry->description=ConstantString("16bit/pixel interleaved YUV");
+  entry->module=ConstantString("UYVY");
+  (void) RegisterMagickInfo(entry);
+  return(MagickImageCoderSignature);
+}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%   U n r e g i s t e r U Y V Y I m a g e                                     %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  UnregisterUYVYImage() removes format registrations made by the
+%  UYVY module from the list of supported formats.
+%
+%  The format of the UnregisterUYVYImage method is:
+%
+%      UnregisterUYVYImage(void)
+%
+*/
+ModuleExport void UnregisterUYVYImage(void)
+{
+  (void) UnregisterMagickInfo("PAL");
+  (void) UnregisterMagickInfo("UYVY");
+}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%   W r i t e U Y V Y I m a g e                                               %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  WriteUYVYImage() writes an image to a file in the digital UYVY
+%  format.  This format, used by AccomWSD, is not dramatically higher quality
+%  than the 12bit/pixel YUV format, but has better locality.
+%
+%  The format of the WriteUYVYImage method is:
+%
+%      MagickBooleanType WriteUYVYImage(const ImageInfo *image_info,
+%        Image *image)
+%
+%  A description of each parameter follows.
+%
+%    o image_info: the image info.
+%
+%    o image:  The image.
+%      Implicit assumption: number of columns is even.
+%
+*/
+static MagickBooleanType WriteUYVYImage(const ImageInfo *image_info,
+  Image *image)
+{
+  MagickPixelPacket
+    pixel;
+
+  Image
+    *uyvy_image;
+
+  long
+    y;
+
+  MagickBooleanType
+    full,
+    status;
+
+  register const PixelPacket
+    *p;
+
+  register long
+    x;
+
+  /*
+    Open output image file.
+  */
+  assert(image_info != (const ImageInfo *) NULL);
+  assert(image_info->signature == MagickSignature);
+  assert(image != (Image *) NULL);
+  assert(image->signature == MagickSignature);
+  if (image->debug != MagickFalse)
+    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
+  if ((image->columns % 2) != 0)
+    image->columns++;
+  status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception);
+  if (status == MagickFalse)
+    return(status);
+  /*
+    Accumulate two pixels, then output.
+  */
+  uyvy_image=CloneImage(image,0,0,MagickTrue,&image->exception);
+  if (uyvy_image == (Image *) NULL)
+    ThrowWriterException(ResourceLimitError,image->exception.reason);
+  (void) TransformImageColorspace(uyvy_image,YCbCrColorspace);
+  full=MagickFalse;
+  (void) ResetMagickMemory(&pixel,0,sizeof(MagickPixelPacket));
+  for (y=0; y < (long) image->rows; y++)
+  {
+    p=GetVirtualPixels(uyvy_image,0,y,image->columns,1,&image->exception);
+    if (p == (const PixelPacket *) NULL)
+      break;
+    for (x=0; x < (long) image->columns; x++)
+    {
+      if (full != MagickFalse)
+        {
+          pixel.green=(pixel.green+p->green)/2;
+          pixel.blue=(pixel.blue+p->blue)/2;
+          (void) WriteBlobByte(image,ScaleQuantumToChar((Quantum) pixel.green));
+          (void) WriteBlobByte(image,ScaleQuantumToChar((Quantum) pixel.red));
+          (void) WriteBlobByte(image,ScaleQuantumToChar((Quantum) pixel.blue));
+          (void) WriteBlobByte(image,ScaleQuantumToChar(p->red));
+        }
+      pixel.red=(double) p->red;
+      pixel.green=(double) p->green;
+      pixel.blue=(double) p->blue;
+      full=full == MagickFalse ? MagickTrue : MagickFalse;
+      p++;
+    }
+    status=SetImageProgress(image,LoadImageTag,y,image->rows);
+    if (status == MagickFalse)
+      break;
+  }
+  uyvy_image=DestroyImage(uyvy_image);
+  (void) CloseBlob(image);
+  return(MagickTrue);
+}
