diff --git a/coders/vicar.c b/coders/vicar.c
new file mode 100644
index 0000000..d7ebb52
--- /dev/null
+++ b/coders/vicar.c
@@ -0,0 +1,492 @@
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%                     V   V  IIIII   CCCC   AAA   RRRR                        %
+%                     V   V    I    C      A   A  R   R                       %
+%                     V   V    I    C      AAAAA  RRRR                        %
+%                      V V     I    C      A   A  R R                         %
+%                       V    IIIII   CCCC  A   A  R  R                        %
+%                                                                             %
+%                                                                             %
+%                    Read/Write VICAR Rasterfile 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/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/quantum-private.h"
+#include "magick/quantum-private.h"
+#include "magick/static.h"
+#include "magick/string_.h"
+#include "magick/module.h"
+
+/*
+  Forward declarations.
+*/
+static MagickBooleanType
+  WriteVICARImage(const ImageInfo *,Image *);
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%   I s V I C A R                                                             %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  IsVICAR() returns MagickTrue if the image format type, identified by the
+%  magick string, is VICAR.
+%
+%  The format of the IsVICAR method is:
+%
+%      MagickBooleanType IsVICAR(const unsigned char *magick,
+%        const size_t length)
+%
+%  A description of each parameter follows:
+%
+%    o magick: compare image format pattern against these bytes.
+%
+%    o length: Specifies the length of the magick string.
+%
+*/
+static MagickBooleanType IsVICAR(const unsigned char *magick,
+  const size_t length)
+{
+  if (length < 14)
+    return(MagickFalse);
+  if (LocaleNCompare((const char *) magick,"LBLSIZE",7) == 0)
+    return(MagickTrue);
+  if (LocaleNCompare((const char *) magick,"NJPL1I",6) == 0)
+    return(MagickTrue);
+  if (LocaleNCompare((const char *) magick,"PDS_VERSION_ID",14) == 0)
+    return(MagickTrue);
+  return(MagickFalse);
+}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%   R e a d V I C A R I m a g e                                               %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  ReadVICARImage() reads a VICAR image file 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 ReadVICARImage method is:
+%
+%      Image *ReadVICARImage(const ImageInfo *image_info,
+%        ExceptionInfo *exception)
+%
+%  A description of each parameter follows:
+%
+%    o image: Method ReadVICARImage returns a pointer to the image after
+%      reading.  A null image is returned if there is a memory shortage or if
+%      the image cannot be read.
+%
+%    o image_info: the image info.
+%
+%    o exception: return any errors or warnings in this structure.
+%
+%
+*/
+static Image *ReadVICARImage(const ImageInfo *image_info,
+  ExceptionInfo *exception)
+{
+  char
+    keyword[MaxTextExtent],
+    value[MaxTextExtent];
+
+  Image
+    *image;
+
+  int
+    c;
+
+  long
+    y;
+
+  MagickBooleanType
+    status,
+    value_expected;
+
+  QuantumInfo
+    *quantum_info;
+
+  QuantumType
+    quantum_type;
+
+  register PixelPacket
+    *q;
+
+  ssize_t
+    count;
+
+  size_t
+    length;
+
+  unsigned char
+    *pixels;
+
+  /*
+    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);
+  status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
+  if (status == MagickFalse)
+    {
+      image=DestroyImageList(image);
+      return((Image *) NULL);
+    }
+  /*
+    Decode image header.
+  */
+  c=ReadBlobByte(image);
+  count=1;
+  if (c == EOF)
+    {
+      image=DestroyImage(image);
+      return((Image *) NULL);
+    }
+  length=0;
+  image->columns=0;
+  image->rows=0;
+  while (isgraph(c) && ((image->columns == 0) || (image->rows == 0)))
+  {
+    if (isalnum(c) == MagickFalse)
+      {
+        c=ReadBlobByte(image);
+        count++;
+      }
+    else
+      {
+        register char
+          *p;
+
+        /*
+          Determine a keyword and its value.
+        */
+        p=keyword;
+        do
+        {
+          if ((size_t) (p-keyword) < (MaxTextExtent-1))
+            *p++=c;
+          c=ReadBlobByte(image);
+          count++;
+        } while (isalnum(c) || (c == '_'));
+        *p='\0';
+        value_expected=MagickFalse;
+        while ((isspace((int) ((unsigned char) c)) != 0) || (c == '='))
+        {
+          if (c == '=')
+            value_expected=MagickTrue;
+          c=ReadBlobByte(image);
+          count++;
+        }
+        if (value_expected == MagickFalse)
+          continue;
+        p=value;
+        while (isalnum(c))
+        {
+          if ((size_t) (p-value) < (MaxTextExtent-1))
+            *p++=c;
+          c=ReadBlobByte(image);
+          count++;
+        }
+        *p='\0';
+        /*
+          Assign a value to the specified keyword.
+        */
+        if (LocaleCompare(keyword,"Label_RECORDS") == 0)
+          length=(ssize_t) atol(value);
+        if (LocaleCompare(keyword,"LBLSIZE") == 0)
+          length=(ssize_t) atol(value);
+        if (LocaleCompare(keyword,"RECORD_BYTES") == 0)
+          image->columns=1UL*atol(value);
+        if (LocaleCompare(keyword,"NS") == 0)
+          image->columns=1UL*atol(value);
+        if (LocaleCompare(keyword,"LINES") == 0)
+          image->rows=1UL*atol(value);
+        if (LocaleCompare(keyword,"NL") == 0)
+          image->rows=1UL*atol(value);
+      }
+    while (isspace((int) ((unsigned char) c)) != 0)
+    {
+      c=ReadBlobByte(image);
+      count++;
+    }
+  }
+  while (count < (ssize_t) length)
+  {
+    c=ReadBlobByte(image);
+    count++;
+  }
+  if ((image->columns == 0) || (image->rows == 0))
+    ThrowReaderException(CorruptImageError,"NegativeOrZeroImageSize");
+  image->depth=8;
+  if (AcquireImageColormap(image,256) == MagickFalse)
+    ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed");
+  if (image_info->ping != MagickFalse)
+    {
+      (void) CloseBlob(image);
+      return(GetFirstImageInList(image));
+    }
+  /*
+    Read VICAR pixels.
+  */
+  quantum_type=IndexQuantum;
+  quantum_info=AcquireQuantumInfo(image_info,image);
+  if (quantum_info == (QuantumInfo *) NULL)
+    ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed");
+  pixels=GetQuantumPixels(quantum_info);
+  length=GetQuantumExtent(image,quantum_info,IndexQuantum);
+  for (y=0; y < (long) image->rows; y++)
+  {
+    q=QueueAuthenticPixels(image,0,y,image->columns,1,exception);
+    if (q == (PixelPacket *) NULL)
+      break;
+    count=ReadBlob(image,length,pixels);
+    (void) ImportQuantumPixels(image,(CacheView *) NULL,quantum_info,
+      quantum_type,pixels,exception);
+    if (SyncAuthenticPixels(image,exception) == MagickFalse)
+      break;
+    status=SetImageProgress(image,LoadImageTag,y,image->rows);
+    if (status == MagickFalse)
+      break;
+  }
+  SetQuantumImageType(image,quantum_type);
+  quantum_info=DestroyQuantumInfo(quantum_info);
+  if (EOFBlob(image) != MagickFalse)
+    ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile",
+      image->filename);
+  (void) CloseBlob(image);
+  return(GetFirstImageInList(image));
+}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%   R e g i s t e r V I C A R I m a g e                                       %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  RegisterVICARImage() adds attributes for the VICAR 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 RegisterVICARImage method is:
+%
+%      unsigned long RegisterVICARImage(void)
+%
+*/
+ModuleExport unsigned long RegisterVICARImage(void)
+{
+  MagickInfo
+    *entry;
+
+  entry=SetMagickInfo("VICAR");
+  entry->decoder=(DecodeImageHandler *) ReadVICARImage;
+  entry->encoder=(EncodeImageHandler *) WriteVICARImage;
+  entry->magick=(IsImageFormatHandler *) IsVICAR;
+  entry->adjoin=MagickFalse;
+  entry->description=ConstantString("VICAR rasterfile format");
+  entry->module=ConstantString("VICAR");
+  (void) RegisterMagickInfo(entry);
+  return(MagickImageCoderSignature);
+}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%   U n r e g i s t e r V I C A R I m a g e                                   %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  UnregisterVICARImage() removes format registrations made by the
+%  VICAR module from the list of supported formats.
+%
+%  The format of the UnregisterVICARImage method is:
+%
+%      UnregisterVICARImage(void)
+%
+*/
+ModuleExport void UnregisterVICARImage(void)
+{
+  (void) UnregisterMagickInfo("VICAR");
+}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%   W r i t e V I C A R I m a g e                                             %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  WriteVICARImage() writes an image in the VICAR rasterfile format.
+%  Vicar files contain a text header, followed by one or more planes of binary
+%  grayscale image data.  Vicar files are designed to allow many planes to be
+%  stacked together to form image cubes.  This method only writes a single
+%  grayscale plane.
+%
+%  WriteVICARImage was written contributed by
+%  gorelick@esther.la.asu.edu.
+%
+%  The format of the WriteVICARImage method is:
+%
+%      MagickBooleanType WriteVICARImage(const ImageInfo *image_info,
+%        Image *image)
+%
+%  A description of each parameter follows.
+%
+%    o image_info: the image info.
+%
+%    o image:  The image.
+%
+*/
+static MagickBooleanType WriteVICARImage(const ImageInfo *image_info,
+  Image *image)
+{
+  char
+    header[MaxTextExtent];
+
+  int
+    y;
+
+  MagickBooleanType
+    status;
+
+  QuantumInfo
+    *quantum_info;
+
+  register const PixelPacket
+    *p;
+
+  ssize_t
+    count;
+
+  size_t
+    length;
+
+  unsigned char
+    *pixels;
+
+  /*
+    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);
+  if (image->colorspace != RGBColorspace)
+    (void) TransformImageColorspace(image,RGBColorspace);
+  /*
+    Write header.
+  */
+  (void) ResetMagickMemory(header,' ',MaxTextExtent);
+  (void) FormatMagickString(header,MaxTextExtent,
+    "LBLSIZE=%lu FORMAT='BYTE' TYPE='IMAGE' BUFSIZE=20000 DIM=2 EOL=0 "
+    "RECSIZE=%lu ORG='BSQ' NL=%lu NS=%lu NB=1 N1=0 N2=0 N3=0 N4=0 NBB=0 "
+    "NLB=0 TASK='ImageMagick'",(unsigned long) MaxTextExtent,image->columns,
+    image->rows,image->columns);
+  (void) WriteBlob(image,MaxTextExtent,(unsigned char *) header);
+  /*
+    Write VICAR pixels.
+  */
+  image->depth=8;
+  quantum_info=AcquireQuantumInfo(image_info,image);
+  if (quantum_info == (QuantumInfo *) NULL)
+    ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed");
+  pixels=GetQuantumPixels(quantum_info);
+  for (y=0; y < (long) image->rows; y++)
+  {
+    p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception);
+    if (p == (const PixelPacket *) NULL)
+      break;
+    length=ExportQuantumPixels(image,(const CacheView *) NULL,quantum_info,
+      GrayQuantum,pixels,&image->exception);
+    count=WriteBlob(image,length,pixels);
+    if (count != (ssize_t) length)
+      break;
+    status=SetImageProgress(image,SaveImageTag,y,image->rows);
+    if (status == MagickFalse)
+      break;
+  }
+  quantum_info=DestroyQuantumInfo(quantum_info);
+  (void) CloseBlob(image);
+  return(MagickTrue);
+}