diff --git a/Magick++/lib/Image.cpp b/Magick++/lib/Image.cpp
index f1a7495..81d9a71 100644
--- a/Magick++/lib/Image.cpp
+++ b/Magick++/lib/Image.cpp
@@ -345,11 +345,12 @@
 {
   ExceptionInfo exceptionInfo;
   GetExceptionInfo( &exceptionInfo );
+  PushPixelComponentMap( image(), channel_);
   MagickCore::Image* newImage =
-    AddNoiseImageChannel ( image(),
-                           channel_,
+    AddNoiseImage ( image(),
                            noiseType_,
                            &exceptionInfo );
+  PopPixelComponentMap( image() );
   replaceImage( newImage );
   throwException( exceptionInfo );
   (void) DestroyExceptionInfo( &exceptionInfo );
@@ -1113,7 +1114,7 @@
   ExceptionInfo exceptionInfo;
   GetExceptionInfo( &exceptionInfo );
   MagickCore::Image* newImage =
-    FxImageChannel ( image(), DefaultChannels, expression.c_str(), &exceptionInfo );
+    FxImage ( image(), expression.c_str(), &exceptionInfo );
   replaceImage( newImage );
   throwException( exceptionInfo );
   (void) DestroyExceptionInfo( &exceptionInfo );
@@ -1123,8 +1124,10 @@
 {
   ExceptionInfo exceptionInfo;
   GetExceptionInfo( &exceptionInfo );
+  PushPixelComponentMap( image(), channel );
   MagickCore::Image* newImage =
-    FxImageChannel ( image(), channel, expression.c_str(), &exceptionInfo );
+    FxImage ( image(), expression.c_str(), &exceptionInfo );
+  PopPixelComponentMap( image() );
   replaceImage( newImage );
   throwException( exceptionInfo );
   (void) DestroyExceptionInfo( &exceptionInfo );
diff --git a/Magick++/lib/Magick++/Include.h b/Magick++/lib/Magick++/Include.h
index dbf6275..9cc1e69 100644
--- a/Magick++/lib/Magick++/Include.h
+++ b/Magick++/lib/Magick++/Include.h
@@ -534,7 +534,7 @@
   using MagickCore::AdaptiveBlurImage;
   using MagickCore::AdaptiveThresholdImage;
   using MagickCore::AddNoiseImage;
-  using MagickCore::AddNoiseImageChannel;
+  using MagickCore::AddNoiseImage;
   using MagickCore::AffineMatrix;
   using MagickCore::AffineTransformImage;
   using MagickCore::AnnotateImage;
@@ -706,7 +706,7 @@
   using MagickCore::ForwardFourierTransformImage;
   using MagickCore::FrameImage;
   using MagickCore::FrameInfo;
-  using MagickCore::FxImageChannel;
+  using MagickCore::FxImage;
   using MagickCore::GammaImage;
   using MagickCore::GammaImage;
   using MagickCore::GaussianBlurImage;
@@ -806,12 +806,14 @@
   using MagickCore::PingBlob;
   using MagickCore::PingImage;
   using MagickCore::PixelSetQuantumPacket;
-	using MagickCore::PixelWand;
+  using MagickCore::PixelWand;
   using MagickCore::PointInfo;
   using MagickCore::PopDrawingWand;
+  using MagickCore::PopPixelComponentMap;
   using MagickCore::ProfileImage;
   using MagickCore::ProfileInfo;
   using MagickCore::PushDrawingWand;
+  using MagickCore::PushPixelComponentMap;
   using MagickCore::QuantizeImage;
   using MagickCore::QuantizeInfo;
   using MagickCore::QuantumInfo;
diff --git a/MagickCore/effect.c b/MagickCore/effect.c
index 46bb6a3..a48c649 100644
--- a/MagickCore/effect.c
+++ b/MagickCore/effect.c
@@ -5128,7 +5128,8 @@
         r+=(image->columns+StatisticWidth)*GetPixelChannels(image);
       }
       GetPixelInfo(image,&pixel);
-      SetPixelInfo(image,p+StatisticWidth*StatisticHeight/2,&pixel);
+      SetPixelInfo(image,p+(StatisticWidth*StatisticHeight/2)*
+        GetPixelChannels(image),&pixel);
       switch (type)
       {
         case GradientStatistic:
@@ -5185,22 +5186,17 @@
         }
       }
       if ((GetPixelRedTraits(image) & ActivePixelTrait) != 0)
-        SetPixelRed(statistic_image,
-          ClampToQuantum(pixel.red),q);
+        SetPixelRed(statistic_image,ClampToQuantum(pixel.red),q);
       if ((GetPixelGreenTraits(image) & ActivePixelTrait) != 0)
-        SetPixelGreen(statistic_image,
-          ClampToQuantum(pixel.green),q);
+        SetPixelGreen(statistic_image,ClampToQuantum(pixel.green),q);
       if ((GetPixelBlueTraits(image) & ActivePixelTrait) != 0)
-        SetPixelBlue(statistic_image,
-          ClampToQuantum(pixel.blue),q);
+        SetPixelBlue(statistic_image,ClampToQuantum(pixel.blue),q);
       if (((GetPixelBlackTraits(image) & ActivePixelTrait) != 0) &&
           (image->colorspace == CMYKColorspace))
-        SetPixelBlack(statistic_image,
-          ClampToQuantum(pixel.black),q);
+        SetPixelBlack(statistic_image,ClampToQuantum(pixel.black),q);
       if (((GetPixelAlphaTraits(image) & ActivePixelTrait) != 0) &&
           (image->matte != MagickFalse))
-        SetPixelAlpha(statistic_image,
-          ClampToQuantum(pixel.alpha),q);
+        SetPixelAlpha(statistic_image,ClampToQuantum(pixel.alpha),q);
       p+=GetPixelChannels(image);
       q+=GetPixelChannels(statistic_image);
     }
diff --git a/MagickCore/enhance.c b/MagickCore/enhance.c
index 3cee6df..a5c32e7 100644
--- a/MagickCore/enhance.c
+++ b/MagickCore/enhance.c
@@ -107,9 +107,6 @@
     mean,
     sans;
 
-  Image
-    *level_image;
-
   log_mean=log(0.5);
   if (image->sync != MagickFalse)
     {
@@ -125,32 +122,32 @@
     Auto-gamma each channel separately.
   */
   status=MagickTrue;
-  level_image=CloneImage(image,0,0,MagickTrue,&image->exception);
-  if (level_image == (Image *) NULL)
-    return(MagickFalse);
   if ((GetPixelRedTraits(image) & ActivePixelTrait) != 0)
     {
       (void) GetImageChannelMean(image,RedChannel,&mean,&sans,
         &image->exception);
       gamma=log(mean*QuantumScale)/log_mean;
-      SetPixelComponentMap(level_image,RedChannel);
-      status=status && LevelImage(level_image,0.0,(double) QuantumRange,gamma);
+      PushPixelComponentMap(image,RedChannel);
+      status=status && LevelImage(image,0.0,(double) QuantumRange,gamma);
+      PopPixelComponentMap(image);
     }
   if ((GetPixelGreenTraits(image) & ActivePixelTrait) != 0)
     {
       (void) GetImageChannelMean(image,GreenChannel,&mean,&sans,
         &image->exception);
       gamma=log(mean*QuantumScale)/log_mean;
-      SetPixelComponentMap(level_image,GreenChannel);
-      status=status && LevelImage(level_image,0.0,(double) QuantumRange,gamma);
+      PushPixelComponentMap(image,GreenChannel);
+      status=status && LevelImage(image,0.0,(double) QuantumRange,gamma);
+      PopPixelComponentMap(image);
     }
   if ((GetPixelBlueTraits(image) & ActivePixelTrait) != 0)
     {
       (void) GetImageChannelMean(image,BlueChannel,&mean,&sans,
         &image->exception);
       gamma=log(mean*QuantumScale)/log_mean;
-      SetPixelComponentMap(level_image,BlueChannel);
-      status=status && LevelImage(level_image,0.0,(double) QuantumRange,gamma);
+      PushPixelComponentMap(image,BlueChannel);
+      status=status && LevelImage(image,0.0,(double) QuantumRange,gamma);
+      PopPixelComponentMap(image);
     }
   if (((GetPixelBlackTraits(image) & ActivePixelTrait) != 0) &&
       (image->colorspace == CMYKColorspace))
@@ -158,8 +155,9 @@
       (void) GetImageChannelMean(image,BlackChannel,&mean,&sans,
         &image->exception);
       gamma=log(mean*QuantumScale)/log_mean;
-      SetPixelComponentMap(level_image,BlackChannel);
-      status=status && LevelImage(level_image,0.0,(double) QuantumRange,gamma);
+      PushPixelComponentMap(image,BlackChannel);
+      status=status && LevelImage(image,0.0,(double) QuantumRange,gamma);
+      PopPixelComponentMap(image);
     }
   if (((GetPixelAlphaTraits(image) & ActivePixelTrait) != 0) &&
       (image->matte == MagickTrue))
@@ -167,10 +165,10 @@
       (void) GetImageChannelMean(image,OpacityChannel,&mean,&sans,
         &image->exception);
       gamma=log(mean*QuantumScale)/log_mean;
-      SetPixelComponentMap(level_image,AlphaChannel);
-      status=status && LevelImage(level_image,0.0,(double) QuantumRange,gamma);
+      PushPixelComponentMap(image,AlphaChannel);
+      status=status && LevelImage(image,0.0,(double) QuantumRange,gamma);
+      PopPixelComponentMap(image);
     }
-  level_image=DestroyImage(level_image);
   return(status != 0 ? MagickTrue : MagickFalse);
 }
 
@@ -199,7 +197,7 @@
 */
 MagickExport MagickBooleanType AutoLevelImage(Image *image)
 {
-  return(MinMaxStretchImage(image,DefaultChannels,0.0,0.0));
+  return(MinMaxStretchImage(image,0.0,0.0));
 }
 
 /*
@@ -2609,7 +2607,7 @@
 %                                                                             %
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %
-%  LevelImageColor() maps the given color to "black" and "white" values,
+%  LevelImageColors() maps the given color to "black" and "white" values,
 %  linearly spreading out the colors, and level values on a channel by channel
 %  bases, as per LevelImage().  The given colors allows you to specify
 %  different level ranges for each of the color channels separately.
@@ -2620,21 +2618,16 @@
 %  appropriatally.  This effectivally maps a greyscale gradient into the given
 %  color gradient.
 %
-%  The format of the LevelColorsImageChannel method is:
+%  The format of the LevelImageColors method is:
 %
-%    MagickBooleanType LevelColorsImage(Image *image,
-%      const PixelInfo *black_color,
-%      const PixelInfo *white_color,const MagickBooleanType invert)
-%    MagickBooleanType LevelColorsImageChannel(Image *image,
-%      const ChannelType channel,const PixelInfo *black_color,
-%      const PixelInfo *white_color,const MagickBooleanType invert)
+%    MagickBooleanType LevelImageColors(Image *image,
+%      const PixelInfo *black_color,const PixelInfo *white_color,
+%      const MagickBooleanType invert)
 %
 %  A description of each parameter follows:
 %
 %    o image: the image.
 %
-%    o channel: the channel.
-%
 %    o black_color: The color to map black to/from
 %
 %    o white_point: The color to map white to/from
@@ -2642,23 +2635,10 @@
 %    o invert: if true map the colors (levelize), rather than from (level)
 %
 */
-
-MagickExport MagickBooleanType LevelColorsImage(Image *image,
+MagickExport MagickBooleanType LevelImageColors(Image *image,
   const PixelInfo *black_color,const PixelInfo *white_color,
   const MagickBooleanType invert)
 {
-  MagickBooleanType
-    status;
-
-  status=LevelColorsImageChannel(image,DefaultChannels,black_color,white_color,
-    invert);
-  return(status);
-}
-
-MagickExport MagickBooleanType LevelColorsImageChannel(Image *image,
-  const ChannelType channel,const PixelInfo *black_color,
-  const PixelInfo *white_color,const MagickBooleanType invert)
-{
   MagickStatusType
     status;
 
@@ -2674,66 +2654,75 @@
     {
       if ((GetPixelRedTraits(image) & ActivePixelTrait) != 0)
         {
-          SetPixelComponentMap(image,RedChannel);
+          PushPixelComponentMap(image,RedChannel);
           status|=LevelImage(image,black_color->red,white_color->red,1.0);
+          PopPixelComponentMap(image);
         }
       if ((GetPixelGreenTraits(image) & ActivePixelTrait) != 0)
         {
-          SetPixelComponentMap(image,GreenChannel);
+          PushPixelComponentMap(image,GreenChannel);
           status|=LevelImage(image,black_color->green,white_color->green,1.0);
+          PopPixelComponentMap(image);
         }
       if ((GetPixelBlueTraits(image) & ActivePixelTrait) != 0)
         {
-          SetPixelComponentMap(image,BlueChannel);
+          PushPixelComponentMap(image,BlueChannel);
           status|=LevelImage(image,black_color->blue,white_color->blue,1.0);
+          PopPixelComponentMap(image);
         }
       if (((GetPixelBlackTraits(image) & ActivePixelTrait) != 0) &&
           (image->colorspace == CMYKColorspace))
         {
-          SetPixelComponentMap(image,BlackChannel);
+          PushPixelComponentMap(image,BlackChannel);
           status|=LevelImage(image,black_color->black,white_color->black,1.0);
+          PopPixelComponentMap(image);
         }
       if (((GetPixelAlphaTraits(image) & ActivePixelTrait) != 0) &&
           (image->matte == MagickTrue))
         {
-          SetPixelComponentMap(image,AlphaChannel);
+          PushPixelComponentMap(image,AlphaChannel);
           status|=LevelImage(image,black_color->alpha,white_color->alpha,1.0);
+          PopPixelComponentMap(image);
         }
     }
   else
     {
       if ((GetPixelRedTraits(image) & ActivePixelTrait) != 0)
         {
-          SetPixelComponentMap(image,RedChannel);
+          PushPixelComponentMap(image,RedChannel);
           status|=LevelizeImage(image,black_color->red,white_color->red,1.0);
+          PopPixelComponentMap(image);
         }
       if ((GetPixelGreenTraits(image) & ActivePixelTrait) != 0)
         {
-          SetPixelComponentMap(image,GreenChannel);
+          PushPixelComponentMap(image,GreenChannel);
           status|=LevelizeImage(image,black_color->green,white_color->green,
             1.0);
+          PopPixelComponentMap(image);
         }
       if ((GetPixelBlueTraits(image) & ActivePixelTrait) != 0)
         {
-          SetPixelComponentMap(image,BlueChannel);
+          PushPixelComponentMap(image,BlueChannel);
           status|=LevelizeImage(image,black_color->blue,white_color->blue,1.0);
+          PopPixelComponentMap(image);
         }
       if (((GetPixelBlackTraits(image) & ActivePixelTrait) != 0) &&
           (image->colorspace == CMYKColorspace))
         {
-          SetPixelComponentMap(image,BlackChannel);
+          PushPixelComponentMap(image,BlackChannel);
           status|=LevelizeImage(image,black_color->black,white_color->black,
             1.0);
+          PopPixelComponentMap(image);
         }
       if (((GetPixelAlphaTraits(image) & ActivePixelTrait) != 0) &&
           (image->matte == MagickTrue))
         {
-          SetPixelComponentMap(image,AlphaChannel);
+          PushPixelComponentMap(image,AlphaChannel);
           status|=LevelizeImage(image,black_color->alpha,white_color->alpha,
             1.0);
+          PopPixelComponentMap(image);
         }
     }
-  SetPixelComponentMap(image,DefaultChannels);
   return(status == 0 ? MagickFalse : MagickTrue);
 }
 
diff --git a/MagickCore/enhance.h b/MagickCore/enhance.h
index 635902c..9965656 100644
--- a/MagickCore/enhance.h
+++ b/MagickCore/enhance.h
@@ -35,10 +35,8 @@
   HaldClutImage(Image *,const Image *),
   LevelImage(Image *,const double,const double,const double),
   LevelizeImage(Image *,const double,const double,const double),
-  LevelColorsImage(Image *,const PixelInfo *,const PixelInfo *,
+  LevelImageColors(Image *,const PixelInfo *,const PixelInfo *,
     const MagickBooleanType),
-  LevelColorsImageChannel(Image *,const ChannelType,const PixelInfo *,
-    const PixelInfo *,const MagickBooleanType),
   LinearStretchImage(Image *,const double,const double),
   ModulateImage(Image *,const char *),
   NegateImage(Image *,const MagickBooleanType),
diff --git a/MagickCore/feature.c b/MagickCore/feature.c
index f2b54f4..bc1f0d0 100644
--- a/MagickCore/feature.c
+++ b/MagickCore/feature.c
@@ -94,13 +94,13 @@
 %                                                                             %
 %                                                                             %
 %                                                                             %
-%   G e t I m a g e C h a n n e l F e a t u r e s                             %
+%   G e t I m a g e F e a t u r e s                                           %
 %                                                                             %
 %                                                                             %
 %                                                                             %
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %
-%  GetImageChannelFeatures() returns features for each channel in the image in
+%  GetImageFeatures() returns features for each channel in the image in
 %  each of four directions (horizontal, vertical, left and right diagonals)
 %  for the specified distance.  The features include the angular second
 %  moment, contrast, correlation, sum of squares: variance, inverse difference
@@ -108,14 +108,14 @@
 %  measures of correlation 2, and maximum correlation coefficient.  You can
 %  access the red channel contrast, for example, like this:
 %
-%      channel_features=GetImageChannelFeatures(image,1,exception);
+%      channel_features=GetImageFeatures(image,1,exception);
 %      contrast=channel_features[RedChannel].contrast[0];
 %
 %  Use MagickRelinquishMemory() to free the features buffer.
 %
-%  The format of the GetImageChannelFeatures method is:
+%  The format of the GetImageFeatures method is:
 %
-%      ChannelFeatures *GetImageChannelFeatures(const Image *image,
+%      ChannelFeatures *GetImageFeatures(const Image *image,
 %        const size_t distance,ExceptionInfo *exception)
 %
 %  A description of each parameter follows:
@@ -135,7 +135,7 @@
   return(x);
 }
 
-MagickExport ChannelFeatures *GetImageChannelFeatures(const Image *image,
+MagickExport ChannelFeatures *GetImageFeatures(const Image *image,
   const size_t distance,ExceptionInfo *exception)
 {
   typedef struct _ChannelStatistics
diff --git a/MagickCore/feature.h b/MagickCore/feature.h
index 7f8d1e5..88eb3d4 100644
--- a/MagickCore/feature.h
+++ b/MagickCore/feature.h
@@ -45,7 +45,7 @@
 } ChannelFeatures;
 
 extern MagickExport ChannelFeatures
-  *GetImageChannelFeatures(const Image *,const size_t,ExceptionInfo *);
+  *GetImageFeatures(const Image *,const size_t,ExceptionInfo *);
 
 #if defined(__cplusplus) || defined(c_plusplus)
 }
diff --git a/MagickCore/fx.c b/MagickCore/fx.c
index e209b57..8a962e3 100644
--- a/MagickCore/fx.c
+++ b/MagickCore/fx.c
@@ -289,8 +289,6 @@
 %
 %      Image *AddNoiseImage(const Image *image,const NoiseType noise_type,
 %        ExceptionInfo *exception)
-%      Image *AddNoiseImageChannel(const Image *image,const ChannelType channel,
-%        const NoiseType noise_type,ExceptionInfo *exception)
 %
 %  A description of each parameter follows:
 %
@@ -304,18 +302,7 @@
 %    o exception: return any errors or warnings in this structure.
 %
 */
-MagickExport Image *AddNoiseImage(const Image *image,const NoiseType noise_type,
-  ExceptionInfo *exception)
-{
-  Image
-    *noise_image;
-
-  noise_image=AddNoiseImageChannel(image,DefaultChannels,noise_type,exception);
-  return(noise_image);
-}
-
-MagickExport Image *AddNoiseImageChannel(const Image *image,
-  const ChannelType channel,const NoiseType noise_type,ExceptionInfo *exception)
+MagickExport Image *AddNoiseImage(const Image *image,const NoiseType noise_type,  ExceptionInfo *exception)
 {
 #define AddNoiseImageTag  "AddNoise/Image"
 
@@ -2848,15 +2835,11 @@
 %
 %      Image *FxImage(const Image *image,const char *expression,
 %        ExceptionInfo *exception)
-%      Image *FxImageChannel(const Image *image,const ChannelType channel,
-%        const char *expression,ExceptionInfo *exception)
 %
 %  A description of each parameter follows:
 %
 %    o image: the image.
 %
-%    o channel: the channel.
-%
 %    o expression: A mathematical expression.
 %
 %    o exception: return any errors or warnings in this structure.
@@ -2917,16 +2900,6 @@
 MagickExport Image *FxImage(const Image *image,const char *expression,
   ExceptionInfo *exception)
 {
-  Image
-    *fx_image;
-
-  fx_image=FxImageChannel(image,GrayChannel,expression,exception);
-  return(fx_image);
-}
-
-MagickExport Image *FxImageChannel(const Image *image,const ChannelType channel,
-  const char *expression,ExceptionInfo *exception)
-{
 #define FxImageTag  "Fx/Image"
 
   CacheView
@@ -3056,7 +3029,7 @@
           proceed;
 
 #if defined(MAGICKCORE_OPENMP_SUPPORT)
-  #pragma omp critical (MagickCore_FxImageChannel)
+  #pragma omp critical (MagickCore_FxImage)
 #endif
         proceed=SetImageProgress(image,FxImageTag,progress++,image->rows);
         if (proceed == MagickFalse)
diff --git a/MagickCore/fx.h b/MagickCore/fx.h
index 67f6e55..9f97858 100644
--- a/MagickCore/fx.h
+++ b/MagickCore/fx.h
@@ -38,14 +38,11 @@
 
 extern MagickExport Image
   *AddNoiseImage(const Image *,const NoiseType,ExceptionInfo *),
-  *AddNoiseImageChannel(const Image *,const ChannelType,const NoiseType,
-    ExceptionInfo *),
   *BlueShiftImage(const Image *,const double,ExceptionInfo *),
   *CharcoalImage(const Image *,const double,const double,ExceptionInfo *),
   *ColorizeImage(const Image *,const char *,const PixelPacket,ExceptionInfo *),
   *ColorMatrixImage(const Image *,const KernelInfo *kernel,ExceptionInfo *),
   *FxImage(const Image *,const char *,ExceptionInfo *),
-  *FxImageChannel(const Image *,const ChannelType,const char *,ExceptionInfo *),
   *ImplodeImage(const Image *,const double,ExceptionInfo *),
   *MorphImages(const Image *,const size_t,ExceptionInfo *),
   *PolaroidImage(const Image *,const DrawInfo *,const double,ExceptionInfo *),
diff --git a/MagickCore/histogram.c b/MagickCore/histogram.c
index f2877b8..9cbb84d 100644
--- a/MagickCore/histogram.c
+++ b/MagickCore/histogram.c
@@ -964,43 +964,37 @@
 %
 %  The format of the MinMaxStretchImage method is:
 %
-%      MagickBooleanType MinMaxStretchImage(Image *image,
-%        const ChannelType channel, const double black_adjust,
-%        const double white_adjust)
+%      MagickBooleanType MinMaxStretchImage(Image *image,const double black,
+%        const double white)
 %
 %  A description of each parameter follows:
 %
 %    o image: The image to auto-level
 %
-%    o channel: The channels to auto-level.  If the special 'SyncChannels'
-%      flag is set, all the given channels are stretched by the same amount.
-%
-%    o black_adjust, white_adjust:  Move the Black/White Point inward
-%      from the minimum and maximum points by this color value.
+%    o black, white:  move the black / white point inward from the minimum and
+%      maximum points by this color value.
 %
 */
 MagickExport MagickBooleanType MinMaxStretchImage(Image *image,
-  const ChannelType channel,const double black_value,const double white_value)
+  const double black,const double white)
 {
   double
     min,
     max;
 
-  Image
-    *stretch_image;
-
   MagickStatusType
     status;
 
   status=MagickTrue;
-  if ((channel & SyncChannels) != 0)
+  if (image->sync != MagickFalse)
     {
       /*
         Auto-level all channels equally.
       */
-      (void) GetImageChannelRange(image,channel,&min,&max,&image->exception);
-      min+=black_value;
-      max-=white_value;
+      (void) GetImageChannelRange(image,DefaultChannels,&min,&max,
+        &image->exception);
+      min+=black;
+      max-=white;
       if (fabs(min-max) >= MagickEpsilon)
         status&=LevelImage(image,min,max,1.0);
       return(status != 0 ? MagickTrue : MagickFalse);
@@ -1008,42 +1002,42 @@
   /*
     Auto-level each channel separately.
   */
-  stretch_image=CloneImage(image,0,0,MagickTrue,&image->exception);
-  if (stretch_image == (Image *) NULL)
-    return(MagickFalse);
   if ((GetPixelRedTraits(image) & ActivePixelTrait) != 0)
     {
       (void) GetImageChannelRange(image,RedChannel,&min,&max,&image->exception);
-      min+=black_value;
-      max-=white_value;
+      min+=black;
+      max-=white;
       if (fabs(min-max) >= MagickEpsilon)
         {
-          SetPixelComponentMap(stretch_image,RedChannel);
-          status&=LevelImage(stretch_image,min,max,1.0);
+          PushPixelComponentMap(image,RedChannel);
+          status&=LevelImage(image,min,max,1.0);
+          PopPixelComponentMap(image);
         }
     }
   if ((GetPixelGreenTraits(image) & ActivePixelTrait) != 0)
     {
       (void) GetImageChannelRange(image,GreenChannel,&min,&max,
         &image->exception);
-      min+=black_value;
-      max-=white_value;
+      min+=black;
+      max-=white;
       if (fabs(min-max) >= MagickEpsilon)
         {
-          SetPixelComponentMap(stretch_image,GreenChannel);
-          status&=LevelImage(stretch_image,min,max,1.0);
+          PushPixelComponentMap(image,GreenChannel);
+          status&=LevelImage(image,min,max,1.0);
+          PopPixelComponentMap(image);
         }
     }
   if ((GetPixelBlueTraits(image) & ActivePixelTrait) != 0)
     {
       (void) GetImageChannelRange(image,BlueChannel,&min,&max,
         &image->exception);
-      min+=black_value;
-      max-=white_value;
+      min+=black;
+      max-=white;
       if (fabs(min-max) >= MagickEpsilon)
         {
-          SetPixelComponentMap(stretch_image,BlueChannel);
-          status&=LevelImage(stretch_image,min,max,1.0);
+          PushPixelComponentMap(image,BlueChannel);
+          status&=LevelImage(image,min,max,1.0);
+          PopPixelComponentMap(image);
         }
     }
   if (((GetPixelBlackTraits(image) & ActivePixelTrait) != 0) &&
@@ -1051,12 +1045,13 @@
     {
       (void) GetImageChannelRange(image,BlackChannel,&min,&max,
         &image->exception);
-      min+=black_value;
-      max-=white_value;
+      min+=black;
+      max-=white;
       if (fabs(min-max) >= MagickEpsilon)
         {
-          SetPixelComponentMap(stretch_image,BlackChannel);
-          status&=LevelImage(stretch_image,min,max,1.0);
+          PushPixelComponentMap(image,BlackChannel);
+          status&=LevelImage(image,min,max,1.0);
+          PopPixelComponentMap(image);
         }
     }
   if (((GetPixelAlphaTraits(image) & ActivePixelTrait) != 0) &&
@@ -1064,15 +1059,15 @@
     {
       (void) GetImageChannelRange(image,OpacityChannel,&min,&max,
         &image->exception);
-      min+=black_value;
-      max-=white_value;
+      min+=black;
+      max-=white;
       if (fabs(min-max) >= MagickEpsilon)
         {
-          SetPixelComponentMap(stretch_image,AlphaChannel);
-          status&=LevelImage(stretch_image,min,max,1.0);
+          PushPixelComponentMap(image,AlphaChannel);
+          status&=LevelImage(image,min,max,1.0);
+          PopPixelComponentMap(image);
         }
     }
-  stretch_image=DestroyImage(stretch_image);
   return(status != 0 ? MagickTrue : MagickFalse);
 }
 
diff --git a/MagickCore/histogram.h b/MagickCore/histogram.h
index a4151b5..a86f0fc 100644
--- a/MagickCore/histogram.h
+++ b/MagickCore/histogram.h
@@ -31,7 +31,7 @@
 extern MagickExport MagickBooleanType
   IsHistogramImage(const Image *,ExceptionInfo *),
   IsPaletteImage(const Image *,ExceptionInfo *),
-  MinMaxStretchImage(Image *,const ChannelType,const double,const double);
+  MinMaxStretchImage(Image *,const double,const double);
 
 extern MagickExport size_t
   GetNumberColors(const Image *,FILE *,ExceptionInfo *);
diff --git a/MagickCore/identify.c b/MagickCore/identify.c
index b5ebad6..cb5b452 100644
--- a/MagickCore/identify.c
+++ b/MagickCore/identify.c
@@ -430,7 +430,7 @@
       if (artifact != (const char *) NULL)
         {
           distance=StringToUnsignedLong(artifact);
-          channel_features=GetImageChannelFeatures(image,distance,
+          channel_features=GetImageFeatures(image,distance,
             &image->exception);
         }
       depth=GetImageDepth(image,&image->exception);
diff --git a/MagickCore/image.c b/MagickCore/image.c
index b81304c..398d955 100644
--- a/MagickCore/image.c
+++ b/MagickCore/image.c
@@ -2672,7 +2672,7 @@
           */
           GetPixelInfo(image,&background);
           SetPixelInfoPacket(image,&(image->background_color),&background);
-          (void) LevelColorsImage(image,&background,&background,MagickTrue);
+          (void) LevelImageColors(image,&background,&background,MagickTrue);
         }
       break;
     }
diff --git a/MagickCore/image.h b/MagickCore/image.h
index 22e19c0..558d2c5 100644
--- a/MagickCore/image.h
+++ b/MagickCore/image.h
@@ -286,8 +286,11 @@
   MagickBooleanType
     sync;
 
+  size_t
+    map;  
+
   PixelComponentMap
-    *component_map;
+    **component_map;
 
   void
     *cache;
diff --git a/MagickCore/magick-config.h b/MagickCore/magick-config.h
index 9002a55..53e983a 100644
--- a/MagickCore/magick-config.h
+++ b/MagickCore/magick-config.h
@@ -421,15 +421,15 @@
 #endif
 
 /* Define if you have the <lcms2.h> header file. */
-/* #undef HAVE_LCMS2_H */
+#ifndef MAGICKCORE_HAVE_LCMS2_H
+#define MAGICKCORE_HAVE_LCMS2_H 1
+#endif
 
 /* Define if you have the <lcms2/lcms2.h> header file. */
 /* #undef HAVE_LCMS2_LCMS2_H */
 
 /* Define if you have the <lcms.h> header file. */
-#ifndef MAGICKCORE_HAVE_LCMS_H
-#define MAGICKCORE_HAVE_LCMS_H 1
-#endif
+/* #undef HAVE_LCMS_H */
 
 /* Define if you have the <lcms/lcms.h> header file. */
 /* #undef HAVE_LCMS_LCMS_H */
@@ -1152,9 +1152,7 @@
 #endif
 
 /* Define if you have JBIG library */
-#ifndef MAGICKCORE_JBIG_DELEGATE
-#define MAGICKCORE_JBIG_DELEGATE 1
-#endif
+/* #undef JBIG_DELEGATE */
 
 /* Define if you have JPEG version 2 "Jasper" library */
 #ifndef MAGICKCORE_JP2_DELEGATE
@@ -1183,9 +1181,7 @@
 #endif
 
 /* Define if you have LQR library */
-#ifndef MAGICKCORE_LQR_DELEGATE
-#define MAGICKCORE_LQR_DELEGATE 1
-#endif
+/* #undef LQR_DELEGATE */
 
 /* Define if using libltdl to support dynamically loadable modules */
 #ifndef MAGICKCORE_LTDL_DELEGATE
@@ -1197,7 +1193,7 @@
 
 /* Define to the system default library search path. */
 #ifndef MAGICKCORE_LT_DLSEARCH_PATH
-#define MAGICKCORE_LT_DLSEARCH_PATH "/lib64:/usr/lib64:/lib:/usr/lib:/usr/lib64/R/lib:/usr/lib64/atlas:/opt/modules/pkg/intel/f77/10.0.025/lib:/usr/local/lib:/usr/lib64/mysql:/usr/lib64/qt-3.3/lib:/usr/lib64/xulrunner-2"
+#define MAGICKCORE_LT_DLSEARCH_PATH "/lib64:/usr/lib64:/lib:/usr/lib:/usr/lib64/R/lib:/usr/lib64/alliance/lib:/usr/lib64/atlas:/opt/modules/pkg/intel/f77/10.0.025/lib:/usr/lib64/kicad:/usr/lib64/llvm:/usr/local/lib:/usr/lib64/mpich2/lib/:/usr/lib64/mysql:/usr/lib64/octave/3.4.0:/usr/lib64/openmotif:/usr/lib64/qt-3.3/lib:/usr/lib64/tcl8.5/tclx8.4:/usr/lib/wine/:/usr/lib64/wine/:/usr/lib64/xulrunner-2"
 #endif
 
 /* The archive extension */
@@ -1444,9 +1440,7 @@
 
 
 /* Define if you have WEBP library */
-#ifndef MAGICKCORE_WEBP_DELEGATE
-#define MAGICKCORE_WEBP_DELEGATE 1
-#endif
+/* #undef WEBP_DELEGATE */
 
 /* Define to use the Windows GDI32 library */
 /* #undef WINGDI32_DELEGATE */
diff --git a/MagickCore/magick-type.h b/MagickCore/magick-type.h
index 4158da6..2866263 100644
--- a/MagickCore/magick-type.h
+++ b/MagickCore/magick-type.h
@@ -131,8 +131,6 @@
 typedef MagickSizeType QuantumAny;
 #endif
 
-#define MaxPixelComponents  4096
-
 #if defined(macintosh)
 #define ExceptionInfo  MagickExceptionInfo
 #endif
diff --git a/MagickCore/methods.h b/MagickCore/methods.h
index fb8101f..62d088c 100644
--- a/MagickCore/methods.h
+++ b/MagickCore/methods.h
@@ -87,7 +87,7 @@
 #define AdaptiveSharpenImage  PrependMagickMethod(AdaptiveSharpenImage)
 #define AdaptiveThresholdImage  PrependMagickMethod(AdaptiveThresholdImage)
 #define AddChildToXMLTree  PrependMagickMethod(AddChildToXMLTree)
-#define AddNoiseImageChannel  PrependMagickMethod(AddNoiseImageChannel)
+#define AddNoiseImage  PrependMagickMethod(AddNoiseImage)
 #define AddNoiseImage  PrependMagickMethod(AddNoiseImage)
 #define AddPathToXMLTree  PrependMagickMethod(AddPathToXMLTree)
 #define AddValueToSplayTree  PrependMagickMethod(AddValueToSplayTree)
@@ -350,7 +350,7 @@
 #define FuzzyOpacityCompare  PrependMagickMethod(FuzzyOpacityCompare)
 #define FxEvaluateChannelExpression  PrependMagickMethod(FxEvaluateChannelExpression)
 #define FxEvaluateExpression  PrependMagickMethod(FxEvaluateExpression)
-#define FxImageChannel  PrependMagickMethod(FxImageChannel)
+#define FxImage  PrependMagickMethod(FxImage)
 #define FxImage  PrependMagickMethod(FxImage)
 #define FxPreprocessExpression  PrependMagickMethod(FxPreprocessExpression)
 #define GammaImage  PrependMagickMethod(GammaImage)
@@ -682,8 +682,8 @@
 #define KernelPrint  PrependMagickMethod(KernelPrint)
 #define KernelRotate  PrependMagickMethod(KernelRotate)
 #define LeastSquaresAddTerms  PrependMagickMethod(LeastSquaresAddTerms)
-#define LevelColorsImageChannel  PrependMagickMethod(LevelColorsImageChannel)
-#define LevelColorsImage  PrependMagickMethod(LevelColorsImage)
+#define LevelImageColors  PrependMagickMethod(LevelImageColors)
+#define LevelImageColors  PrependMagickMethod(LevelImageColors)
 #define LevelImage  PrependMagickMethod(LevelImage)
 #define LevelImageColors  PrependMagickMethod(LevelImageColors)
 #define LevelImage  PrependMagickMethod(LevelImage)
diff --git a/MagickCore/pixel-accessor.h b/MagickCore/pixel-accessor.h
index b685ac7..eb81c20 100644
--- a/MagickCore/pixel-accessor.h
+++ b/MagickCore/pixel-accessor.h
@@ -29,42 +29,42 @@
 
 static inline Quantum GetPixelAlpha(const Image *image,const Quantum *pixel)
 {
-  return(pixel[image->component_map[AlphaPixelComponent].component]);
+  return(pixel[image->component_map[image->map][AlphaPixelComponent].component]);
 }
 
 static inline PixelTrait GetPixelAlphaTraits(const Image *image)
 {
-  return(image->component_map[AlphaPixelComponent].traits);
+  return(image->component_map[image->map][AlphaPixelComponent].traits);
 }
 
 static inline Quantum GetPixelBlack(const Image *image,const Quantum *pixel)
 {
-  return(pixel[image->component_map[BlackPixelComponent].component]);
+  return(pixel[image->component_map[image->map][BlackPixelComponent].component]);
 }
 
 static inline PixelTrait GetPixelBlackTraits(const Image *image)
 {
-  return(image->component_map[BlackPixelComponent].traits);
+  return(image->component_map[image->map][BlackPixelComponent].traits);
 }
 
 static inline Quantum GetPixelBlue(const Image *image,const Quantum *pixel)
 {
-  return(pixel[image->component_map[BluePixelComponent].component]);
+  return(pixel[image->component_map[image->map][BluePixelComponent].component]);
 }
 
 static inline PixelTrait GetPixelBlueTraits(const Image *image)
 {
-  return(image->component_map[BluePixelComponent].traits);
+  return(image->component_map[image->map][BluePixelComponent].traits);
 }
 
 static inline Quantum GetPixelCb(const Image *image,const Quantum *pixel)
 {
-  return(pixel[image->component_map[CbPixelComponent].component]);
+  return(pixel[image->component_map[image->map][CbPixelComponent].component]);
 }
 
 static inline PixelTrait GetPixelCbTraits(const Image *image)
 {
-  return(image->component_map[CbPixelComponent].traits);
+  return(image->component_map[image->map][CbPixelComponent].traits);
 }
 
 static inline size_t GetPixelChannels(const Image *image)
@@ -75,57 +75,57 @@
 static inline Quantum GetPixelComponent(const Image *image,
   const PixelComponent component)
 {
-  return(image->component_map[component].component);
+  return(image->component_map[image->map][component].component);
 }
 
 static inline Quantum GetPixelCr(const Image *image,const Quantum *pixel)
 {
-  return(pixel[image->component_map[CrPixelComponent].component]);
+  return(pixel[image->component_map[image->map][CrPixelComponent].component]);
 }
 
 static inline PixelTrait GetPixelCrTraits(const Image *image)
 {
-  return(image->component_map[CrPixelComponent].traits);
+  return(image->component_map[image->map][CrPixelComponent].traits);
 }
 
 static inline Quantum GetPixelCyan(const Image *image,const Quantum *pixel)
 {
-  return(pixel[image->component_map[CyanPixelComponent].component]);
+  return(pixel[image->component_map[image->map][CyanPixelComponent].component]);
 }
 
 static inline PixelTrait GetPixelCyanTraits(const Image *image)
 {
-  return(image->component_map[CyanPixelComponent].traits);
+  return(image->component_map[image->map][CyanPixelComponent].traits);
 }
 
 static inline Quantum GetPixelGray(const Image *image,const Quantum *pixel)
 {
-  return(pixel[image->component_map[GrayPixelComponent].component]);
+  return(pixel[image->component_map[image->map][GrayPixelComponent].component]);
 }
 
 static inline PixelTrait GetPixelGrayTraits(const Image *image)
 {
-  return(image->component_map[GrayPixelComponent].traits);
+  return(image->component_map[image->map][GrayPixelComponent].traits);
 }
 
 static inline Quantum GetPixelGreen(const Image *image,const Quantum *pixel)
 {
-  return(pixel[image->component_map[GreenPixelComponent].component]);
+  return(pixel[image->component_map[image->map][GreenPixelComponent].component]);
 }
 
 static inline PixelTrait GetPixelGreenTraits(const Image *image)
 {
-  return(image->component_map[GreenPixelComponent].traits);
+  return(image->component_map[image->map][GreenPixelComponent].traits);
 }
 
 static inline Quantum GetPixelIndex(const Image *image,const Quantum *pixel)
 {
-  return(pixel[image->component_map[IndexPixelComponent].component]);
+  return(pixel[image->component_map[image->map][IndexPixelComponent].component]);
 }
 
 static inline PixelTrait GetPixelIndexTraits(const Image *image)
 {
-  return(image->component_map[IndexPixelComponent].traits);
+  return(image->component_map[image->map][IndexPixelComponent].traits);
 }
 
 static inline Quantum GetPixelInfoIntensity(const PixelInfo *pixel_info)
@@ -155,12 +155,12 @@
 static inline Quantum GetPixelMagenta(const Image *image,
   const Quantum *pixel)
 {
-  return(pixel[image->component_map[MagentaPixelComponent].component]);
+  return(pixel[image->component_map[image->map][MagentaPixelComponent].component]);
 }
 
 static inline PixelTrait GetPixelMagentaTraits(const Image *image)
 {
-  return(image->component_map[MagentaPixelComponent].traits);
+  return(image->component_map[image->map][MagentaPixelComponent].traits);
 }
 
 static inline size_t GetPixelMetacontentExtent(const Image *image)
@@ -170,12 +170,12 @@
 
 static inline Quantum GetPixelRed(const Image *image,const Quantum *pixel)
 {
-  return(pixel[image->component_map[RedPixelComponent].component]);
+  return(pixel[image->component_map[image->map][RedPixelComponent].component]);
 }
 
 static inline PixelTrait GetPixelRedTraits(const Image *image)
 {
-  return(image->component_map[RedPixelComponent].traits);
+  return(image->component_map[image->map][RedPixelComponent].traits);
 }
 
 static inline void GetPixelPacket(const Image *image,const Quantum *pixel,
@@ -211,28 +211,28 @@
 static inline PixelTrait GetPixelComponentTraits(const Image *image,
   const PixelComponent component)
 {
-  return(image->component_map[component].traits);
+  return(image->component_map[image->map][component].traits);
 }
 
 static inline Quantum GetPixelY(const Image *image,const Quantum *pixel)
 {
-  return(pixel[image->component_map[YPixelComponent].component]);
+  return(pixel[image->component_map[image->map][YPixelComponent].component]);
 }
 
 static inline PixelTrait GetPixelYTraits(const Image *image)
 {
-  return(image->component_map[YPixelComponent].traits);
+  return(image->component_map[image->map][YPixelComponent].traits);
 }
 
 static inline Quantum GetPixelYellow(const Image *image,
   const Quantum *pixel)
 {
-  return(pixel[image->component_map[YellowPixelComponent].component]);
+  return(pixel[image->component_map[image->map][YellowPixelComponent].component]);
 }
 
 static inline PixelTrait GetPixelYellowTraits(const Image *image)
 {
-  return(image->component_map[YellowPixelComponent].traits);
+  return(image->component_map[image->map][YellowPixelComponent].traits);
 }
 
 static inline MagickBooleanType IsPixelEquivalent(const Image *image,
@@ -412,45 +412,45 @@
 static inline void SetPixelAlpha(const Image *image,const Quantum alpha,
   Quantum *pixel)
 {
-  pixel[image->component_map[AlphaPixelComponent].component]=alpha;
+  pixel[image->component_map[image->map][AlphaPixelComponent].component]=alpha;
 }
 
 static inline void SetPixelAlphaTraits(Image *image,const PixelTrait traits)
 {
-  image->component_map[AlphaPixelComponent].traits=traits;
+  image->component_map[image->map][AlphaPixelComponent].traits=traits;
 }
 
 static inline void SetPixelBlack(const Image *image,const Quantum black,
   Quantum *pixel)
 {
-  pixel[image->component_map[BlackPixelComponent].component]=black;
+  pixel[image->component_map[image->map][BlackPixelComponent].component]=black;
 }
 
 static inline void SetPixelBlackTraits(Image *image,const PixelTrait traits)
 {
-  image->component_map[BlackPixelComponent].traits=traits;
+  image->component_map[image->map][BlackPixelComponent].traits=traits;
 }
 
 static inline void SetPixelBlue(const Image *image,const Quantum blue,
   Quantum *pixel)
 {
-  pixel[image->component_map[BluePixelComponent].component]=blue;
+  pixel[image->component_map[image->map][BluePixelComponent].component]=blue;
 }
 
 static inline void SetPixelBlueTraits(Image *image,const PixelTrait traits)
 {
-  image->component_map[BluePixelComponent].traits=traits;
+  image->component_map[image->map][BluePixelComponent].traits=traits;
 }
 
 static inline void SetPixelCb(const Image *image,const Quantum cb,
   Quantum *pixel)
 {
-  pixel[image->component_map[CbPixelComponent].component]=cb;
+  pixel[image->component_map[image->map][CbPixelComponent].component]=cb;
 }
 
 static inline void SetPixelCbTraits(Image *image,const PixelTrait traits)
 {
-  image->component_map[CbPixelComponent].traits=traits;
+  image->component_map[image->map][CbPixelComponent].traits=traits;
 }
 
 static inline void SetPixelChannels(Image *image,const size_t channels)
@@ -461,63 +461,63 @@
 static inline void SetPixelComponent(const Image *image,
   const PixelComponent component,const PixelComponent components)
 {
-  image->component_map[component].component=components;
+  image->component_map[image->map][component].component=components;
 }
 
 static inline void SetPixelComponentTraits(Image *image,
   const PixelComponent component,const PixelTrait traits)
 {
-  image->component_map[component].traits=traits;
+  image->component_map[image->map][component].traits=traits;
 }
 
 static inline void SetPixelCr(const Image *image,const Quantum cr,
   Quantum *pixel)
 {
-  pixel[image->component_map[CrPixelComponent].component]=cr;
+  pixel[image->component_map[image->map][CrPixelComponent].component]=cr;
 }
 
 static inline void SetPixelCrTraits(Image *image,const PixelTrait traits)
 {
-  image->component_map[CrPixelComponent].traits=traits;
+  image->component_map[image->map][CrPixelComponent].traits=traits;
 }
 
 static inline void SetPixelCyan(const Image *image,const Quantum cyan,
   Quantum *pixel)
 {
-  pixel[image->component_map[CyanPixelComponent].component]=cyan;
+  pixel[image->component_map[image->map][CyanPixelComponent].component]=cyan;
 }
 
 static inline void SetPixelGray(const Image *image,const Quantum gray,
   Quantum *pixel)
 {
-  pixel[image->component_map[GrayPixelComponent].component]=gray;
+  pixel[image->component_map[image->map][GrayPixelComponent].component]=gray;
 }
 
 static inline void SetPixelGrayTraits(Image *image,const PixelTrait traits)
 {
-  image->component_map[GrayPixelComponent].traits=traits;
+  image->component_map[image->map][GrayPixelComponent].traits=traits;
 }
 
 static inline void SetPixelGreen(const Image *image,const Quantum green,
   Quantum *pixel)
 {
-  pixel[image->component_map[GreenPixelComponent].component]=green;
+  pixel[image->component_map[image->map][GreenPixelComponent].component]=green;
 }
 
 static inline void SetPixelGreenTraits(Image *image,const PixelTrait traits)
 {
-  image->component_map[GreenPixelComponent].traits=traits;
+  image->component_map[image->map][GreenPixelComponent].traits=traits;
 }
 
 static inline void SetPixelIndex(const Image *image,const Quantum index,
   Quantum *pixel)
 {
-  pixel[image->component_map[IndexPixelComponent].component]=index;
+  pixel[image->component_map[image->map][IndexPixelComponent].component]=index;
 }
 
 static inline void SetPixelIndexTraits(Image *image,const PixelTrait traits)
 {
-  image->component_map[IndexPixelComponent].traits=traits;
+  image->component_map[image->map][IndexPixelComponent].traits=traits;
 }
 
 static inline void SetPixelInfo(const Image *image,const Quantum *pixel,
@@ -562,12 +562,12 @@
 static inline void SetPixelMagenta(const Image *image,const Quantum magenta,
   Quantum *pixel)
 {
-  pixel[image->component_map[MagentaPixelComponent].component]=magenta;
+  pixel[image->component_map[image->map][MagentaPixelComponent].component]=magenta;
 }
 
 static inline void SetPixelMagentaTraits(Image *image,const PixelTrait traits)
 {
-  image->component_map[MagentaPixelComponent].traits=traits;
+  image->component_map[image->map][MagentaPixelComponent].traits=traits;
 }
 
 static inline void SetPixelMetacontentExtent(Image *image,const size_t extent)
@@ -578,12 +578,12 @@
 static inline void SetPixelRed(const Image *image,const Quantum red,
   Quantum *pixel)
 {
-  pixel[image->component_map[RedPixelComponent].component]=red;
+  pixel[image->component_map[image->map][RedPixelComponent].component]=red;
 }
 
 static inline void SetPixelRedTraits(Image *image,const PixelTrait traits)
 {
-  image->component_map[RedPixelComponent].traits=traits;
+  image->component_map[image->map][RedPixelComponent].traits=traits;
 }
 
 static inline void SetPixelPacket(const Image *image,const PixelPacket *packet,
@@ -609,23 +609,23 @@
 static inline void SetPixelYellow(const Image *image,const Quantum yellow,
   Quantum *pixel)
 {
-  pixel[image->component_map[YellowPixelComponent].component]=yellow;
+  pixel[image->component_map[image->map][YellowPixelComponent].component]=yellow;
 }
 
 static inline void SetPixelYellowTraits(Image *image,const PixelTrait traits)
 {
-  image->component_map[YellowPixelComponent].traits=traits;
+  image->component_map[image->map][YellowPixelComponent].traits=traits;
 }
 
 static inline void SetPixelY(const Image *image,const Quantum y,
   Quantum *pixel)
 {
-  pixel[image->component_map[YPixelComponent].component]=y;
+  pixel[image->component_map[image->map][YPixelComponent].component]=y;
 }
 
 static inline void SetPixelYTraits(Image *image,const PixelTrait traits)
 {
-  image->component_map[YPixelComponent].traits=traits;
+  image->component_map[image->map][YPixelComponent].traits=traits;
 }
 
 static inline Quantum GetPixelIntensity(const Image *image,
diff --git a/MagickCore/pixel.c b/MagickCore/pixel.c
index 325615c..f0e5a06 100644
--- a/MagickCore/pixel.c
+++ b/MagickCore/pixel.c
@@ -83,25 +83,35 @@
 %
 %  The format of the AcquirePixelComponentMap() method is:
 %
-%      PixelComponentMap *AcquirePixelComponentMap(void)
+%      PixelComponentMap **AcquirePixelComponentMap(void)
 %
 */
-MagickExport PixelComponentMap *AcquirePixelComponentMap(void)
+MagickExport PixelComponentMap **AcquirePixelComponentMap(void)
 {
   PixelComponentMap
-    *component_map;
+    **component_map;
 
   register ssize_t
     i;
 
-  component_map=(PixelComponentMap *) AcquireAlignedMemory(MaxPixelComponents,
-    sizeof(*component_map));
-  if (component_map == (PixelComponentMap *) NULL)
+  component_map=(PixelComponentMap **) AcquireAlignedMemory(
+    MaxPixelComponentMaps,sizeof(**component_map));
+  if (component_map == (PixelComponentMap **) NULL)
     ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
-  (void) ResetMagickMemory(component_map,0,MaxPixelComponents*
-    sizeof(*component_map));
-  for (i=0; i < MaxPixelComponents; i++)
-    component_map[i].component=(PixelComponent) i;
+  for (i=0; i < MaxPixelComponentMaps; i++)
+  {
+    register ssize_t
+      j;
+
+    component_map[i]=(PixelComponentMap *) AcquireQuantumMemory(
+      MaxPixelComponents,sizeof(*component_map[i]));
+    if (component_map[i] == (PixelComponentMap *) NULL)
+      ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
+    (void) ResetMagickMemory(component_map[i],0,MaxPixelComponents*
+      sizeof(*component_map[i]));
+    for (j=0; j < MaxPixelComponents; j++)
+      component_map[i][j].component=(PixelComponent) j;
+  }
   return(component_map);
 }
 
@@ -120,26 +130,30 @@
 %
 %  The format of the ClonePixelComponentMap() method is:
 %
-%      PixelComponentMap *ClonePixelComponentMap(
-%        const PixelComponentMap *component_map)
+%      PixelComponentMap **ClonePixelComponentMap(
+%        PixelComponentMap **component_map)
 %
 %  A description of each parameter follows:
 %
 %    o component_map: the pixel component map.
 %
 */
-MagickExport PixelComponentMap *ClonePixelComponentMap(
-  const PixelComponentMap *component_map)
+MagickExport PixelComponentMap **ClonePixelComponentMap(
+  PixelComponentMap **component_map)
 {
   PixelComponentMap
-    *clone_map;
+    **clone_map;
 
-  assert(component_map != (const PixelComponentMap *) NULL);
+  register ssize_t
+    i;
+
+  assert(component_map != (PixelComponentMap **) NULL);
   clone_map=AcquirePixelComponentMap();
-  if (clone_map == (PixelComponentMap *) NULL)
-    return((PixelComponentMap *) NULL);
-  (void) CopyMagickMemory(clone_map,component_map,MaxPixelComponents*
-    sizeof(*component_map));
+  if (clone_map == (PixelComponentMap **) NULL)
+    return((PixelComponentMap **) NULL);
+  for (i=0; i < MaxPixelComponentMaps; i++)
+    (void) CopyMagickMemory(clone_map[i],component_map[i],MaxPixelComponents*
+      sizeof(*component_map[i]));
   return(clone_map);
 }
 
@@ -194,19 +208,25 @@
 %
 %  The format of the DestroyPixelComponentMap() method is:
 %
-%      PixelComponentMap *DestroyPixelComponentMap(
-%        PixelComponentMap *component_map)
+%      PixelComponentMap **DestroyPixelComponentMap(
+%        PixelComponentMap **component_map)
 %
 %  A description of each parameter follows:
 %
 %    o component_map: the pixel component map.
 %
 */
-MagickExport PixelComponentMap *DestroyPixelComponentMap(
-  PixelComponentMap *component_map)
+MagickExport PixelComponentMap **DestroyPixelComponentMap(
+  PixelComponentMap **component_map)
 {
-  assert(component_map != (PixelComponentMap *) NULL);
-  return((PixelComponentMap *) RelinquishMagickMemory(component_map));
+  register ssize_t
+    i;
+
+  assert(component_map != (PixelComponentMap **) NULL);
+  for (i=0; i < MaxPixelComponentMaps; i++)
+    component_map[i]=(PixelComponentMap *) RelinquishMagickMemory(
+      component_map[i]);
+  return((PixelComponentMap **) RelinquishMagickMemory(component_map));
 }
 
 /*
@@ -4428,6 +4448,69 @@
 %                                                                             %
 %                                                                             %
 %                                                                             %
+%   P o p P i x e l C o m p o n e n t M a p                                   %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  PopPixelComponentMap() pops the pixel component map.
+%
+%  The format of the PopPixelComponentMap method is:
+%
+%      void PopPixelComponentMap(Image *image)
+%
+%  A description of each parameter follows:
+%
+%    o image: the image.
+%
+*/
+MagickExport void PopPixelComponentMap(Image *image)
+{
+  if (image->map == 0)
+    ThrowFatalException(ResourceLimitFatalError,"PixelComponentMapStack");
+  image->map--;
+}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%   P u s h P i x e l C o m p o n e n t M a p                                 %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  PushPixelComponentMap() pushes the pixel component map from the specified
+%  channel mask.
+%
+%  The format of the PushPixelComponentMap method is:
+%
+%      void PushPixelComponentMap(Image *image,const ChannelType channel_mask)
+%
+%  A description of each parameter follows:
+%
+%    o image: the image.
+%
+%    o channel_mask: the channel mask.
+%
+*/
+MagickExport void PushPixelComponentMap(Image *image,
+  const ChannelType channel_mask)
+{
+  if (image->map >= MaxPixelComponentMaps)
+    ThrowFatalException(ResourceLimitFatalError,"PixelComponentMapStack");
+  image->map++;
+  SetPixelComponentMap(image,channel_mask);
+}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
 %   S e t P i x e l C o m p o n e n t M a p                                   %
 %                                                                             %
 %                                                                             %
@@ -4439,32 +4522,33 @@
 %
 %  The format of the SetPixelComponentMap method is:
 %
-%      void SetPixelComponentMap(Image *image,const ChannelType channel)
+%      void SetPixelComponentMap(Image *image,const ChannelType channel_mask)
 %
 %  A description of each parameter follows:
 %
 %    o image: the image.
 %
-%    o channel: the channel mask.
+%    o channel_mask: the channel mask.
 %
 */
-MagickExport void SetPixelComponentMap(Image *image,const ChannelType channel)
+MagickExport void SetPixelComponentMap(Image *image,
+  const ChannelType channel_mask)
 {
   register ssize_t
     i;
 
   for (i=0; i < MaxPixelComponents; i++)
-    image->component_map[i].traits=UndefinedPixelTrait;
-  image->sync=(channel & SyncChannels) != 0 ? MagickTrue : MagickFalse;
-  if ((channel & RedChannel) != 0)
+     SetPixelComponentTraits(image,(PixelComponent) i,UndefinedPixelTrait);
+  image->sync=(channel_mask & SyncChannels) != 0 ? MagickTrue : MagickFalse;
+  if ((channel_mask & RedChannel) != 0)
     SetPixelRedTraits(image,ActivePixelTrait);
-  if ((channel & GreenChannel) != 0)
+  if ((channel_mask & GreenChannel) != 0)
     SetPixelGreenTraits(image,ActivePixelTrait);
-  if ((channel & BlueChannel) != 0)
+  if ((channel_mask & BlueChannel) != 0)
     SetPixelBlueTraits(image,ActivePixelTrait);
-  if ((channel & BlackChannel) != 0)
+  if ((channel_mask & BlackChannel) != 0)
     SetPixelBlackTraits(image,ActivePixelTrait);
-  if ((channel & AlphaChannel) != 0)
+  if ((channel_mask & AlphaChannel) != 0)
     SetPixelAlphaTraits(image,ActivePixelTrait);
 }
 
diff --git a/MagickCore/pixel.h b/MagickCore/pixel.h
index b614ea9..bb10bf1 100644
--- a/MagickCore/pixel.h
+++ b/MagickCore/pixel.h
@@ -25,6 +25,9 @@
 #include <MagickCore/colorspace.h>
 #include <MagickCore/constitute.h>
 
+#define MaxPixelComponents  16
+#define MaxPixelComponentMaps  16
+
 typedef enum
 {
   UndefinedInterpolatePixel,
@@ -150,9 +153,9 @@
     const PixelPacket *);
 
 extern MagickExport PixelComponentMap
-  *AcquirePixelComponentMap(void),
-  *ClonePixelComponentMap(const PixelComponentMap *),
-  *DestroyPixelComponentMap(PixelComponentMap *);
+  **AcquirePixelComponentMap(void),
+  **ClonePixelComponentMap(PixelComponentMap **),
+  **DestroyPixelComponentMap(PixelComponentMap **);
 
 extern MagickExport PixelInfo
   *ClonePixelInfo(const PixelInfo *);
@@ -160,6 +163,8 @@
 extern MagickExport void
   StandardPixelComponentMap(Image *),
   GetPixelInfo(const Image *,PixelInfo *),
+  PopPixelComponentMap(Image *),
+  PushPixelComponentMap(Image *,const ChannelType),
   SetPixelComponentMap(Image *,const ChannelType);
 
 #if defined(__cplusplus) || defined(c_plusplus)
diff --git a/MagickCore/version.h b/MagickCore/version.h
index fdb711e..50b9a55 100644
--- a/MagickCore/version.h
+++ b/MagickCore/version.h
@@ -34,7 +34,7 @@
 #define MagickLibAddendum  "-0"
 #define MagickLibInterface  5
 #define MagickLibMinInterface  5
-#define MagickReleaseDate  "2011-07-06"
+#define MagickReleaseDate  "2011-07-07"
 #define MagickChangeDate   "20110701"
 #define MagickAuthoritativeURL  "http://www.imagemagick.org"
 #if defined(MAGICKCORE_OPENMP_SUPPORT)
diff --git a/MagickWand/magick-image.c b/MagickWand/magick-image.c
index bd4197b..48220b4 100644
--- a/MagickWand/magick-image.c
+++ b/MagickWand/magick-image.c
@@ -491,33 +491,18 @@
 %
 %      MagickBooleanType MagickAddNoiseImage(MagickWand *wand,
 %        const NoiseType noise_type)
-%      MagickBooleanType MagickAddNoiseImageChannel(MagickWand *wand,
-%        const ChannelType channel,const NoiseType noise_type)
 %
 %  A description of each parameter follows:
 %
 %    o wand: the magick wand.
 %
-%    o channel: the image channel(s).
-%
 %    o noise_type:  The type of noise: Uniform, Gaussian, Multiplicative,
 %      Impulse, Laplacian, or Poisson.
 %
 */
-
 WandExport MagickBooleanType MagickAddNoiseImage(MagickWand *wand,
   const NoiseType noise_type)
 {
-  MagickBooleanType
-    status;
-
-  status=MagickAddNoiseImageChannel(wand,DefaultChannels,noise_type);
-  return(status);
-}
-
-WandExport MagickBooleanType MagickAddNoiseImageChannel(MagickWand *wand,
-  const ChannelType channel,const NoiseType noise_type)
-{
   Image
     *noise_image;
 
@@ -527,8 +512,7 @@
     (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
   if (wand->images == (Image *) NULL)
     ThrowWandException(WandError,"ContainsNoImages",wand->name);
-  noise_image=AddNoiseImageChannel(wand->images,channel,noise_type,
-    wand->exception);
+  noise_image=AddNoiseImage(wand->images,noise_type,wand->exception);
   if (noise_image == (Image *) NULL)
     return(MagickFalse);
   ReplaceImageInList(&wand->images,noise_image);
@@ -3501,31 +3485,16 @@
 %  The format of the MagickFxImage method is:
 %
 %      MagickWand *MagickFxImage(MagickWand *wand,const char *expression)
-%      MagickWand *MagickFxImageChannel(MagickWand *wand,
-%        const ChannelType channel,const char *expression)
 %
 %  A description of each parameter follows:
 %
 %    o wand: the magick wand.
 %
-%    o channel: the image channel(s).
-%
 %    o expression: the expression.
 %
 */
-
 WandExport MagickWand *MagickFxImage(MagickWand *wand,const char *expression)
 {
-  MagickWand
-    *fx_wand;
-
-  fx_wand=MagickFxImageChannel(wand,DefaultChannels,expression);
-  return(fx_wand);
-}
-
-WandExport MagickWand *MagickFxImageChannel(MagickWand *wand,
-  const ChannelType channel,const char *expression)
-{
   Image
     *fx_image;
 
@@ -3535,7 +3504,7 @@
     (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
   if (wand->images == (Image *) NULL)
     return((MagickWand *) NULL);
-  fx_image=FxImageChannel(wand->images,channel,expression,wand->exception);
+  fx_image=FxImage(wand->images,expression,wand->exception);
   if (fx_image == (Image *) NULL)
     return((MagickWand *) NULL);
   return(CloneMagickWandFromImages(wand,fx_image));
@@ -4004,7 +3973,7 @@
 %                                                                             %
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %
-%  MagickGetImageChannelFeatures() returns features for each channel in the
+%  MagickGetImageFeatures() returns features for each channel in the
 %  image in each of four directions (horizontal, vertical, left and right
 %  diagonals) for the specified distance.  The features include the angular
 %  second moment, contrast, correlation, sum of squares: variance, inverse
@@ -4014,14 +3983,14 @@
 %  correlation coefficient.  You can access the red channel contrast, for
 %  example, like this:
 %
-%      channel_features=MagickGetImageChannelFeatures(wand,1);
+%      channel_features=MagickGetImageFeatures(wand,1);
 %      contrast=channel_features[RedChannel].contrast[0];
 %
 %  Use MagickRelinquishMemory() to free the statistics buffer.
 %
-%  The format of the MagickGetImageChannelFeatures method is:
+%  The format of the MagickGetImageFeatures method is:
 %
-%      ChannelFeatures *MagickGetImageChannelFeatures(MagickWand *wand,
+%      ChannelFeatures *MagickGetImageFeatures(MagickWand *wand,
 %        const size_t distance)
 %
 %  A description of each parameter follows:
@@ -4031,7 +4000,7 @@
 %    o distance: the distance.
 %
 */
-WandExport ChannelFeatures *MagickGetImageChannelFeatures(MagickWand *wand,
+WandExport ChannelFeatures *MagickGetImageFeatures(MagickWand *wand,
   const size_t distance)
 {
   assert(wand != (MagickWand *) NULL);
@@ -4044,7 +4013,7 @@
         "ContainsNoImages","`%s'",wand->name);
       return((ChannelFeatures *) NULL);
     }
-  return(GetImageChannelFeatures(wand->images,distance,wand->exception));
+  return(GetImageFeatures(wand->images,distance,wand->exception));
 }
 
 /*
diff --git a/MagickWand/magick-image.h b/MagickWand/magick-image.h
index 96b5e96..002b9dd 100644
--- a/MagickWand/magick-image.h
+++ b/MagickWand/magick-image.h
@@ -24,7 +24,7 @@
 #endif
 
 extern WandExport ChannelFeatures
-  *MagickGetImageChannelFeatures(MagickWand *,const size_t);
+  *MagickGetImageFeatures(MagickWand *,const size_t);
 
 extern WandExport ChannelStatistics
   *MagickGetImageChannelStatistics(MagickWand *);
@@ -82,7 +82,6 @@
     const ssize_t),
   MagickAddImage(MagickWand *,const MagickWand *),
   MagickAddNoiseImage(MagickWand *,const NoiseType),
-  MagickAddNoiseImageChannel(MagickWand *,const ChannelType,const NoiseType),
   MagickAffineTransformImage(MagickWand *,const DrawingWand *),
   MagickAnnotateImage(MagickWand *,const DrawingWand *,const double,
     const double,const double,const char *),
@@ -360,7 +359,6 @@
   *MagickDeconstructImages(MagickWand *),
   *MagickEvaluateImages(MagickWand *,const MagickEvaluateOperator),
   *MagickFxImage(MagickWand *,const char *),
-  *MagickFxImageChannel(MagickWand *,const ChannelType,const char *),
   *MagickGetImage(MagickWand *),
   *MagickGetImageClipMask(MagickWand *),
   *MagickGetImageRegion(MagickWand *,const size_t,const size_t,const ssize_t,
diff --git a/MagickWand/mogrify.c b/MagickWand/mogrify.c
index 08f83ad..cd98ab4 100644
--- a/MagickWand/mogrify.c
+++ b/MagickWand/mogrify.c
@@ -1922,8 +1922,8 @@
                 else
                   (void) QueryMagickColor("#ffffff",&white_point,exception);
               }
-            (void) LevelColorsImageChannel(*image,channel,&black_point,
-              &white_point,*option == '+' ? MagickTrue : MagickFalse);
+            (void) LevelImageColors(*image,&black_point,&white_point,
+              *option == '+' ? MagickTrue : MagickFalse);
             break;
           }
         if (LocaleCompare("linear-stretch",option+1) == 0)
@@ -2169,8 +2169,7 @@
 
                 noise=(NoiseType) ParseCommandOption(MagickNoiseOptions,
                   MagickFalse,argv[i+1]);
-                mogrify_image=AddNoiseImageChannel(*image,channel,noise,
-                  exception);
+                mogrify_image=AddNoiseImage(*image,noise,exception);
               }
             break;
           }
@@ -7619,7 +7618,7 @@
               *fx_image;
 
             (void) SyncImagesSettings(mogrify_info,*images);
-            fx_image=FxImageChannel(*images,channel,argv[i+1],exception);
+            fx_image=FxImage(*images,argv[i+1],exception);
             if (fx_image == (Image *) NULL)
               {
                 status=MagickFalse;
diff --git a/PerlMagick/Magick.xs b/PerlMagick/Magick.xs
index 8c7aafa..e72560f 100644
--- a/PerlMagick/Magick.xs
+++ b/PerlMagick/Magick.xs
@@ -3852,7 +3852,7 @@
     count=0;
     for ( ; image; image=image->next)
     {
-      channel_features=GetImageChannelFeatures(image,distance,
+      channel_features=GetImageFeatures(image,distance,
         &image->exception);
       if (channel_features == (ChannelFeatures *) NULL)
         continue;
@@ -4150,7 +4150,9 @@
           }
         }
       }
-    image=FxImageChannel(image,channel,expression,exception);
+    PushPixelComponentMap(image,channel);
+    image=FxImage(image,expression,exception);
+    PopPixelComponentMap(image);
     if ((image == (Image *) NULL) || (exception->severity >= ErrorException))
       goto PerlException;
     for ( ; image; image=image->next)
@@ -7175,7 +7177,7 @@
     AutoLevel          = 255
     AutoLevelImage     = 256
     LevelColors        = 257
-    LevelColorsImage   = 258
+    LevelImageColors   = 258
     Clamp              = 259
     ClampImage         = 260
     Filter             = 261
@@ -7491,8 +7493,10 @@
             argument_list[0].integer_reference=UniformNoise;
           if (attribute_flag[1] != 0)
             channel=(ChannelType) argument_list[1].integer_reference;
-          image=AddNoiseImageChannel(image,channel,(NoiseType)
+          PushPixelComponentMap(image,channel);
+          image=AddNoiseImage(image,(NoiseType)
             argument_list[0].integer_reference,exception);
+          PopPixelComponentMap(image);
           break;
         }
         case 4:  /* Colorize */
@@ -8624,11 +8628,10 @@
         case 39:  /* Equalize */
         {
           if (attribute_flag[0] != 0)
-            {
-              channel=(ChannelType) argument_list[0].integer_reference;
-              SetPixelComponentMap(image,channel);
-            }
+            channel=(ChannelType) argument_list[0].integer_reference;
+          PushPixelComponentMap(image,channel);
           EqualizeImage(image);
+          PopPixelComponentMap(image);
           break;
         }
         case 40:  /* Gamma */
@@ -8712,9 +8715,10 @@
           invert=MagickFalse;
           if (attribute_flag[6] != 0)
             invert=(MagickBooleanType) argument_list[6].integer_reference;
-          SetPixelComponentMap(image,AlphaChannel);
+          PushPixelComponentMap(image,AlphaChannel);
           (void) FloodfillPaintImage(image,AlphaChannel,draw_info,&target,
             geometry.x,geometry.y,invert);
+          PopPixelComponentMap(image);
           StandardPixelComponentMap(image);
           draw_info=DestroyDrawInfo(draw_info);
           break;
@@ -8764,22 +8768,20 @@
           if (attribute_flag[0] == 0)
             argument_list[0].integer_reference=0;
           if (attribute_flag[1] != 0)
-            {
-              channel=(ChannelType) argument_list[1].integer_reference;
-	      SetPixelComponentMap(image,channel);
-            }
+            channel=(ChannelType) argument_list[1].integer_reference;
+          PushPixelComponentMap(image,channel);
           (void) NegateImage(image,argument_list[0].integer_reference != 0 ?
             MagickTrue : MagickFalse);
+          PopPixelComponentMap(image);
           break;
         }
         case 45:  /* Normalize */
         {
           if (attribute_flag[0] != 0)
-            {
-              channel=(ChannelType) argument_list[0].integer_reference;
-	      SetPixelComponentMap(image,channel);
-            }
+            channel=(ChannelType) argument_list[0].integer_reference;
+          PushPixelComponentMap(image,channel);
           NormalizeImage(image);
+          PopPixelComponentMap(image);
           break;
         }
         case 46:  /* NumberColors */
@@ -9314,16 +9316,15 @@
           if (attribute_flag[3] != 0)
             gamma=argument_list[3].real_reference;
           if (attribute_flag[4] != 0)
-            {
-              channel=(ChannelType) argument_list[4].integer_reference;
-              SetPixelComponentMap(image,channel);
-            }
+            channel=(ChannelType) argument_list[4].integer_reference;
           if (attribute_flag[5] != 0)
             {
               argument_list[0].real_reference=argument_list[5].real_reference;
               attribute_flag[0]=attribute_flag[5];
             }
+          PushPixelComponentMap(image,channel);
           (void) LevelImage(image,black_point,white_point,gamma);
+          PopPixelComponentMap(image);
           break;
         }
         case 74:  /* Clip */
@@ -9715,16 +9716,15 @@
           if (attribute_flag[2] != 0)
             geometry_info.sigma=argument_list[2].real_reference;
           if (attribute_flag[3] != 0)
-            {
-              channel=(ChannelType) argument_list[3].integer_reference;
-              SetPixelComponentMap(image,channel);
-            }
+            channel=(ChannelType) argument_list[3].integer_reference;
           sharpen=MagickTrue;
           if (attribute_flag[4] != 0)
             sharpen=argument_list[4].integer_reference != 0 ? MagickTrue :
               MagickFalse;
+          PushPixelComponentMap(image,channel);
           (void) SigmoidalContrastImage(image,sharpen,geometry_info.rho,
             geometry_info.sigma);
+          PopPixelComponentMap(image);
           break;
         }
         case 93:  /* Extent */
@@ -9818,11 +9818,10 @@
           if (attribute_flag[2] != 0)
             white_point=argument_list[2].real_reference;
           if (attribute_flag[4] != 0)
-            {
-              channel=(ChannelType) argument_list[4].integer_reference;
-	      SetPixelComponentMap(image,channel);
-            }
+            channel=(ChannelType) argument_list[4].integer_reference;
+          PushPixelComponentMap(image,channel);
           (void) ContrastStretchImage(image,black_point,white_point);
+          PopPixelComponentMap(image);
           break;
         }
         case 96:  /* Sans0 */
@@ -10161,11 +10160,10 @@
               goto PerlException;
             }
           if (attribute_flag[1] != 0)
-            {
-              channel=(ChannelType) argument_list[1].integer_reference;
-	      SetPixelComponentMap(image,channel);
-            }
+            channel=(ChannelType) argument_list[1].integer_reference;
+          PushPixelComponentMap(image,channel);
           (void) ClutImage(image,argument_list[0].image_reference);
+          PopPixelComponentMap(image);
           break;
         }
         case 114:  /* LiquidRescale */
@@ -10357,11 +10355,10 @@
               goto PerlException;
             }
           if (attribute_flag[1] != 0)
-            {
-              channel=(ChannelType) argument_list[1].integer_reference;
-              SetPixelComponentMap(image,channel);
-            }
+            channel=(ChannelType) argument_list[1].integer_reference;
+          PushPixelComponentMap(image,channel);
           (void) HaldClutImage(image,argument_list[0].image_reference);
+          PopPixelComponentMap(image);
           break;
         }
         case 123:  /* BlueShift */
@@ -10397,21 +10394,19 @@
         case 127:  /* AutoGamma */
         {
           if (attribute_flag[0] != 0)
-            {
-              channel=(ChannelType) argument_list[0].integer_reference;
-              SetPixelComponentMap(image,channel);
-            }
+            channel=(ChannelType) argument_list[0].integer_reference;
+          PushPixelComponentMap(image,channel);
           (void) AutoGammaImage(image);
+          PopPixelComponentMap(image);
           break;
         }
         case 128:  /* AutoLevel */
         {
           if (attribute_flag[0] != 0)
-            {
-              channel=(ChannelType) argument_list[0].integer_reference;
-              SetPixelComponentMap(image,channel);
-            }
+            channel=(ChannelType) argument_list[0].integer_reference;
+          PushPixelComponentMap(image,channel);
           (void) AutoLevelImage(image);
+          PopPixelComponentMap(image);
           break;
         }
         case 129:  /* LevelColors */
@@ -10430,9 +10425,10 @@
                &white_point,exception);
           if (attribute_flag[3] != 0)
             channel=(ChannelType) argument_list[3].integer_reference;
-          (void) LevelColorsImageChannel(image,channel,&black_point,
-            &white_point,argument_list[0].integer_reference != 0 ? MagickTrue :
-            MagickFalse);
+          PushPixelComponentMap(image,channel);
+          (void) LevelImageColors(image,&black_point,&white_point,
+            argument_list[0].integer_reference != 0 ? MagickTrue : MagickFalse);
+          PopPixelComponentMap(image);
           break;
         }
         case 130:  /* Clamp */
@@ -10482,11 +10478,10 @@
           if (attribute_flag[2] != 0)
             contrast=argument_list[2].real_reference;
           if (attribute_flag[4] != 0)
-            {
-              channel=(ChannelType) argument_list[4].integer_reference;
-              SetPixelComponentMap(image,channel);
-            }
+            channel=(ChannelType) argument_list[4].integer_reference;
+          PushPixelComponentMap(image,channel);
           (void) BrightnessContrastImage(image,brightness,contrast);
+          PopPixelComponentMap(image);
           break;
         }
         case 133:  /* Morphology */
@@ -13228,6 +13223,7 @@
     region.height=1;
     if (items == 1)
       (void) ParseAbsoluteGeometry(SvPV(ST(1),na),&region);
+    channel=DefaultChannels;
     for (i=2; i < items; i+=2)
     {
       attribute=(char *) SvPV(ST(i-1),na);
@@ -13335,7 +13331,7 @@
       }
     }
     (void) SetImageStorageClass(image,DirectClass);
-    SetPixelComponentMap(image,channel);
+    PushPixelComponentMap(image,channel);
     q=GetAuthenticPixels(image,region.x,region.y,1,1,exception);
     if ((q == (const Quantum *) NULL) || (av == (AV *) NULL) ||
         (SvTYPE(av) != SVt_PVAV))
@@ -13389,6 +13385,7 @@
           }
         (void) SyncAuthenticPixels(image,exception);
       }
+    PopPixelComponentMap(image);
 
   PerlException:
     InheritPerlException(exception,perl_exception);
diff --git a/coders/msl.c b/coders/msl.c
index 3a8fe62..3d8e1bc 100644
--- a/coders/msl.c
+++ b/coders/msl.c
@@ -736,8 +736,10 @@
                 }
               }
             }
-          noise_image=AddNoiseImageChannel(msl_info->image[n],channel,noise,
+          PushPixelComponentMap(msl_info->image[n],channel);
+          noise_image=AddNoiseImage(msl_info->image[n],noise,
             &msl_info->image[n]->exception);
+          PopPixelComponentMap(msl_info->image[n]);
           if (noise_image == (Image *) NULL)
             break;
           msl_info->image[n]=DestroyImage(msl_info->image[n]);
@@ -4031,8 +4033,9 @@
                 }
               }
             }
-          SetPixelComponentMap(msl_info->image[n],channel);
+          PushPixelComponentMap(msl_info->image[n],channel);
           (void) NegateImage(msl_info->image[n],gray);
+          PopPixelComponentMap(msl_info->image[n]);
           break;
         }
       if (LocaleCompare((const char *) tag,"normalize") == 0)
diff --git a/coders/xtrn.c b/coders/xtrn.c
index e69de29..30f2f93 100644
--- a/coders/xtrn.c
+++ b/coders/xtrn.c
@@ -0,0 +1,637 @@
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%                        X   X  TTTTT  RRRR   N   N                           %
+%                         X X     T    R   R  NN  N                           %
+%                          X      T    RRRR   N N N                           %
+%                         X X     T    R R    N  NN                           %
+%                        X   X    T    R  R   N   N                           %
+%                                                                             %
+%                                                                             %
+%                    ImageMagickObject BLOB Interface.                        %
+%                                                                             %
+%                              Software Design                                %
+%                             William Radcliffe                               %
+%                                 May 2001                                    %
+%                                                                             %
+%                                                                             %
+%  Copyright 1999-2007 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.                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  This coder is a kind of backdoor used by the COM object that allows it to  %
+%  pass blobs back and forth using the coder interface. It simply encodes and %
+%  decodes the filename as a comma delimited string and extracts the info it  %
+%  needs. The five methods of passing images are:                             %
+%                                                                             %
+%     FILE   - same thing as filename so it should be a NOP                   %
+%     IMAGE  - passes an image and image info structure                       %
+%     BLOB   - passes binary blob containining the image                      %
+%     STREAM - passes pointers to stream hooks in and does the hooking        %
+%     ARRAY  - passes a pointer to a Win32 smart array and streams to it      %
+%                                                                             %
+%  Of all of these, the only one getting any real use at the moment is the    %
+%  ARRAY handler. It is the primary way that images are shuttled back and     %
+%  forth as blobs via COM since this is what VB and VBSCRIPT use internally   %
+%  for this purpose.                                                          %
+%
+%
+*/
+
+/*
+  Include declarations.
+*/
+#if defined(_VISUALC_)
+#include "magick/studio.h"
+#include "magick/blob.h"
+#include "magick/blob-private.h"
+#include "magick/constitute.h"
+#include "magick/delegate.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/string_.h"
+#define WIN32_LEAN_AND_MEAN
+#define VC_EXTRALEAN
+#include <windows.h>
+#include <ole2.h>
+
+/*
+  Forward declarations.
+*/
+static MagickBooleanType
+  WriteXTRNImage(const ImageInfo *,Image *);
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%   R e a d X T R N I m a g e                                                 %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  ReadXTRNImage() reads a XTRN 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 ReadXTRNImage method is:
+%
+%      Image *ReadXTRNImage(const ImageInfo *image_info,
+%        ExceptionInfo *exception)
+%
+%  A description of each parameter follows:
+%
+%    o image_info: Specifies a pointer to an ImageInfo structure.
+%
+%    o exception: return any errors or warnings in this structure.
+%
+*/
+static Image *ReadXTRNImage(const ImageInfo *image_info,
+  ExceptionInfo *exception)
+{
+  Image
+    *image;
+
+  ImageInfo
+    *clone_info;
+
+  void
+    *param1,
+    *param2,
+    *param3;
+
+  param1 = param2 = param3 = (void *) NULL;
+  image = (Image *) NULL;
+  clone_info=CloneImageInfo(image_info);
+  if (clone_info->filename == NULL)
+    {
+      clone_info=DestroyImageInfo(clone_info);
+      ThrowReaderException(FileOpenWarning,"No filename specified");
+    }
+  if (LocaleCompare(image_info->magick,"XTRNFILE") == 0)
+    {
+      image=ReadImage(clone_info,exception);
+      CatchException(exception);
+    }
+  else if (LocaleCompare(image_info->magick,"XTRNIMAGE") == 0)
+    {
+      Image
+        **image_ptr;
+
+#ifdef ALL_IMAGEINFO
+      ImageInfo
+        **image_info_ptr;
+#endif
+
+      (void) sscanf(clone_info->filename,"%lx,%lx",&param1,&param2);
+      image_ptr=(Image **) param2;
+      if (*image_ptr != (Image *)NULL)
+        image=CloneImage(*image_ptr,0,0,MagickFalse,&(*image_ptr)->exception);
+#ifdef ALL_IMAGEINFO
+      image_info_ptr=(ImageInfo **) param1;
+      if (*image_info_ptr != (ImageInfo *)NULL)
+        image_info=*image_info_ptr;
+#endif
+    }
+  else if (LocaleCompare(image_info->magick,"XTRNBLOB") == 0)
+    {
+      char
+        **blob_data;
+
+      size_t
+        *blob_length;
+
+      char
+        filename[MaxTextExtent];
+
+      (void) sscanf(clone_info->filename,"%lx,%lx,%s",&param1,&param2,&filename);
+      blob_data=(char **) param1;
+      blob_length=(size_t *) param2;
+      image=BlobToImage(clone_info,*blob_data,*blob_length,exception);
+      CatchException(exception);
+    }
+  else if (LocaleCompare(image_info->magick,"XTRNSTREAM") == 0)
+    {
+#ifdef IMPLEMENT_THIS
+      MagickBooleanType
+        status;
+#endif
+
+      char
+        filename[MaxTextExtent];
+
+      size_t
+        (*fifo)(const Image *,const void *,const size_t);
+
+      (void) sscanf(clone_info->filename,"%lx,%lx,%s",&param1,&param2,&filename);
+      fifo=(size_t (*)(const Image *,const void *,const size_t)) param1;
+      clone_info->client_data=param2;
+#ifdef IMPLEMENT_THIS
+      status=ReadStream(clone_info,fifo,exception);
+      CatchException(exception);
+#endif
+    }
+  else if (LocaleCompare(image_info->magick,"XTRNARRAY") == 0)
+    {
+      SAFEARRAY
+        *pSafeArray;
+
+      char
+        *blob_data;
+
+      size_t
+        blob_length;
+
+                  ssize_t
+        lBoundl,
+        lBoundu;
+
+      HRESULT
+        hr;
+
+      char
+        filename[MaxTextExtent];
+
+      filename[0] = '\0';
+      (void) sscanf(clone_info->filename,"%lx,%s",&param1,&filename);
+            hr = S_OK;
+      pSafeArray = (SAFEARRAY *) param1;
+      if (pSafeArray)
+        {
+                      hr = SafeArrayGetLBound(pSafeArray, 1, &lBoundl);
+          if (SUCCEEDED(hr))
+                        hr = SafeArrayGetUBound(pSafeArray, 1, &lBoundu);
+          if (SUCCEEDED(hr))
+            {
+                          blob_length = lBoundu - lBoundl + 1;
+              hr = SafeArrayAccessData(pSafeArray, (void**)&blob_data);
+                    if(SUCCEEDED(hr))
+                {
+                  if (filename[0] != '\0')
+                    {
+                      (void) CopyMagickString(clone_info->filename,filename,
+                        MaxTextExtent);
+                      (void) CopyMagickString(clone_info->magick,filename,
+                        MaxTextExtent);
+                    }
+                  else
+                    {
+                      *clone_info->magick = '\0';
+                      clone_info->filename[0] = '\0';
+                    }
+                  image=BlobToImage(clone_info,blob_data,blob_length,exception);
+                  hr = SafeArrayUnaccessData(pSafeArray);
+                  CatchException(exception);
+                }
+            }
+        }
+    }
+  else if (LocaleCompare(image_info->magick,"XTRNBSTR") == 0)
+    {
+      BSTR
+        bstr;
+
+      char
+        *blob_data;
+
+      size_t
+        blob_length;
+
+      HRESULT
+        hr;
+
+      char
+        filename[MaxTextExtent];
+
+      filename[0] = '\0';
+      (void) sscanf(clone_info->filename,"%lx,%s",&param1,&filename);
+      hr = S_OK;
+      bstr = (BSTR) param1;
+      blob_length = SysStringLen(bstr) * 2;
+      blob_data = (char *)bstr;
+      if ((blob_data != (char *)NULL) && (blob_length>0))
+        {
+          if (filename[0] != '\0')
+            {
+              (void) CopyMagickString(clone_info->filename,filename,
+                MaxTextExtent);
+              (void) CopyMagickString(clone_info->magick,filename,
+                MaxTextExtent);
+            }
+          else
+            {
+              *clone_info->magick = '\0';
+              clone_info->filename[0] = '\0';
+            }
+          image=BlobToImage(clone_info,blob_data,blob_length,exception);
+          CatchException(exception);
+        }
+    }
+  clone_info=DestroyImageInfo(clone_info);
+  return(image);
+}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%   R e g i s t e r X T R N I m a g e                                         %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  RegisterXTRNImage() adds attributes for the XTRN 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 RegisterXTRNImage method is:
+%
+%      RegisterXTRNImage(void)
+%
+*/
+ModuleExport void RegisterXTRNImage(void)
+{
+  MagickInfo
+    *entry;
+
+  entry=SetMagickInfo("XTRNFILE");
+  entry->decoder=ReadXTRNImage;
+  entry->encoder=WriteXTRNImage;
+  entry->adjoin=MagickFalse;
+  entry->stealth=MagickTrue;
+  entry->description=ConstantString("External transfer of a file");
+  entry->module=ConstantString("XTRN");
+  RegisterMagickInfo(entry);
+
+  entry=SetMagickInfo("XTRNIMAGE");
+  entry->decoder=ReadXTRNImage;
+  entry->encoder=WriteXTRNImage;
+  entry->adjoin=MagickFalse;
+  entry->stealth=MagickTrue;
+  entry->description=ConstantString("External transfer of a image in memory");
+  entry->module=ConstantString("XTRN");
+  RegisterMagickInfo(entry);
+
+  entry=SetMagickInfo("XTRNBLOB");
+  entry->decoder=ReadXTRNImage;
+  entry->encoder=WriteXTRNImage;
+  entry->adjoin=MagickFalse;
+  entry->stealth=MagickTrue;
+  entry->description=ConstantString("IExternal transfer of a blob in memory");
+  entry->module=ConstantString("XTRN");
+  RegisterMagickInfo(entry);
+
+  entry=SetMagickInfo("XTRNSTREAM");
+  entry->decoder=ReadXTRNImage;
+  entry->encoder=WriteXTRNImage;
+  entry->adjoin=MagickFalse;
+  entry->stealth=MagickTrue;
+  entry->description=ConstantString("External transfer via a streaming interface");
+  entry->module=ConstantString("XTRN");
+  RegisterMagickInfo(entry);
+
+  entry=SetMagickInfo("XTRNARRAY");
+  entry->decoder=ReadXTRNImage;
+  entry->encoder=WriteXTRNImage;
+  entry->adjoin=MagickFalse;
+  entry->stealth=MagickTrue;
+  entry->description=ConstantString("External transfer via a smart array interface");
+  entry->module=ConstantString("XTRN");
+  RegisterMagickInfo(entry);
+
+  entry=SetMagickInfo("XTRNBSTR");
+  entry->decoder=ReadXTRNImage;
+  entry->encoder=WriteXTRNImage;
+  entry->adjoin=MagickFalse;
+  entry->stealth=MagickTrue;
+  entry->description=ConstantString("External transfer via a smart array interface");
+  entry->module=ConstantString("XTRN");
+  RegisterMagickInfo(entry);
+}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%   U n r e g i s t e r X T R N I m a g e                                     %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  UnregisterXTRNImage() removes format registrations made by the
+%  XTRN module from the list of supported formats.
+%
+%  The format of the UnregisterXTRNImage method is:
+%
+%      UnregisterXTRNImage(void)
+%
+*/
+ModuleExport void UnregisterXTRNImage(void)
+{
+  UnregisterMagickInfo("XTRNFILE");
+  UnregisterMagickInfo("XTRNIMAGE");
+  UnregisterMagickInfo("XTRNBLOB");
+  UnregisterMagickInfo("XTRNSTREAM");
+  UnregisterMagickInfo("XTRNARRAY");
+  UnregisterMagickInfo("XTRNBSTR");
+}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%   W r i t e X T R N I m a g e                                               %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  WriteXTRNImage() writes an image in the XTRN encoded image format.
+%  We use GIF because it is the only format that is compressed without
+%  requiring addition optional delegates (TIFF, ZIP, etc).
+%
+%  The format of the WriteXTRNImage method is:
+%
+%      MagickBooleanType WriteXTRNImage(const ImageInfo *image_info,Image *image)
+%
+%  A description of each parameter follows.
+%
+%    o image_info: Specifies a pointer to an ImageInfo structure.
+%
+%    o image:  A pointer to a Image structure.
+%
+%
+*/
+
+size_t SafeArrayFifo(const Image *image,const void *data,const size_t length)
+{
+  SAFEARRAYBOUND NewArrayBounds[1];  /* 1 Dimension */
+  size_t tlen=length;
+  SAFEARRAY *pSafeArray = (SAFEARRAY *)image->client_data;
+  if (pSafeArray != NULL)
+  {
+                ssize_t lBoundl, lBoundu, lCount;
+          HRESULT hr = S_OK;
+    /* First see how big the buffer currently is */
+                hr = SafeArrayGetLBound(pSafeArray, 1, &lBoundl);
+    if (FAILED(hr))
+      return MagickFalse;
+                hr = SafeArrayGetUBound(pSafeArray, 1, &lBoundu);
+    if (FAILED(hr))
+      return MagickFalse;
+                lCount = lBoundu - lBoundl + 1;
+
+    if (length>0)
+    {
+            unsigned char       *pReturnBuffer = NULL;
+      NewArrayBounds[0].lLbound = 0;   /* Start-Index 0 */
+      NewArrayBounds[0].cElements = (size_t) (length+lCount);  /* # Elemente */
+      hr = SafeArrayRedim(pSafeArray, NewArrayBounds);
+      if (FAILED(hr))
+        return 0;
+      hr = SafeArrayAccessData(pSafeArray, (void**)&pReturnBuffer);
+            if( FAILED(hr) )
+                    return 0;
+            (void) CopyMagickMemory( pReturnBuffer+lCount, (unsigned char *)data, length );
+      hr = SafeArrayUnaccessData(pSafeArray);
+            if( FAILED(hr) )
+                    return 0;
+    }
+    else
+    {
+      /* Adjust the length of the buffer to fit */
+    }
+  }
+  return(tlen);
+}
+
+static MagickBooleanType WriteXTRNImage(const ImageInfo *image_info,Image *image)
+{
+  Image *
+    p;
+
+  ImageInfo
+    *clone_info;
+
+  int
+    scene;
+
+  MagickBooleanType
+    status;
+
+  void
+    *param1,
+    *param2,
+    *param3;
+
+  param1 = param2 = param3 = (void *) NULL;
+  if (LocaleCompare(image_info->magick,"XTRNFILE") == 0)
+    {
+      clone_info=CloneImageInfo(image_info);
+      status=WriteImage(image_info,image);
+      if (status == MagickFalse)
+        CatchImageException(image);
+      clone_info=DestroyImageInfo(clone_info);
+    }
+  else if (LocaleCompare(image_info->magick,"XTRNIMAGE") == 0)
+    {
+      Image
+        **image_ptr;
+
+      ImageInfo
+        **image_info_ptr;
+
+      clone_info=CloneImageInfo(image_info);
+      if (clone_info->filename[0])
+        {
+          (void) sscanf(clone_info->filename,"%lx,%lx",&param1,&param2);
+          image_info_ptr=(ImageInfo **) param1;
+          image_ptr=(Image **) param2;
+          if ((image_info_ptr != (ImageInfo **) NULL) &&
+              (image_ptr != (Image **) NULL))
+            {
+              *image_ptr=CloneImage(image,0,0,MagickFalse,&(image->exception));
+              *image_info_ptr=clone_info;
+            }
+        }
+    }
+  else if (LocaleCompare(image_info->magick,"XTRNBLOB") == 0)
+    {
+      char
+        **blob_data;
+
+      ExceptionInfo
+        exception;
+
+      size_t
+        *blob_length;
+
+      char
+        filename[MaxTextExtent];
+
+      clone_info=CloneImageInfo(image_info);
+      if (clone_info->filename[0])
+        {
+          (void) sscanf(clone_info->filename,"%lx,%lx,%s",
+            &param1,&param2,&filename);
+
+          blob_data=(char **) param1;
+          blob_length=(size_t *) param2;
+
+          scene = 0;
+          (void) CopyMagickString(clone_info->filename,filename,MaxTextExtent);
+          for (p=image; p != (Image *) NULL; p=GetNextImageInList(p))
+          {
+            (void) CopyMagickString(p->filename,filename,MaxTextExtent);
+            p->scene=scene++;
+          }
+          SetImageInfo(clone_info,1,&image->exception);
+          (void) CopyMagickString(image->magick,clone_info->magick,
+            MaxTextExtent);
+          GetExceptionInfo(&exception);
+          if (*blob_length == 0)
+            *blob_length=8192;
+          *blob_data=(char *) ImageToBlob(clone_info,image,blob_length,
+            &exception);
+          if (*blob_data == NULL)
+            status=MagickFalse;
+          if (status == MagickFalse)
+            CatchImageException(image);
+        }
+      clone_info=DestroyImageInfo(clone_info);
+    }
+  else if (LocaleCompare(image_info->magick,"XTRNSTREAM") == 0)
+    {
+      size_t
+        (*fifo)(const Image *,const void *,const size_t);
+
+      char
+        filename[MaxTextExtent];
+
+      clone_info=CloneImageInfo(image_info);
+      if (clone_info->filename[0])
+        {
+          (void) sscanf(clone_info->filename,"%lx,%lx,%s",
+            &param1,&param2,&filename);
+
+          fifo=(size_t (*)(const Image *,const void *,const size_t)) param1;
+          image->client_data=param2;
+
+          scene=0;
+          (void) CopyMagickString(clone_info->filename,filename,MaxTextExtent);
+          for (p=image; p != (Image *) NULL; p=GetNextImageInList(p))
+          {
+            (void) CopyMagickString(p->filename,filename,MaxTextExtent);
+            p->scene=scene++;
+          }
+          SetImageInfo(clone_info,1,&image->exception);
+          (void) CopyMagickString(image->magick,clone_info->magick,
+            MaxTextExtent);
+          status=WriteStream(clone_info,image,fifo);
+          if (status == MagickFalse)
+            CatchImageException(image);
+        }
+      clone_info=DestroyImageInfo(clone_info);
+    }
+  else if (LocaleCompare(image_info->magick,"XTRNARRAY") == 0)
+    {
+      char
+        filename[MaxTextExtent];
+
+      clone_info=CloneImageInfo(image_info);
+      if (clone_info->filename[0])
+        {
+          (void) sscanf(clone_info->filename,"%lx,%s",
+            &param1,&filename);
+
+          image->client_data=param1;
+
+          scene = 0;
+          (void) CopyMagickString(clone_info->filename,filename,MaxTextExtent);
+          for (p=image; p != (Image *) NULL; p=GetNextImageInList(p))
+          {
+            (void) CopyMagickString(p->filename,filename,MaxTextExtent);
+            p->scene=scene++;
+          }
+          SetImageInfo(clone_info,1,&image->exception);
+          (void) CopyMagickString(image->magick,clone_info->magick,
+            MaxTextExtent);
+          status=WriteStream(clone_info,image,SafeArrayFifo);
+          if (status == MagickFalse)
+            CatchImageException(image);
+        }
+      clone_info=DestroyImageInfo(clone_info);
+    }
+  return(MagickTrue);
+}
+#endif