diff --git a/coders/cip.c b/coders/cip.c
new file mode 100644
index 0000000..4520dc7
--- /dev/null
+++ b/coders/cip.c
@@ -0,0 +1,267 @@
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                             CCCC  IIIII  PPPP                               %
+%                            C        I    P   P                              %
+%                            C        I    PPPP                               %
+%                            C        I    P                                  %
+%                             CCCC  IIIII  P                                  %
+%                                                                             %
+%                                                                             %
+%                  Read/Write Cisco IP Phone Image Format                     %
+%                                                                             %
+%                              Software Design                                %
+%                                John Cristy                                  %
+%                                April 2004                                   %
+%                                                                             %
+%                                                                             %
+%  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-private.h"
+#include "magick/colorspace.h"
+#include "magick/constitute.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/property.h"
+#include "magick/quantize.h"
+#include "magick/quantum-private.h"
+#include "magick/static.h"
+#include "magick/string_.h"
+#include "magick/module.h"
+#include "magick/utility.h"
+
+/*
+  Forward declarations.
+*/
+static MagickBooleanType
+  WriteCIPImage(const ImageInfo *,Image *);
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%   R e g i s t e r C I P I m a g e                                           %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  RegisterCIPImage() adds properties for the CIP IP phone image format to
+%  the list of supported formats.  The properties 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 RegisterCIPImage method is:
+%
+%      unsigned long RegisterCIPImage(void)
+%
+*/
+ModuleExport unsigned long RegisterCIPImage(void)
+{
+  MagickInfo
+    *entry;
+
+  entry=SetMagickInfo("CIP");
+  entry->encoder=(EncodeImageHandler *) WriteCIPImage;
+  entry->adjoin=MagickFalse;
+  entry->description=ConstantString("Cisco IP phone image format");
+  entry->module=ConstantString("CIP");
+  (void) RegisterMagickInfo(entry);
+  return(MagickImageCoderSignature);
+}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%   U n r e g i s t e r C I P I m a g e                                       %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  UnregisterCIPImage() removes format registrations made by the
+%  CIP module from the list of supported formats.
+%
+%  The format of the UnregisterCIPImage method is:
+%
+%      UnregisterCIPImage(void)
+%
+*/
+ModuleExport void UnregisterCIPImage(void)
+{
+  (void) UnregisterMagickInfo("CIP");
+}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%   W r i t e C I P I m a g e                                                 %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  Procedure WriteCIPImage() writes an image to a file in the Cisco IP phone
+%  image format.
+%
+%  The format of the WriteCIPImage method is:
+%
+%      MagickBooleanType WriteCIPImage(const ImageInfo *image_info,Image *image)
+%
+%  A description of each parameter follows.
+%
+%    o image_info: the image info.
+%
+%    o image:  The image.
+%
+*/
+
+static inline long MagickMin(const long x,const long y)
+{
+  if (x < y)
+    return(x);
+  return(y);
+}
+
+static MagickBooleanType WriteCIPImage(const ImageInfo *image_info,Image *image)
+{
+  char
+    buffer[MaxTextExtent];
+
+  const char
+    *value;
+
+  long
+    y;
+
+  MagickBooleanType
+    status;
+
+  register const PixelPacket
+    *p;
+
+  register long
+    i,
+    x;
+
+  unsigned char
+    byte;
+
+  /*
+    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);
+  status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception);
+  if (status == MagickFalse)
+    return(status);
+  (void) WriteBlobString(image,"<CiscoIPPhoneImage>\n");
+  value=GetImageProperty(image,"label");
+  if (value != (const char *) NULL)
+    (void) FormatMagickString(buffer,MaxTextExtent,"<Title>%s</Title>\n",value);
+  else
+    {
+      char
+        basename[MaxTextExtent];
+
+      GetPathComponent(image->filename,BasePath,basename);
+      (void) FormatMagickString(buffer,MaxTextExtent,"<Title>%s</Title>\n",
+        basename);
+    }
+  (void) WriteBlobString(image,buffer);
+  (void) FormatMagickString(buffer,MaxTextExtent,"<LocationX>%ld</LocationX>\n",
+    image->page.x);
+  (void) WriteBlobString(image,buffer);
+  (void) FormatMagickString(buffer,MaxTextExtent,"<LocationY>%ld</LocationY>\n",
+    image->page.y);
+  (void) WriteBlobString(image,buffer);
+  (void) FormatMagickString(buffer,MaxTextExtent,"<Width>%lu</Width>\n",
+    image->columns+(image->columns % 2));
+  (void) WriteBlobString(image,buffer);
+  (void) FormatMagickString(buffer,MaxTextExtent,"<Height>%lu</Height>\n",
+    image->rows);
+  (void) WriteBlobString(image,buffer);
+  (void) FormatMagickString(buffer,MaxTextExtent,"<Depth>2</Depth>\n");
+  (void) WriteBlobString(image,buffer);
+  (void) WriteBlobString(image,"<Data>");
+  if (image->colorspace != RGBColorspace)
+    (void) TransformImageColorspace(image,RGBColorspace);
+  for (y=0; y < (long) image->rows; y++)
+  {
+    p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception);
+    if (p == (const PixelPacket *) NULL)
+      break;
+    for (x=0; x < ((long) image->columns-3); x+=4)
+    {
+      byte=(unsigned char)
+        ((((unsigned long) (4*PixelIntensityToQuantum(p+3)/QuantumRange) & 0x03) << 6) |
+         (((unsigned long) (4*PixelIntensityToQuantum(p+2)/QuantumRange) & 0x03) << 4) |
+         (((unsigned long) (4*PixelIntensityToQuantum(p+1)/QuantumRange) & 0x03) << 2) |
+         (((unsigned long) (4*PixelIntensityToQuantum(p+0)/QuantumRange) & 0x03) << 0));
+      (void) FormatMagickString(buffer,MaxTextExtent,"%02x",byte);
+      (void) WriteBlobString(image,buffer);
+      p+=4;
+    }
+    if ((image->columns % 4) != 0)
+      {
+        i=(long) image->columns % 4;
+        byte=(unsigned char)
+          ((((unsigned long) (4*PixelIntensityToQuantum(p+MagickMin(i,3))/QuantumRange) & 0x03) << 6) |
+           (((unsigned long) (4*PixelIntensityToQuantum(p+MagickMin(i,2))/QuantumRange) & 0x03) << 4) |
+           (((unsigned long) (4*PixelIntensityToQuantum(p+MagickMin(i,1))/QuantumRange) & 0x03) << 2) |
+           (((unsigned long) (4*PixelIntensityToQuantum(p+MagickMin(i,0))/QuantumRange) & 0x03) << 0));
+        (void) FormatMagickString(buffer,MaxTextExtent,"%02x",~byte);
+        (void) WriteBlobString(image,buffer);
+      }
+    status=SetImageProgress(image,SaveImageTag,y,image->rows);
+    if (status == MagickFalse)
+      break;
+  }
+  (void) WriteBlobString(image,"</Data>\n");
+  (void) WriteBlobString(image,"</CiscoIPPhoneImage>\n");
+  (void) CloseBlob(image);
+  return(MagickTrue);
+}