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)