diff --git a/Magick++/lib/Image.cpp b/Magick++/lib/Image.cpp
index 260ccc8..1856ae2 100644
--- a/Magick++/lib/Image.cpp
+++ b/Magick++/lib/Image.cpp
@@ -495,8 +495,10 @@
 {
   ExceptionInfo exceptionInfo;
   GetExceptionInfo( &exceptionInfo );
+  PushPixelComponentMap( image(), channel_ );
   MagickCore::Image* newImage =
-    BlurImageChannel( image(), channel_,radius_, sigma_, &exceptionInfo);
+    BlurImage( image(), radius_, sigma_, &exceptionInfo);
+  PopPixelComponentMap( image() );
   replaceImage( newImage );
   throwException( exceptionInfo );
   (void) DestroyExceptionInfo( &exceptionInfo );
@@ -1173,8 +1175,10 @@
 {
   ExceptionInfo exceptionInfo;
   GetExceptionInfo( &exceptionInfo );
+  PushPixelComponentMap( image(), channel_ );
   MagickCore::Image* newImage =
-    GaussianBlurImageChannel( image(), channel_, width_, sigma_, &exceptionInfo );
+    GaussianBlurImage( image(), width_, sigma_, &exceptionInfo );
+  PopPixelComponentMap( image() );
   replaceImage( newImage );
   throwException( exceptionInfo );
   (void) DestroyExceptionInfo( &exceptionInfo );
@@ -1547,10 +1551,11 @@
   ExceptionInfo exceptionInfo;
   GetExceptionInfo( &exceptionInfo );
   modifyImage();
-  (void) RandomThresholdImageChannel( image(),
-                                      channel_,
+  PushPixelComponentMap( image(), channel_);
+  (void) RandomThresholdImage( image(),
                                       static_cast<std::string>(thresholds_).c_str(),
                                       &exceptionInfo );
+  PopPixelComponentMap( image() );
   throwImageException();
   (void) DestroyExceptionInfo( &exceptionInfo );
 }
@@ -1863,12 +1868,13 @@
 {
   ExceptionInfo exceptionInfo;
   GetExceptionInfo( &exceptionInfo );
+  PushPixelComponentMap( image(), channel_ );
   MagickCore::Image* newImage =
-    SharpenImageChannel( image(),
-                         channel_,
+    SharpenImage( image(),
                          radius_,
                          sigma_,
                          &exceptionInfo );
+  PopPixelComponentMap( image() );
   replaceImage( newImage );
   throwException( exceptionInfo );
   (void) DestroyExceptionInfo( &exceptionInfo );
@@ -2123,14 +2129,15 @@
 {
   ExceptionInfo exceptionInfo;
   GetExceptionInfo( &exceptionInfo );
+  PushPixelComponentMap( image(), channel_ );
   MagickCore::Image* newImage =
-    UnsharpMaskImageChannel( image(),
-                             channel_,
+    UnsharpMaskImage( image(),
                              radius_,
                              sigma_,
                              amount_,
                              threshold_,
                              &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 1356db2..e6cf742 100644
--- a/Magick++/lib/Magick++/Include.h
+++ b/Magick++/lib/Magick++/Include.h
@@ -548,7 +548,7 @@
   using MagickCore::BlobToImage;
   using MagickCore::BlobWarning;
   using MagickCore::BlurImage;
-  using MagickCore::BlurImageChannel;
+  using MagickCore::BlurImage;
   using MagickCore::BorderImage;
   using MagickCore::CacheError;
   using MagickCore::CacheFatalError;
@@ -711,7 +711,7 @@
   using MagickCore::GammaImage;
   using MagickCore::GammaImage;
   using MagickCore::GaussianBlurImage;
-  using MagickCore::GaussianBlurImageChannel;
+  using MagickCore::GaussianBlurImage;
   using MagickCore::GetAffineMatrix;
   using MagickCore::GetAuthenticMetacontent;
   using MagickCore::GetBlobSize;
@@ -823,7 +823,7 @@
   using MagickCore::QueueAuthenticPixels;
   using MagickCore::QueueCacheViewAuthenticPixels;
   using MagickCore::RaiseImage;
-  using MagickCore::RandomThresholdImageChannel;
+  using MagickCore::RandomThresholdImage;
   using MagickCore::ReadImage;
   using MagickCore::RectangleInfo;
   using MagickCore::RegisterMagickInfo;
@@ -867,7 +867,7 @@
   using MagickCore::SetImageVirtualPixelMethod;
   using MagickCore::ShadeImage;
   using MagickCore::SharpenImage;
-  using MagickCore::SharpenImageChannel;
+  using MagickCore::SharpenImage;
   using MagickCore::ShaveImage;
   using MagickCore::ShearImage;
   using MagickCore::SigmoidalContrastImage;
@@ -902,7 +902,7 @@
   using MagickCore::UndefinedRegistryType;
   using MagickCore::UnregisterMagickInfo;
   using MagickCore::UnsharpMaskImage;
-  using MagickCore::UnsharpMaskImageChannel;
+  using MagickCore::UnsharpMaskImage;
   using MagickCore::CacheView;
   using MagickCore::WaveImage;
   using MagickCore::WidthValue;
diff --git a/MagickCore/composite.c b/MagickCore/composite.c
index 04cb896..eea733b 100644
--- a/MagickCore/composite.c
+++ b/MagickCore/composite.c
@@ -79,30 +79,25 @@
 %                                                                             %
 %                                                                             %
 %                                                                             %
-%   C o m p o s i t e I m a g e C h a n n e l                                 %
+%   C o m p o s i t e I m a g e                                               %
 %                                                                             %
 %                                                                             %
 %                                                                             %
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %
-%  CompositeImageChannel() returns the second image composited onto the first
+%  CompositeImage() returns the second image composited onto the first
 %  at the specified offset, using the specified composite method.
 %
-%  The format of the CompositeImageChannel method is:
+%  The format of the CompositeImage method is:
 %
 %      MagickBooleanType CompositeImage(Image *image,
 %        const CompositeOperator compose,Image *composite_image,
 %        const ssize_t x_offset,const ssize_t y_offset)
-%      MagickBooleanType CompositeImageChannel(Image *image,
-%        const ChannelType channel,const CompositeOperator compose,
-%        Image *composite_image,const ssize_t x_offset,const ssize_t y_offset)
 %
 %  A description of each parameter follows:
 %
 %    o image: the destination image, modified by he composition
 %
-%    o channel: the channel.
-%
 %    o compose: This operator affects how the composite is applied to
 %      the image.  The operators and how they are utilized are listed here
 %      http://www.w3.org/TR/SVG12/#compositing.
@@ -334,7 +329,7 @@
 }
 
 static inline void CompositeDarken(const Image *image,const PixelInfo *p,
-  const PixelInfo *q,const ChannelType channel,PixelInfo *composite)
+  const PixelInfo *q,PixelInfo *composite)
 {
   MagickRealType
     gamma;
@@ -372,8 +367,7 @@
 }
 
 static inline void CompositeDarkenIntensity(const Image *image,
-  const PixelInfo *p,const PixelInfo *q,const ChannelType channel,
-  PixelInfo *composite)
+  const PixelInfo *p,const PixelInfo *q,PixelInfo *composite)
 {
   MagickRealType
     Da,
@@ -420,7 +414,7 @@
 }
 
 static inline void CompositeDifference(const Image *image,const PixelInfo *p,
-  const PixelInfo *q,const ChannelType channel,PixelInfo *composite)
+  const PixelInfo *q,PixelInfo *composite)
 {
   MagickRealType
     Da,
@@ -478,7 +472,7 @@
 }
 
 static inline void CompositeDivide(const Image *image,const PixelInfo *p,
-  const PixelInfo *q,const ChannelType channel,PixelInfo *composite)
+  const PixelInfo *q,PixelInfo *composite)
 {
   MagickRealType
     Da,
@@ -530,7 +524,7 @@
 }
 
 static inline void CompositeExclusion(const Image *image,const PixelInfo *p,
-  const PixelInfo *q,const ChannelType channel,PixelInfo *composite)
+  const PixelInfo *q,PixelInfo *composite)
 {
   MagickRealType
     gamma,
@@ -684,7 +678,7 @@
 }
 
 static inline void CompositeLighten(const Image *image,const PixelInfo *p,
-  const PixelInfo *q,const ChannelType channel,PixelInfo *composite)
+  const PixelInfo *q,PixelInfo *composite)
 {
   MagickRealType
     gamma;
@@ -722,8 +716,7 @@
 }
 
 static inline void CompositeLightenIntensity(const Image *image,
-  const PixelInfo *p,const PixelInfo *q,const ChannelType channel,
-  PixelInfo *composite)
+  const PixelInfo *p,const PixelInfo *q,PixelInfo *composite)
 {
   MagickRealType
     Da,
@@ -885,8 +878,7 @@
 }
 
 static inline void CompositeMathematics(const Image *image,const PixelInfo *p,
-  const PixelInfo *q,const ChannelType channel, const GeometryInfo *args,
-  PixelInfo *composite)
+  const PixelInfo *q,const GeometryInfo *args,PixelInfo *composite)
 {
   MagickRealType
     Da,
@@ -932,7 +924,7 @@
 }
 
 static inline void CompositePlus(const Image *image,const PixelInfo *p,
-  const PixelInfo *q,const ChannelType channel,PixelInfo *composite)
+  const PixelInfo *q,PixelInfo *composite)
 {
   /*
     NOTE: "Plus" does not use 'over' alpha-blending but uses a special
@@ -983,7 +975,7 @@
 }
 
 static inline void CompositeMinus(const Image *image,const PixelInfo *p,
-  const PixelInfo *q,const ChannelType channel,PixelInfo *composite)
+  const PixelInfo *q,PixelInfo *composite)
 {
   MagickRealType
     Da,
@@ -1033,7 +1025,7 @@
 }
 
 static inline void CompositeModulusAdd(const Image *image,const PixelInfo *p,
-  const PixelInfo *q,const ChannelType channel,PixelInfo *composite)
+  const PixelInfo *q,PixelInfo *composite)
 {
   MagickRealType
     Da,
@@ -1083,8 +1075,7 @@
 }
 
 static inline void CompositeModulusSubtract(const Image *image,
-  const PixelInfo *p,const PixelInfo *q, const ChannelType channel,
-  PixelInfo *composite)
+  const PixelInfo *p,const PixelInfo *q,PixelInfo *composite)
 {
   MagickRealType
     Da,
@@ -1128,7 +1119,7 @@
 }
 
 static inline void CompositeMultiply(const Image *image,const PixelInfo *p,
-  const PixelInfo *q,const ChannelType channel,PixelInfo *composite)
+  const PixelInfo *q,PixelInfo *composite)
 {
   MagickRealType
     Da,
@@ -1286,7 +1277,7 @@
 }
 
 static inline void CompositeScreen(const Image *image,const PixelInfo *p,
-  const PixelInfo *q,const ChannelType channel,PixelInfo *composite)
+  const PixelInfo *q,PixelInfo *composite)
 {
   MagickRealType
     Da,
@@ -1555,18 +1546,6 @@
   const CompositeOperator compose,const Image *composite_image,
   const ssize_t x_offset,const ssize_t y_offset)
 {
-  MagickBooleanType
-    status;
-
-  status=CompositeImageChannel(image,DefaultChannels,compose,composite_image,
-    x_offset,y_offset);
-  return(status);
-}
-
-MagickExport MagickBooleanType CompositeImageChannel(Image *image,
-  const ChannelType channel,const CompositeOperator compose,
-  const Image *composite_image,const ssize_t x_offset,const ssize_t y_offset)
-{
 #define CompositeImageTag  "Composite/Image"
 
   CacheView
@@ -2395,86 +2374,83 @@
         }
         case PlusCompositeOp:
         {
-          CompositePlus(image,&source,&destination,channel,&composite);
+          CompositePlus(image,&source,&destination,&composite);
           break;
         }
         case MinusDstCompositeOp:
         {
-          CompositeMinus(image,&source,&destination,channel,&composite);
+          CompositeMinus(image,&source,&destination,&composite);
           break;
         }
         case MinusSrcCompositeOp:
         {
-          CompositeMinus(image,&destination,&source,channel,&composite);
+          CompositeMinus(image,&destination,&source,&composite);
           break;
         }
         case ModulusAddCompositeOp:
         {
-          CompositeModulusAdd(image,&source,&destination,channel,&composite);
+          CompositeModulusAdd(image,&source,&destination,&composite);
           break;
         }
         case ModulusSubtractCompositeOp:
         {
-          CompositeModulusSubtract(image,&source,&destination,channel,
-            &composite);
+          CompositeModulusSubtract(image,&source,&destination,&composite);
           break;
         }
         case DifferenceCompositeOp:
         {
-          CompositeDifference(image,&source,&destination,channel,&composite);
+          CompositeDifference(image,&source,&destination,&composite);
           break;
         }
         case ExclusionCompositeOp:
         {
-          CompositeExclusion(image,&source,&destination,channel,&composite);
+          CompositeExclusion(image,&source,&destination,&composite);
           break;
         }
         case MultiplyCompositeOp:
         {
-          CompositeMultiply(image,&source,&destination,channel,&composite);
+          CompositeMultiply(image,&source,&destination,&composite);
           break;
         }
         case ScreenCompositeOp:
         {
-          CompositeScreen(image,&source,&destination,channel,&composite);
+          CompositeScreen(image,&source,&destination,&composite);
           break;
         }
         case DivideDstCompositeOp:
         {
-          CompositeDivide(image,&source,&destination,channel,&composite);
+          CompositeDivide(image,&source,&destination,&composite);
           break;
         }
         case DivideSrcCompositeOp:
         {
-          CompositeDivide(image,&destination,&source,channel,&composite);
+          CompositeDivide(image,&destination,&source,&composite);
           break;
         }
         case DarkenCompositeOp:
         {
-          CompositeDarken(image,&source,&destination,channel,&composite);
+          CompositeDarken(image,&source,&destination,&composite);
           break;
         }
         case LightenCompositeOp:
         {
-          CompositeLighten(image,&source,&destination,channel,&composite);
+          CompositeLighten(image,&source,&destination,&composite);
           break;
         }
         case DarkenIntensityCompositeOp:
         {
-          CompositeDarkenIntensity(image,&source,&destination,channel,
-            &composite);
+          CompositeDarkenIntensity(image,&source,&destination,&composite);
           break;
         }
         case LightenIntensityCompositeOp:
         {
-          CompositeLightenIntensity(image,&source,&destination,channel,
-            &composite);
+          CompositeLightenIntensity(image,&source,&destination,&composite);
           break;
         }
         case MathematicsCompositeOp:
         {
-          CompositeMathematics(image,&source,&destination,channel,
-            &geometry_info,&composite);
+          CompositeMathematics(image,&source,&destination,&geometry_info,
+            &composite);
           break;
         }
         case ColorDodgeCompositeOp:
@@ -2730,7 +2706,7 @@
           proceed;
 
 #if defined(MAGICKCORE_OPENMP_SUPPORT)
-  #pragma omp critical (MagickCore_CompositeImageChannel)
+  #pragma omp critical (MagickCore_CompositeImage)
 #endif
         proceed=SetImageProgress(image,CompositeImageTag,progress++,
           image->rows);
diff --git a/MagickCore/composite.h b/MagickCore/composite.h
index 6808094..19dea37 100644
--- a/MagickCore/composite.h
+++ b/MagickCore/composite.h
@@ -97,8 +97,6 @@
 extern MagickExport MagickBooleanType
   CompositeImage(Image *,const CompositeOperator,const Image *,const ssize_t,
     const ssize_t),
-  CompositeImageChannel(Image *,const ChannelType,const CompositeOperator,
-    const Image *,const ssize_t,const ssize_t),
   TextureImage(Image *,const Image *);
 
 #if defined(__cplusplus) || defined(c_plusplus)
diff --git a/MagickCore/effect.c b/MagickCore/effect.c
index 8a10c0a..826d987 100644
--- a/MagickCore/effect.c
+++ b/MagickCore/effect.c
@@ -106,16 +106,11 @@
 %
 %      Image *AdaptiveBlurImage(const Image *image,const double radius,
 %        const double sigma,ExceptionInfo *exception)
-%      Image *AdaptiveBlurImageChannel(const Image *image,
-%        const ChannelType channel,double radius,const double sigma,
-%        ExceptionInfo *exception)
 %
 %  A description of each parameter follows:
 %
 %    o image: the image.
 %
-%    o channel: the channel type.
-%
 %    o radius: the radius of the Gaussian, in pixels, not counting the center
 %      pixel.
 %
@@ -125,17 +120,6 @@
 %
 */
 
-MagickExport Image *AdaptiveBlurImage(const Image *image,const double radius,
-  const double sigma,ExceptionInfo *exception)
-{
-  Image
-    *blur_image;
-
-  blur_image=AdaptiveBlurImageChannel(image,DefaultChannels,radius,sigma,
-    exception);
-  return(blur_image);
-}
-
 MagickExport MagickBooleanType AdaptiveLevelImage(Image *image,
   const char *levels)
 {
@@ -180,9 +164,8 @@
   return(status);
 }
 
-MagickExport Image *AdaptiveBlurImageChannel(const Image *image,
-  const ChannelType channel,const double radius,const double sigma,
-  ExceptionInfo *exception)
+MagickExport Image *AdaptiveBlurImage(const Image *image,
+  const double radius,const double sigma,ExceptionInfo *exception)
 {
 #define AdaptiveBlurImageTag  "Convolve/Image"
 #define MagickSigma  (fabs(sigma) <= MagickEpsilon ? 1.0 : sigma)
@@ -418,7 +401,7 @@
           proceed;
 
 #if defined(MAGICKCORE_OPENMP_SUPPORT)
-  #pragma omp critical (MagickCore_AdaptiveBlurImageChannel)
+  #pragma omp critical (MagickCore_AdaptiveBlurImage)
 #endif
         proceed=SetImageProgress(image,AdaptiveBlurImageTag,progress++,
           image->rows);
@@ -460,16 +443,11 @@
 %
 %      Image *AdaptiveSharpenImage(const Image *image,const double radius,
 %        const double sigma,ExceptionInfo *exception)
-%      Image *AdaptiveSharpenImageChannel(const Image *image,
-%        const ChannelType channel,double radius,const double sigma,
-%        ExceptionInfo *exception)
 %
 %  A description of each parameter follows:
 %
 %    o image: the image.
 %
-%    o channel: the channel type.
-%
 %    o radius: the radius of the Gaussian, in pixels, not counting the center
 %      pixel.
 %
@@ -478,22 +456,9 @@
 %    o exception: return any errors or warnings in this structure.
 %
 */
-
 MagickExport Image *AdaptiveSharpenImage(const Image *image,const double radius,
   const double sigma,ExceptionInfo *exception)
 {
-  Image
-    *sharp_image;
-
-  sharp_image=AdaptiveSharpenImageChannel(image,DefaultChannels,radius,sigma,
-    exception);
-  return(sharp_image);
-}
-
-MagickExport Image *AdaptiveSharpenImageChannel(const Image *image,
-  const ChannelType channel,const double radius,const double sigma,
-  ExceptionInfo *exception)
-{
 #define AdaptiveSharpenImageTag  "Convolve/Image"
 #define MagickSigma  (fabs(sigma) <= MagickEpsilon ? 1.0 : sigma)
 
@@ -728,7 +693,7 @@
           proceed;
 
 #if defined(MAGICKCORE_OPENMP_SUPPORT)
-  #pragma omp critical (MagickCore_AdaptiveSharpenImageChannel)
+  #pragma omp critical (MagickCore_AdaptiveSharpenImage)
 #endif
         proceed=SetImageProgress(image,AdaptiveSharpenImageTag,progress++,
           image->rows);
@@ -773,15 +738,11 @@
 %
 %      Image *BlurImage(const Image *image,const double radius,
 %        const double sigma,ExceptionInfo *exception)
-%      Image *BlurImageChannel(const Image *image,const ChannelType channel,
-%        const double radius,const double sigma,ExceptionInfo *exception)
 %
 %  A description of each parameter follows:
 %
 %    o image: the image.
 %
-%    o channel: the channel type.
-%
 %    o radius: the radius of the Gaussian, in pixels, not counting the center
 %      pixel.
 %
@@ -791,16 +752,6 @@
 %
 */
 
-MagickExport Image *BlurImage(const Image *image,const double radius,
-  const double sigma,ExceptionInfo *exception)
-{
-  Image
-    *blur_image;
-
-  blur_image=BlurImageChannel(image,DefaultChannels,radius,sigma,exception);
-  return(blur_image);
-}
-
 static double *GetBlurKernel(const size_t width,const double sigma)
 {
   double
@@ -836,9 +787,8 @@
   return(kernel);
 }
 
-MagickExport Image *BlurImageChannel(const Image *image,
-  const ChannelType channel,const double radius,const double sigma,
-  ExceptionInfo *exception)
+MagickExport Image *BlurImage(const Image *image,const double radius,
+  const double sigma,ExceptionInfo *exception)
 {
 #define BlurImageTag  "Blur/Image"
 
@@ -973,7 +923,8 @@
       pixel=bias;
       k=kernel;
       kernel_pixels=p;
-      if (((GetPixelAlphaTraits(image) & ActivePixelTrait) == 0) || (image->matte == MagickFalse))
+      if (((GetPixelAlphaTraits(image) & ActivePixelTrait) == 0) ||
+          (image->matte == MagickFalse))
         {
           for (i=0; i < (ssize_t) width; i++)
           {
@@ -1061,7 +1012,7 @@
           proceed;
 
 #if defined(MAGICKCORE_OPENMP_SUPPORT)
-  #pragma omp critical (MagickCore_BlurImageChannel)
+  #pragma omp critical (MagickCore_BlurImage)
 #endif
         proceed=SetImageProgress(image,BlurImageTag,progress++,blur_image->rows+
           blur_image->columns);
@@ -1117,7 +1068,8 @@
       pixel=bias;
       k=kernel;
       kernel_pixels=p;
-      if (((GetPixelAlphaTraits(image) & ActivePixelTrait) == 0) || (blur_image->matte == MagickFalse))
+      if (((GetPixelAlphaTraits(image) & ActivePixelTrait) == 0) ||
+          (blur_image->matte == MagickFalse))
         {
           for (i=0; i < (ssize_t) width; i++)
           {
@@ -1205,7 +1157,7 @@
           proceed;
 
 #if defined(MAGICKCORE_OPENMP_SUPPORT)
-  #pragma omp critical (MagickCore_BlurImageChannel)
+  #pragma omp critical (MagickCore_BlurImage)
 #endif
         proceed=SetImageProgress(blur_image,BlurImageTag,progress++,
           blur_image->rows+blur_image->columns);
@@ -1239,15 +1191,10 @@
 %
 %      Image *ConvolveImage(const Image *image,const size_t order,
 %        const double *kernel,ExceptionInfo *exception)
-%      Image *ConvolveImageChannel(const Image *image,const ChannelType channel,
-%        const size_t order,const double *kernel,ExceptionInfo *exception)
-%
 %  A description of each parameter follows:
 %
 %    o image: the image.
 %
-%    o channel: the channel type.
-%
 %    o order: the number of columns and rows in the filter kernel.
 %
 %    o kernel: An array of double representing the convolution kernel.
@@ -1255,22 +1202,9 @@
 %    o exception: return any errors or warnings in this structure.
 %
 */
-
 MagickExport Image *ConvolveImage(const Image *image,const size_t order,
   const double *kernel,ExceptionInfo *exception)
 {
-  Image
-    *convolve_image;
-
-  convolve_image=ConvolveImageChannel(image,DefaultChannels,order,kernel,
-    exception);
-  return(convolve_image);
-}
-
-MagickExport Image *ConvolveImageChannel(const Image *image,
-  const ChannelType channel,const size_t order,const double *kernel,
-  ExceptionInfo *exception)
-{
 #define ConvolveImageTag  "Convolve/Image"
 
   CacheView
@@ -1541,7 +1475,7 @@
           proceed;
 
 #if defined(MAGICKCORE_OPENMP_SUPPORT)
-  #pragma omp critical (MagickCore_ConvolveImageChannel)
+  #pragma omp critical (MagickCore_ConvolveImage)
 #endif
         proceed=SetImageProgress(image,ConvolveImageTag,progress++,image->rows);
         if (proceed == MagickFalse)
@@ -2029,33 +1963,18 @@
 %
 %      Image *FilterImage(const Image *image,const KernelInfo *kernel,
 %        ExceptionInfo *exception)
-%      Image *FilterImageChannel(const Image *image,const ChannelType channel,
-%        const KernelInfo *kernel,ExceptionInfo *exception)
 %
 %  A description of each parameter follows:
 %
 %    o image: the image.
 %
-%    o channel: the channel type.
-%
 %    o kernel: the filtering kernel.
 %
 %    o exception: return any errors or warnings in this structure.
 %
 */
-
-MagickExport Image *FilterImage(const Image *image,const KernelInfo *kernel,
-  ExceptionInfo *exception)
-{
-  Image
-    *filter_image;
-
-  filter_image=FilterImageChannel(image,DefaultChannels,kernel,exception);
-  return(filter_image);
-}
-
-MagickExport Image *FilterImageChannel(const Image *image,
-  const ChannelType channel,const KernelInfo *kernel,ExceptionInfo *exception)
+MagickExport Image *FilterImage(const Image *image,
+  const KernelInfo *kernel,ExceptionInfo *exception)
 {
 #define FilterImageTag  "Filter/Image"
 
@@ -2307,7 +2226,7 @@
           proceed;
 
 #if defined(MAGICKCORE_OPENMP_SUPPORT)
-  #pragma omp critical (MagickCore_FilterImageChannel)
+  #pragma omp critical (MagickCore_FilterImage)
 #endif
         proceed=SetImageProgress(image,FilterImageTag,progress++,image->rows);
         if (proceed == MagickFalse)
@@ -2342,16 +2261,11 @@
 %
 %      Image *GaussianBlurImage(const Image *image,onst double radius,
 %        const double sigma,ExceptionInfo *exception)
-%      Image *GaussianBlurImageChannel(const Image *image,
-%        const ChannelType channel,const double radius,const double sigma,
-%        ExceptionInfo *exception)
 %
 %  A description of each parameter follows:
 %
 %    o image: the image.
 %
-%    o channel: the channel type.
-%
 %    o radius: the radius of the Gaussian, in pixels, not counting the center
 %      pixel.
 %
@@ -2360,21 +2274,8 @@
 %    o exception: return any errors or warnings in this structure.
 %
 */
-
-MagickExport Image *GaussianBlurImage(const Image *image,const double radius,
-  const double sigma,ExceptionInfo *exception)
-{
-  Image
-    *blur_image;
-
-  blur_image=GaussianBlurImageChannel(image,DefaultChannels,radius,sigma,
-    exception);
-  return(blur_image);
-}
-
-MagickExport Image *GaussianBlurImageChannel(const Image *image,
-  const ChannelType channel,const double radius,const double sigma,
-  ExceptionInfo *exception)
+MagickExport Image *GaussianBlurImage(const Image *image,
+  const double radius,const double sigma,ExceptionInfo *exception)
 {
   double
     *kernel;
@@ -2411,7 +2312,7 @@
       kernel[i++]=(double) (exp(-((double) u*u+v*v)/(2.0*MagickSigma*
         MagickSigma))/(2.0*MagickPI*MagickSigma*MagickSigma));
   }
-  blur_image=ConvolveImageChannel(image,channel,width,kernel,exception);
+  blur_image=ConvolveImage(image,width,kernel,exception);
   kernel=(double *) RelinquishMagickMemory(kernel);
   return(blur_image);
 }
@@ -2439,17 +2340,11 @@
 %
 %    Image *MotionBlurImage(const Image *image,const double radius,
 %      const double sigma,const double angle,ExceptionInfo *exception)
-%    Image *MotionBlurImageChannel(const Image *image,const ChannelType channel,
-%      const double radius,const double sigma,const double angle,
-%      ExceptionInfo *exception)
 %
 %  A description of each parameter follows:
 %
 %    o image: the image.
 %
-%    o channel: the channel type.
-%
-%    o radius: the radius of the Gaussian, in pixels, not counting the center
 %    o radius: the radius of the Gaussian, in pixels, not counting
 %      the center pixel.
 %
@@ -2489,20 +2384,9 @@
   return(kernel);
 }
 
-MagickExport Image *MotionBlurImage(const Image *image,const double radius,
-  const double sigma,const double angle,ExceptionInfo *exception)
-{
-  Image
-    *motion_blur;
-
-  motion_blur=MotionBlurImageChannel(image,DefaultChannels,radius,sigma,angle,
-    exception);
-  return(motion_blur);
-}
-
-MagickExport Image *MotionBlurImageChannel(const Image *image,
-  const ChannelType channel,const double radius,const double sigma,
-  const double angle,ExceptionInfo *exception)
+MagickExport Image *MotionBlurImage(const Image *image,
+  const double radius,const double sigma,const double angle,
+  ExceptionInfo *exception)
 {
   CacheView
     *blur_view,
@@ -2700,7 +2584,7 @@
           proceed;
 
 #if defined(MAGICKCORE_OPENMP_SUPPORT)
-  #pragma omp critical (MagickCore_MotionBlurImageChannel)
+  #pragma omp critical (MagickCore_MotionBlurImage)
 #endif
         proceed=SetImageProgress(image,BlurImageTag,progress++,image->rows);
         if (proceed == MagickFalse)
@@ -3257,33 +3141,18 @@
 %
 %    Image *RadialBlurImage(const Image *image,const double angle,
 %      ExceptionInfo *exception)
-%    Image *RadialBlurImageChannel(const Image *image,const ChannelType channel,
-%      const double angle,ExceptionInfo *exception)
 %
 %  A description of each parameter follows:
 %
 %    o image: the image.
 %
-%    o channel: the channel type.
-%
 %    o angle: the angle of the radial blur.
 %
 %    o exception: return any errors or warnings in this structure.
 %
 */
-
-MagickExport Image *RadialBlurImage(const Image *image,const double angle,
-  ExceptionInfo *exception)
-{
-  Image
-    *blur_image;
-
-  blur_image=RadialBlurImageChannel(image,DefaultChannels,angle,exception);
-  return(blur_image);
-}
-
-MagickExport Image *RadialBlurImageChannel(const Image *image,
-  const ChannelType channel,const double angle,ExceptionInfo *exception)
+MagickExport Image *RadialBlurImage(const Image *image,
+  const double angle,ExceptionInfo *exception)
 {
   CacheView
     *blur_view,
@@ -3513,7 +3382,7 @@
           proceed;
 
 #if defined(MAGICKCORE_OPENMP_SUPPORT)
-  #pragma omp critical (MagickCore_RadialBlurImageChannel)
+  #pragma omp critical (MagickCore_RadialBlurImage)
 #endif
         proceed=SetImageProgress(image,BlurImageTag,progress++,image->rows);
         if (proceed == MagickFalse)
@@ -3548,16 +3417,11 @@
 %
 %      Image *SelectiveBlurImage(const Image *image,const double radius,
 %        const double sigma,const double threshold,ExceptionInfo *exception)
-%      Image *SelectiveBlurImageChannel(const Image *image,
-%        const ChannelType channel,const double radius,const double sigma,
-%        const double threshold,ExceptionInfo *exception)
 %
 %  A description of each parameter follows:
 %
 %    o image: the image.
 %
-%    o channel: the channel type.
-%
 %    o radius: the radius of the Gaussian, in pixels, not counting the center
 %      pixel.
 %
@@ -3569,21 +3433,9 @@
 %    o exception: return any errors or warnings in this structure.
 %
 */
-
-MagickExport Image *SelectiveBlurImage(const Image *image,const double radius,
-  const double sigma,const double threshold,ExceptionInfo *exception)
-{
-  Image
-    *blur_image;
-
-  blur_image=SelectiveBlurImageChannel(image,DefaultChannels,radius,sigma,
-    threshold,exception);
-  return(blur_image);
-}
-
-MagickExport Image *SelectiveBlurImageChannel(const Image *image,
-  const ChannelType channel,const double radius,const double sigma,
-  const double threshold,ExceptionInfo *exception)
+MagickExport Image *SelectiveBlurImage(const Image *image,
+  const double radius,const double sigma,const double threshold,
+  ExceptionInfo *exception)
 {
 #define SelectiveBlurImageTag  "SelectiveBlur/Image"
 
@@ -3896,7 +3748,7 @@
           proceed;
 
 #if defined(MAGICKCORE_OPENMP_SUPPORT)
-  #pragma omp critical (MagickCore_SelectiveBlurImageChannel)
+  #pragma omp critical (MagickCore_SelectiveBlurImage)
 #endif
         proceed=SetImageProgress(image,SelectiveBlurImageTag,progress++,
           image->rows);
@@ -4143,15 +3995,11 @@
 %
 %    Image *SharpenImage(const Image *image,const double radius,
 %      const double sigma,ExceptionInfo *exception)
-%    Image *SharpenImageChannel(const Image *image,const ChannelType channel,
-%      const double radius,const double sigma,ExceptionInfo *exception)
 %
 %  A description of each parameter follows:
 %
 %    o image: the image.
 %
-%    o channel: the channel type.
-%
 %    o radius: the radius of the Gaussian, in pixels, not counting the center
 %      pixel.
 %
@@ -4160,21 +4008,9 @@
 %    o exception: return any errors or warnings in this structure.
 %
 */
-
 MagickExport Image *SharpenImage(const Image *image,const double radius,
   const double sigma,ExceptionInfo *exception)
 {
-  Image
-    *sharp_image;
-
-  sharp_image=SharpenImageChannel(image,DefaultChannels,radius,sigma,exception);
-  return(sharp_image);
-}
-
-MagickExport Image *SharpenImageChannel(const Image *image,
-  const ChannelType channel,const double radius,const double sigma,
-  ExceptionInfo *exception)
-{
   double
     *kernel,
     normalize;
@@ -4217,7 +4053,7 @@
     }
   }
   kernel[i/2]=(double) ((-2.0)*normalize);
-  sharp_image=ConvolveImageChannel(image,channel,width,kernel,exception);
+  sharp_image=ConvolveImage(image,width,kernel,exception);
   kernel=(double *) RelinquishMagickMemory(kernel);
   return(sharp_image);
 }
@@ -4384,16 +4220,11 @@
 %
 %      Image *StatisticImage(const Image *image,const StatisticType type,
 %        const size_t width,const size_t height,ExceptionInfo *exception)
-%      Image *StatisticImageChannel(const Image *image,
-%        const ChannelType channel,const StatisticType type,
-%        const size_t width,const size_t height,ExceptionInfo *exception)
 %
 %  A description of each parameter follows:
 %
 %    o image: the image.
 %
-%    o channel: the image channel.
-%
 %    o type: the statistic type (median, mode, etc.).
 %
 %    o width: the width of the pixel neighborhood.
@@ -5010,18 +4841,6 @@
 MagickExport Image *StatisticImage(const Image *image,const StatisticType type,
   const size_t width,const size_t height,ExceptionInfo *exception)
 {
-  Image
-    *statistic_image;
-
-  statistic_image=StatisticImageChannel(image,DefaultChannels,type,width,
-    height,exception);
-  return(statistic_image);
-}
-
-MagickExport Image *StatisticImageChannel(const Image *image,
-  const ChannelType channel,const StatisticType type,const size_t width,
-  const size_t height,ExceptionInfo *exception)
-{
 #define StatisticWidth \
   (width == 0 ? GetOptimalKernelWidth2D((double) width,0.5) : width)
 #define StatisticHeight \
@@ -5243,16 +5062,11 @@
 %    Image *UnsharpMaskImage(const Image *image,const double radius,
 %      const double sigma,const double amount,const double threshold,
 %      ExceptionInfo *exception)
-%    Image *UnsharpMaskImageChannel(const Image *image,
-%      const ChannelType channel,const double radius,const double sigma,
-%      const double amount,const double threshold,ExceptionInfo *exception)
 %
 %  A description of each parameter follows:
 %
 %    o image: the image.
 %
-%    o channel: the channel type.
-%
 %    o radius: the radius of the Gaussian, in pixels, not counting the center
 %      pixel.
 %
@@ -5266,22 +5080,9 @@
 %    o exception: return any errors or warnings in this structure.
 %
 */
-
-MagickExport Image *UnsharpMaskImage(const Image *image,const double radius,
-  const double sigma,const double amount,const double threshold,
-  ExceptionInfo *exception)
-{
-  Image
-    *sharp_image;
-
-  sharp_image=UnsharpMaskImageChannel(image,DefaultChannels,radius,sigma,amount,
-    threshold,exception);
-  return(sharp_image);
-}
-
-MagickExport Image *UnsharpMaskImageChannel(const Image *image,
-  const ChannelType channel,const double radius,const double sigma,
-  const double amount,const double threshold,ExceptionInfo *exception)
+MagickExport Image *UnsharpMaskImage(const Image *image,
+  const double radius,const double sigma,const double amount,
+  const double threshold,ExceptionInfo *exception)
 {
 #define SharpenImageTag  "Sharpen/Image"
 
@@ -5312,7 +5113,7 @@
   if (image->debug != MagickFalse)
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
   assert(exception != (ExceptionInfo *) NULL);
-  unsharp_image=BlurImageChannel(image,channel,radius,sigma,exception);
+  unsharp_image=BlurImage(image,radius,sigma,exception);
   if (unsharp_image == (Image *) NULL)
     return((Image *) NULL);
   quantum_threshold=(MagickRealType) QuantumRange*threshold;
@@ -5429,7 +5230,7 @@
           proceed;
 
 #if defined(MAGICKCORE_OPENMP_SUPPORT)
-  #pragma omp critical (MagickCore_UnsharpMaskImageChannel)
+  #pragma omp critical (MagickCore_UnsharpMaskImage)
 #endif
         proceed=SetImageProgress(image,SharpenImageTag,progress++,image->rows);
         if (proceed == MagickFalse)
diff --git a/MagickCore/effect.h b/MagickCore/effect.h
index d41ce88..d76cc7f 100644
--- a/MagickCore/effect.h
+++ b/MagickCore/effect.h
@@ -73,53 +73,29 @@
 
 extern MagickExport Image
   *AdaptiveBlurImage(const Image *,const double,const double,ExceptionInfo *),
-  *AdaptiveBlurImageChannel(const Image *,const ChannelType,const double,
-    const double,ExceptionInfo *),
   *AdaptiveSharpenImage(const Image *,const double,const double,
      ExceptionInfo *),
-  *AdaptiveSharpenImageChannel(const Image *,const ChannelType,const double,
-    const double,ExceptionInfo *),
   *BlurImage(const Image *,const double,const double,ExceptionInfo *),
-  *BlurImageChannel(const Image *,const ChannelType,const double,const double,
-    ExceptionInfo *),
   *ConvolveImage(const Image *,const size_t,const double *,ExceptionInfo *),
-  *ConvolveImageChannel(const Image *,const ChannelType,const size_t,
-    const double *,ExceptionInfo *),
   *DespeckleImage(const Image *,ExceptionInfo *),
   *EdgeImage(const Image *,const double,ExceptionInfo *),
   *EmbossImage(const Image *,const double,const double,ExceptionInfo *),
   *FilterImage(const Image *,const KernelInfo *,ExceptionInfo *),
-  *FilterImageChannel(const Image *,const ChannelType,const KernelInfo *,
-     ExceptionInfo *),
   *GaussianBlurImage(const Image *,const double,const double,ExceptionInfo *),
-  *GaussianBlurImageChannel(const Image *,const ChannelType,const double,
-    const double,ExceptionInfo *),
   *MotionBlurImage(const Image *,const double,const double,const double,
     ExceptionInfo *),
-  *MotionBlurImageChannel(const Image *,const ChannelType,const double,
-    const double,const double,ExceptionInfo *),
   *PreviewImage(const Image *,const PreviewType,ExceptionInfo *),
   *RadialBlurImage(const Image *,const double,ExceptionInfo *),
-  *RadialBlurImageChannel(const Image *,const ChannelType,const double,
-    ExceptionInfo *),
   *SelectiveBlurImage(const Image *,const double,const double,const double,
     ExceptionInfo *),
-  *SelectiveBlurImageChannel(const Image *,const ChannelType,const double,
-    const double,const double,ExceptionInfo *),
   *ShadeImage(const Image *,const MagickBooleanType,const double,const double,
     ExceptionInfo *),
   *SharpenImage(const Image *,const double,const double,ExceptionInfo *),
-  *SharpenImageChannel(const Image *,const ChannelType,const double,
-    const double,ExceptionInfo *),
   *SpreadImage(const Image *,const double,ExceptionInfo *),
   *StatisticImage(const Image *,const StatisticType,const size_t,const size_t,
     ExceptionInfo *),
-  *StatisticImageChannel(const Image *,const ChannelType,const StatisticType,
-    const size_t,const size_t,ExceptionInfo *),
   *UnsharpMaskImage(const Image *,const double,const double,const double,
-    const double,ExceptionInfo *),
-  *UnsharpMaskImageChannel(const Image *,const ChannelType,const double,
-    const double,const double,const double,ExceptionInfo *);
+    const double,ExceptionInfo *);
 
 #if defined(__cplusplus) || defined(c_plusplus)
 }
diff --git a/MagickCore/fx.c b/MagickCore/fx.c
index 98e53d4..923495b 100644
--- a/MagickCore/fx.c
+++ b/MagickCore/fx.c
@@ -4188,7 +4188,9 @@
       }
   }
   border_view=DestroyCacheView(border_view);
-  shadow_image=BlurImageChannel(border_image,AlphaChannel,0.0,sigma,exception);
+  PushPixelComponentMap(border_image,AlphaChannel);
+  shadow_image=BlurImage(border_image,0.0,sigma,exception);
+  PopPixelComponentMap(border_image);
   border_image=DestroyImage(border_image);
   if (shadow_image == (Image *) NULL)
     return((Image *) NULL);
diff --git a/MagickCore/image.c b/MagickCore/image.c
index 97a8cc7..fd88b44 100644
--- a/MagickCore/image.c
+++ b/MagickCore/image.c
@@ -3602,7 +3602,9 @@
         status=TransformImageColorspace(image,RGBColorspace);
       if (image->matte == MagickFalse)
         (void) SetImageAlphaChannel(image,OpaqueAlphaChannel);
-      (void) BilevelImageChannel(image,AlphaChannel,(double) QuantumRange/2.0);
+      PushPixelComponentMap(image,AlphaChannel);
+      (void) BilevelImage(image,(double) QuantumRange/2.0);
+      PopPixelComponentMap(image);
       quantize_info=AcquireQuantizeInfo(image_info);
       status=QuantizeImage(quantize_info,image);
       quantize_info=DestroyQuantizeInfo(quantize_info);
diff --git a/MagickCore/methods.h b/MagickCore/methods.h
index 03de5dc..6fcfa7a 100644
--- a/MagickCore/methods.h
+++ b/MagickCore/methods.h
@@ -80,10 +80,10 @@
 #define AcquireUniqueFilename  PrependMagickMethod(AcquireUniqueFilename)
 #define AcquireUniqueFileResource  PrependMagickMethod(AcquireUniqueFileResource)
 #define AcquireUniqueSymbolicLink  PrependMagickMethod(AcquireUniqueSymbolicLink)
-#define AdaptiveBlurImageChannel  PrependMagickMethod(AdaptiveBlurImageChannel)
+#define AdaptiveBlurImage  PrependMagickMethod(AdaptiveBlurImage)
 #define AdaptiveBlurImage  PrependMagickMethod(AdaptiveBlurImage)
 #define AdaptiveResizeImage  PrependMagickMethod(AdaptiveResizeImage)
-#define AdaptiveSharpenImageChannel  PrependMagickMethod(AdaptiveSharpenImageChannel)
+#define AdaptiveSharpenImage  PrependMagickMethod(AdaptiveSharpenImage)
 #define AdaptiveSharpenImage  PrependMagickMethod(AdaptiveSharpenImage)
 #define AdaptiveThresholdImage  PrependMagickMethod(AdaptiveThresholdImage)
 #define AddChildToXMLTree  PrependMagickMethod(AddChildToXMLTree)
@@ -118,14 +118,14 @@
 #define AverageImages  PrependMagickMethod(AverageImages)
 #define Base64Decode  PrependMagickMethod(Base64Decode)
 #define Base64Encode  PrependMagickMethod(Base64Encode)
-#define BilevelImageChannel  PrependMagickMethod(BilevelImageChannel)
 #define BilevelImage  PrependMagickMethod(BilevelImage)
-#define BlackThresholdImageChannel  PrependMagickMethod(BlackThresholdImageChannel)
+#define BilevelImage  PrependMagickMethod(BilevelImage)
+#define BlackThresholdImage  PrependMagickMethod(BlackThresholdImage)
 #define BlackThresholdImage  PrependMagickMethod(BlackThresholdImage)
 #define BlobToFile  PrependMagickMethod(BlobToFile)
 #define BlobToImage  PrependMagickMethod(BlobToImage)
 #define BlueShiftImage  PrependMagickMethod(BlueShiftImage)
-#define BlurImageChannel  PrependMagickMethod(BlurImageChannel)
+#define BlurImage  PrependMagickMethod(BlurImage)
 #define BlurImage  PrependMagickMethod(BlurImage)
 #define BorderImage  PrependMagickMethod(BorderImage)
 #define BrightnessContrastImage  PrependMagickMethod(BrightnessContrastImage)
@@ -140,7 +140,7 @@
 #define CharcoalImage  PrependMagickMethod(CharcoalImage)
 #define ChopImage  PrependMagickMethod(ChopImage)
 #define ChopPathComponents  PrependMagickMethod(ChopPathComponents)
-#define ClampImageChannel  PrependMagickMethod(ClampImageChannel)
+#define ClampImage  PrependMagickMethod(ClampImage)
 #define ClampImage  PrependMagickMethod(ClampImage)
 #define ClearLinkedList  PrependMagickMethod(ClearLinkedList)
 #define ClearMagickException  PrependMagickMethod(ClearMagickException)
@@ -189,7 +189,7 @@
 #define CompareSplayTreeStringInfo  PrependMagickMethod(CompareSplayTreeStringInfo)
 #define CompareSplayTreeString  PrependMagickMethod(CompareSplayTreeString)
 #define CompareStringInfo  PrependMagickMethod(CompareStringInfo)
-#define CompositeImageChannel  PrependMagickMethod(CompositeImageChannel)
+#define CompositeImage  PrependMagickMethod(CompositeImage)
 #define CompositeImage  PrependMagickMethod(CompositeImage)
 #define CompositeLayers  PrependMagickMethod(CompositeLayers)
 #define CompressImageColormap  PrependMagickMethod(CompressImageColormap)
@@ -215,7 +215,7 @@
 #define ConvertRGBToHSB  PrependMagickMethod(ConvertRGBToHSB)
 #define ConvertRGBToHSL  PrependMagickMethod(ConvertRGBToHSL)
 #define ConvertRGBToHWB  PrependMagickMethod(ConvertRGBToHWB)
-#define ConvolveImageChannel  PrependMagickMethod(ConvolveImageChannel)
+#define ConvolveImage  PrependMagickMethod(ConvolveImage)
 #define ConvolveImage  PrependMagickMethod(ConvolveImage)
 #define CopyMagickMemory  PrependMagickMethod(CopyMagickMemory)
 #define CopyMagickString  PrependMagickMethod(CopyMagickString)
@@ -323,7 +323,7 @@
 #define FileToImage  PrependMagickMethod(FileToImage)
 #define FileToStringInfo  PrependMagickMethod(FileToStringInfo)
 #define FileToString  PrependMagickMethod(FileToString)
-#define FilterImageChannel  PrependMagickMethod(FilterImageChannel)
+#define FilterImage  PrependMagickMethod(FilterImage)
 #define FilterImage  PrependMagickMethod(FilterImage)
 #define FinalizeSignature  PrependMagickMethod(FinalizeSignature)
 #define FlattenImages  PrependMagickMethod(FlattenImages)
@@ -355,7 +355,7 @@
 #define FxPreprocessExpression  PrependMagickMethod(FxPreprocessExpression)
 #define GammaImage  PrependMagickMethod(GammaImage)
 #define GammaImage  PrependMagickMethod(GammaImage)
-#define GaussianBlurImageChannel  PrependMagickMethod(GaussianBlurImageChannel)
+#define GaussianBlurImage  PrependMagickMethod(GaussianBlurImage)
 #define GaussianBlurImage  PrependMagickMethod(GaussianBlurImage)
 #define GaussJordanElimination  PrependMagickMethod(GaussJordanElimination)
 #define GenerateDifferentialNoise  PrependMagickMethod(GenerateDifferentialNoise)
@@ -760,7 +760,7 @@
 #define MorphImages  PrependMagickMethod(MorphImages)
 #define MorphologyImage  PrependMagickMethod(MorphologyImage)
 #define MosaicImages  PrependMagickMethod(MosaicImages)
-#define MotionBlurImageChannel  PrependMagickMethod(MotionBlurImageChannel)
+#define MotionBlurImage  PrependMagickMethod(MotionBlurImage)
 #define MotionBlurImage  PrependMagickMethod(MotionBlurImage)
 #define MSBOrderLong  PrependMagickMethod(MSBOrderLong)
 #define MSBOrderShort  PrependMagickMethod(MSBOrderShort)
@@ -841,13 +841,13 @@
 #define QueueAuthenticNexus  PrependMagickMethod(QueueAuthenticNexus)
 #define QueueAuthenticPixels  PrependMagickMethod(QueueAuthenticPixels)
 #define QueueCacheViewAuthenticPixels  PrependMagickMethod(QueueCacheViewAuthenticPixels)
-#define RadialBlurImageChannel  PrependMagickMethod(RadialBlurImageChannel)
+#define RadialBlurImage  PrependMagickMethod(RadialBlurImage)
 #define RadialBlurImage  PrependMagickMethod(RadialBlurImage)
 #define RaiseImage  PrependMagickMethod(RaiseImage)
 #define RandomChannelThresholdImage  PrependMagickMethod(RandomChannelThresholdImage)
 #define RandomComponentGenesis  PrependMagickMethod(RandomComponentGenesis)
 #define RandomComponentTerminus  PrependMagickMethod(RandomComponentTerminus)
-#define RandomThresholdImageChannel  PrependMagickMethod(RandomThresholdImageChannel)
+#define RandomThresholdImage  PrependMagickMethod(RandomThresholdImage)
 #define RandomThresholdImage  PrependMagickMethod(RandomThresholdImage)
 #define ReacquireMemory  PrependMagickMethod(ReacquireMemory)
 #define ReadBlobByte  PrependMagickMethod(ReadBlobByte)
@@ -1038,7 +1038,7 @@
 #define SeedPseudoRandomGenerator  PrependMagickMethod(SeedPseudoRandomGenerator)
 #define SeekBlob  PrependMagickMethod(SeekBlob)
 #define SegmentImage  PrependMagickMethod(SegmentImage)
-#define SelectiveBlurImageChannel  PrependMagickMethod(SelectiveBlurImageChannel)
+#define SelectiveBlurImage  PrependMagickMethod(SelectiveBlurImage)
 #define SelectiveBlurImage  PrependMagickMethod(SelectiveBlurImage)
 #define SemaphoreComponentGenesis  PrependMagickMethod(SemaphoreComponentGenesis)
 #define SemaphoreComponentTerminus  PrependMagickMethod(SemaphoreComponentTerminus)
@@ -1123,7 +1123,7 @@
 #define SetXMLTreeContent  PrependMagickMethod(SetXMLTreeContent)
 #define ShadeImage  PrependMagickMethod(ShadeImage)
 #define ShadowImage  PrependMagickMethod(ShadowImage)
-#define SharpenImageChannel  PrependMagickMethod(SharpenImageChannel)
+#define SharpenImage  PrependMagickMethod(SharpenImage)
 #define SharpenImage  PrependMagickMethod(SharpenImage)
 #define ShaveImage  PrependMagickMethod(ShaveImage)
 #define ShearImage  PrependMagickMethod(ShearImage)
@@ -1308,14 +1308,14 @@
 #define UnregisterXWDImage  PrependMagickMethod(UnregisterXWDImage)
 #define UnregisterYCBCRImage  PrependMagickMethod(UnregisterYCBCRImage)
 #define UnregisterYUVImage  PrependMagickMethod(UnregisterYUVImage)
-#define UnsharpMaskImageChannel  PrependMagickMethod(UnsharpMaskImageChannel)
+#define UnsharpMaskImage  PrependMagickMethod(UnsharpMaskImage)
 #define UnsharpMaskImage  PrependMagickMethod(UnsharpMaskImage)
 #define UnshiftImageList  PrependMagickMethod(UnshiftImageList)
 #define UpdateSignature  PrependMagickMethod(UpdateSignature)
 #define ValidateColormapIndex  PrependMagickMethod(ValidateColormapIndex)
 #define VignetteImage  PrependMagickMethod(VignetteImage)
 #define WaveImage  PrependMagickMethod(WaveImage)
-#define WhiteThresholdImageChannel  PrependMagickMethod(WhiteThresholdImageChannel)
+#define WhiteThresholdImage  PrependMagickMethod(WhiteThresholdImage)
 #define WhiteThresholdImage  PrependMagickMethod(WhiteThresholdImage)
 #define WriteBlobByte  PrependMagickMethod(WriteBlobByte)
 #define WriteBlobFloat  PrependMagickMethod(WriteBlobFloat)
diff --git a/MagickCore/morphology-private.h b/MagickCore/morphology-private.h
index 78bc9e7..8e45ca4 100644
--- a/MagickCore/morphology-private.h
+++ b/MagickCore/morphology-private.h
@@ -29,9 +29,8 @@
 #include <MagickCore/morphology.h>
 
 extern MagickExport Image
-  *MorphologyApply(const Image *,const ChannelType,const MorphologyMethod,
-    const ssize_t,const KernelInfo *,const CompositeOperator,const double,
-    ExceptionInfo *);
+  *MorphologyApply(const Image *,const MorphologyMethod,const ssize_t,
+    const KernelInfo *,const CompositeOperator,const double,ExceptionInfo *);
 
 extern MagickExport void
   ScaleKernelInfo(KernelInfo *,const double,const GeometryFlags),
diff --git a/MagickCore/morphology.c b/MagickCore/morphology.c
index 00ca774..e12f0fb 100644
--- a/MagickCore/morphology.c
+++ b/MagickCore/morphology.c
@@ -2443,12 +2443,12 @@
 %  MorphologyApply() applies a morphological method, multiple times using
 %  a list of multiple kernels.
 %
-%  It is basically equivalent to as MorphologyImageChannel() (see below) but
+%  It is basically equivalent to as MorphologyImage() (see below) but
 %  without any user controls.  This allows internel programs to use this
 %  function, to actually perform a specific task without possible interference
 %  by any API user supplied settings.
 %
-%  It is MorphologyImageChannel() task to extract any such user controls, and
+%  It is MorphologyImage() task to extract any such user controls, and
 %  pass them to this function for processing.
 %
 %  More specifically kernels are not normalized/scaled/blended by the
@@ -2459,9 +2459,9 @@
 %  The format of the MorphologyApply method is:
 %
 %      Image *MorphologyApply(const Image *image,MorphologyMethod method,
-%        const ChannelType channel, const ssize_t iterations,
-%        const KernelInfo *kernel, const CompositeMethod compose,
-%        const double bias, ExceptionInfo *exception)
+%        const ssize_t iterations,const KernelInfo *kernel,
+%        const CompositeMethod compose,const double bias,
+%        ExceptionInfo *exception)
 %
 %  A description of each parameter follows:
 %
@@ -2469,10 +2469,6 @@
 %
 %    o method: the morphology method to be applied.
 %
-%    o channel: the channels to which the operations are applied
-%               The channel 'sync' flag determines if 'alpha weighting' is
-%               applied for convolution style operations.
-%
 %    o iterations: apply the operation this many times (or no change).
 %                  A value of -1 means loop until no change found.
 %                  How this is applied may depend on the morphology method.
@@ -2498,9 +2494,9 @@
 ** It returns the number of pixels that changed between the images
 ** for result convergence determination.
 */
-static ssize_t MorphologyPrimitive(const Image *image, Image *morphology_image,
-     const MorphologyMethod method, const ChannelType channel,
-     const KernelInfo *kernel,const double bias,ExceptionInfo *exception)
+static ssize_t MorphologyPrimitive(const Image *image,Image *morphology_image,
+  const MorphologyMethod method,const KernelInfo *kernel,const double bias,
+  ExceptionInfo *exception)
 {
 #define MorphologyTag  "Morphology/Image"
 
@@ -2657,8 +2653,8 @@
         */
         k = &kernel->values[ kernel->height-1 ];
         k_pixels = p;
-        if ( ((channel & SyncChannels) == 0 ) ||
-                             (image->matte == MagickFalse) )
+        if ( (image->sync == MagickFalse) ||
+             (image->matte == MagickFalse) )
           { /* No 'Sync' involved.
             ** Convolution is simple greyscale channel operation
             */
@@ -2882,8 +2878,8 @@
             */
             k = &kernel->values[ kernel->width*kernel->height-1 ];
             k_pixels = p;
-            if ( ((channel & SyncChannels) == 0 ) ||
-                                 (image->matte == MagickFalse) )
+            if ( (image->sync == MagickFalse) ||
+                 (image->matte == MagickFalse) )
               { /* No 'Sync' involved.
                 ** Convolution is simple greyscale channel operation
                 */
@@ -3279,8 +3275,8 @@
 ** of multi-threaded, parellel processing.
 */
 static ssize_t MorphologyPrimitiveDirect(Image *image,
-     const MorphologyMethod method, const ChannelType channel,
-     const KernelInfo *kernel,ExceptionInfo *exception)
+  const MorphologyMethod method,const KernelInfo *kernel,
+  ExceptionInfo *exception)
 {
   CacheView
     *auth_view,
@@ -3713,10 +3709,10 @@
 ** Basically this provides the complex grue between the requested morphology
 ** method and raw low-level implementation (above).
 */
-MagickExport Image *MorphologyApply(const Image *image, const ChannelType
-     channel,const MorphologyMethod method, const ssize_t iterations,
-     const KernelInfo *kernel, const CompositeOperator compose,
-     const double bias, ExceptionInfo *exception)
+MagickExport Image *MorphologyApply(const Image *image,
+  const MorphologyMethod method, const ssize_t iterations,
+  const KernelInfo *kernel, const CompositeOperator compose,const double bias,
+  ExceptionInfo *exception)
 {
   CompositeOperator
     curr_compose;
@@ -3838,7 +3834,7 @@
         }
 
       changed = MorphologyPrimitiveDirect(rslt_image, method,
-                      channel, kernel, exception);
+         kernel, exception);
 
       if ( verbose == MagickTrue )
         (void) (void) FormatLocaleFile(stderr,
@@ -3852,8 +3848,7 @@
       if ( method == VoronoiMorphology ) {
         /* Preserve the alpha channel of input image - but turned off */
         (void) SetImageAlphaChannel(rslt_image, DeactivateAlphaChannel);
-        (void) CompositeImageChannel(rslt_image, DefaultChannels,
-          CopyOpacityCompositeOp, image, 0, 0);
+        (void) CompositeImage(rslt_image, CopyOpacityCompositeOp, image, 0, 0);
         (void) SetImageAlphaChannel(rslt_image, DeactivateAlphaChannel);
       }
       goto exit_cleanup;
@@ -4023,7 +4018,7 @@
           /* APPLY THE MORPHOLOGICAL PRIMITIVE (curr -> work) */
           count++;
           changed = MorphologyPrimitive(curr_image, work_image, primitive,
-                       channel, this_kernel, bias, exception);
+                       this_kernel, bias, exception);
 
           if ( verbose == MagickTrue ) {
             if ( kernel_loop > 1 )
@@ -4080,17 +4075,16 @@
           if ( verbose == MagickTrue )
             (void) FormatLocaleFile(stderr, "\n%s: Difference with original image",
                  CommandOptionToMnemonic(MagickMorphologyOptions, method) );
-          (void) CompositeImageChannel(curr_image,
-                  (ChannelType) (channel & ~SyncChannels),
-                  DifferenceCompositeOp, image, 0, 0);
+          curr_image->sync=MagickFalse;
+          (void) CompositeImage(curr_image,DifferenceCompositeOp,image,0,0);
           break;
         case EdgeMorphology:
           if ( verbose == MagickTrue )
             (void) FormatLocaleFile(stderr, "\n%s: Difference of Dilate and Erode",
                  CommandOptionToMnemonic(MagickMorphologyOptions, method) );
-          (void) CompositeImageChannel(curr_image,
-                  (ChannelType) (channel & ~SyncChannels),
-                  DifferenceCompositeOp, save_image, 0, 0);
+          curr_image->sync=MagickFalse;
+          (void) CompositeImage(curr_image,DifferenceCompositeOp,save_image,0,
+            0);
           save_image = DestroyImage(save_image); /* finished with save image */
           break;
         default:
@@ -4126,9 +4120,8 @@
           if ( verbose == MagickTrue )
             (void) FormatLocaleFile(stderr, " (compose \"%s\")",
                  CommandOptionToMnemonic(MagickComposeOptions, rslt_compose) );
-          (void) CompositeImageChannel(rslt_image,
-               (ChannelType) (channel & ~SyncChannels), rslt_compose,
-               curr_image, 0, 0);
+          rslt_image->sync=MagickFalse;
+          (void) CompositeImage(rslt_image, rslt_compose, curr_image, 0, 0);
           curr_image = DestroyImage(curr_image);
           curr_image = (Image *) image;  /* continue with original image */
         }
@@ -4172,13 +4165,13 @@
 %                                                                             %
 %                                                                             %
 %                                                                             %
-%     M o r p h o l o g y I m a g e C h a n n e l                             %
+%     M o r p h o l o g y I m a g e                                           %
 %                                                                             %
 %                                                                             %
 %                                                                             %
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %
-%  MorphologyImageChannel() applies a user supplied kernel to the image
+%  MorphologyImage() applies a user supplied kernel to the image
 %  according to the given mophology method.
 %
 %  This function applies any and all user defined settings before calling
@@ -4195,7 +4188,7 @@
 %      Image *MorphologyImage(const Image *image,MorphologyMethod method,
 %        const ssize_t iterations,KernelInfo *kernel,ExceptionInfo *exception)
 %
-%      Image *MorphologyImageChannel(const Image *image, const ChannelType
+%      Image *MorphologyImage(const Image *image, const ChannelType
 %        channel,MorphologyMethod method,const ssize_t iterations,
 %        KernelInfo *kernel,ExceptionInfo *exception)
 %
@@ -4210,18 +4203,15 @@
 %                  How this is applied may depend on the morphology method.
 %                  Typically this is a value of 1.
 %
-%    o channel: the channel type.
-%
 %    o kernel: An array of double representing the morphology kernel.
 %              Warning: kernel may be normalized for the Convolve method.
 %
 %    o exception: return any errors or warnings in this structure.
 %
 */
-
-MagickExport Image *MorphologyImageChannel(const Image *image,
-  const ChannelType channel,const MorphologyMethod method,
-  const ssize_t iterations,const KernelInfo *kernel,ExceptionInfo *exception)
+MagickExport Image *MorphologyImage(const Image *image,
+  const MorphologyMethod method,const ssize_t iterations,
+  const KernelInfo *kernel,ExceptionInfo *exception)
 {
   KernelInfo
     *curr_kernel;
@@ -4275,26 +4265,14 @@
                              MagickComposeOptions,MagickFalse,artifact);
   }
   /* Apply the Morphology */
-  morphology_image = MorphologyApply(image, channel, method, iterations,
-                         curr_kernel, compose, image->bias, exception);
+  morphology_image = MorphologyApply(image, method, iterations,
+    curr_kernel, compose, image->bias, exception);
 
   /* Cleanup and Exit */
   if ( curr_kernel != kernel )
     curr_kernel=DestroyKernelInfo(curr_kernel);
   return(morphology_image);
 }
-
-MagickExport Image *MorphologyImage(const Image *image, const MorphologyMethod
-  method, const ssize_t iterations,const KernelInfo *kernel, ExceptionInfo
-  *exception)
-{
-  Image
-    *morphology_image;
-
-  morphology_image=MorphologyImageChannel(image,DefaultChannels,method,
-    iterations,kernel,exception);
-  return(morphology_image);
-}
 
 /*
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
diff --git a/MagickCore/morphology.h b/MagickCore/morphology.h
index fc0e242..70652d0 100644
--- a/MagickCore/morphology.h
+++ b/MagickCore/morphology.h
@@ -133,9 +133,7 @@
 
 extern MagickExport Image
   *MorphologyImage(const Image *,const MorphologyMethod,const ssize_t,
-    const KernelInfo *,ExceptionInfo *),
-  *MorphologyImageChannel(const Image *,const ChannelType,
-    const MorphologyMethod,const ssize_t,const KernelInfo *,ExceptionInfo *);
+    const KernelInfo *,ExceptionInfo *);
 
 extern MagickExport void
   ScaleGeometryKernelInfo(KernelInfo *,const char *),
diff --git a/MagickCore/threshold.c b/MagickCore/threshold.c
index da42061..1fffd59 100644
--- a/MagickCore/threshold.c
+++ b/MagickCore/threshold.c
@@ -321,36 +321,22 @@
 %  If the default channel setting is given the image is thresholded using just
 %  the gray 'intensity' of the image, rather than the individual channels.
 %
-%  The format of the BilevelImageChannel method is:
+%  The format of the BilevelImage method is:
 %
 %      MagickBooleanType BilevelImage(Image *image,const double threshold)
-%      MagickBooleanType BilevelImageChannel(Image *image,
-%        const ChannelType channel,const double threshold)
 %
 %  A description of each parameter follows:
 %
 %    o image: the image.
 %
-%    o channel: the channel type.
-%
 %    o threshold: define the threshold values.
 %
 %  Aside: You can get the same results as operator using LevelImages()
 %  with the 'threshold' value for both the black_point and the white_point.
 %
 */
-
-MagickExport MagickBooleanType BilevelImage(Image *image,const double threshold)
-{
-  MagickBooleanType
-    status;
-
-  status=BilevelImageChannel(image,DefaultChannels,threshold);
-  return(status);
-}
-
-MagickExport MagickBooleanType BilevelImageChannel(Image *image,
-  const ChannelType channel,const double threshold)
+MagickExport MagickBooleanType BilevelImage(Image *image,
+  const double threshold)
 {
 #define ThresholdImageTag  "Threshold/Image"
 
@@ -401,7 +387,7 @@
         status=MagickFalse;
         continue;
       }
-    if (channel == DefaultChannels)
+    if (image->sync != MagickFalse)
       {
         for (x=0; x < (ssize_t) image->columns; x++)
         {
@@ -448,7 +434,7 @@
           proceed;
 
 #if defined(MAGICKCORE_OPENMP_SUPPORT)
-  #pragma omp critical (MagickCore_BilevelImageChannel)
+  #pragma omp critical (MagickCore_BilevelImage)
 #endif
         proceed=SetImageProgress(image,ThresholdImageTag,progress++,
           image->rows);
@@ -477,35 +463,20 @@
 %
 %  The format of the BlackThresholdImage method is:
 %
-%      MagickBooleanType BlackThresholdImage(Image *image,const char *threshold)
-%      MagickBooleanType BlackThresholdImageChannel(Image *image,
-%        const ChannelType channel,const char *threshold,
-%        ExceptionInfo *exception)
+%      MagickBooleanType BlackThresholdImage(Image *image,
+%        const char *threshold,ExceptionInfo *exception)
 %
 %  A description of each parameter follows:
 %
 %    o image: the image.
 %
-%    o channel: the channel or channels to be thresholded.
-%
 %    o threshold: Define the threshold value.
 %
 %    o exception: return any errors or warnings in this structure.
 %
 */
 MagickExport MagickBooleanType BlackThresholdImage(Image *image,
-  const char *threshold)
-{
-  MagickBooleanType
-    status;
-
-  status=BlackThresholdImageChannel(image,DefaultChannels,threshold,
-    &image->exception);
-  return(status);
-}
-
-MagickExport MagickBooleanType BlackThresholdImageChannel(Image *image,
-  const ChannelType channel,const char *thresholds,ExceptionInfo *exception)
+  const char *thresholds,ExceptionInfo *exception)
 {
 #define ThresholdImageTag  "Threshold/Image"
 
@@ -588,7 +559,7 @@
       }
     for (x=0; x < (ssize_t) image->columns; x++)
     {
-      if (channel != DefaultChannels)
+      if (image->sync != MagickFalse)
         {
           if (GetPixelIntensity(image,q) < GetPixelInfoIntensity(&threshold))
             {
@@ -628,7 +599,7 @@
           proceed;
 
 #if defined(MAGICKCORE_OPENMP_SUPPORT)
-  #pragma omp critical (MagickCore_BlackThresholdImageChannel)
+  #pragma omp critical (MagickCore_BlackThresholdImage)
 #endif
         proceed=SetImageProgress(image,ThresholdImageTag,progress++,
           image->rows);
@@ -653,18 +624,14 @@
 %
 %  ClampImage() restricts the color range from 0 to the quantum depth.
 %
-%  The format of the ClampImageChannel method is:
+%  The format of the ClampImage method is:
 %
 %      MagickBooleanType ClampImage(Image *image)
-%      MagickBooleanType ClampImageChannel(Image *image,
-%        const ChannelType channel)
 %
 %  A description of each parameter follows:
 %
 %    o image: the image.
 %
-%    o channel: the channel type.
-%
 */
 
 static inline Quantum ClampToUnsignedQuantum(const Quantum quantum)
@@ -682,16 +649,6 @@
 
 MagickExport MagickBooleanType ClampImage(Image *image)
 {
-  MagickBooleanType
-    status;
-
-  status=ClampImageChannel(image,DefaultChannels);
-  return(status);
-}
-
-MagickExport MagickBooleanType ClampImageChannel(Image *image,
-  const ChannelType channel)
-{
 #define ClampImageTag  "Clamp/Image"
 
   CacheView
@@ -781,7 +738,7 @@
           proceed;
 
 #if defined(MAGICKCORE_OPENMP_SUPPORT)
-  #pragma omp critical (MagickCore_ClampImageChannel)
+  #pragma omp critical (MagickCore_ClampImage)
 #endif
         proceed=SetImageProgress(image,ClampImageTag,progress++,
           image->rows);
@@ -1528,18 +1485,13 @@
 %
 %  The format of the RandomThresholdImage method is:
 %
-%      MagickBooleanType RandomThresholdImageChannel(Image *image,
+%      MagickBooleanType RandomThresholdImage(Image *image,
 %        const char *thresholds,ExceptionInfo *exception)
-%      MagickBooleanType RandomThresholdImageChannel(Image *image,
-%        const ChannelType channel,const char *thresholds,
-%        ExceptionInfo *exception)
 %
 %  A description of each parameter follows:
 %
 %    o image: the image.
 %
-%    o channel: the channel or channels to be thresholded.
-%
 %    o thresholds: a geometry string containing low,high thresholds.  If the
 %      string contains 2x2, 3x3, or 4x4, an ordered dither of order 2, 3, or 4
 %      is performed instead.
@@ -1547,21 +1499,9 @@
 %    o exception: return any errors or warnings in this structure.
 %
 */
-
 MagickExport MagickBooleanType RandomThresholdImage(Image *image,
   const char *thresholds,ExceptionInfo *exception)
 {
-  MagickBooleanType
-    status;
-
-  status=RandomThresholdImageChannel(image,DefaultChannels,thresholds,
-    exception);
-  return(status);
-}
-
-MagickExport MagickBooleanType RandomThresholdImageChannel(Image *image,
-  const ChannelType channel,const char *thresholds,ExceptionInfo *exception)
-{
 #define ThresholdImageTag  "Threshold/Image"
 
   CacheView
@@ -1613,22 +1553,12 @@
       max_threshold*=(MagickRealType) (0.01*QuantumRange);
       min_threshold*=(MagickRealType) (0.01*QuantumRange);
     }
-  else
-    if (((max_threshold == min_threshold) || (max_threshold == 1)) &&
-        (min_threshold <= 8))
-      {
-        /*
-          Backward Compatibility -- ordered-dither -- IM v 6.2.9-6.
-        */
-        status=OrderedPosterizeImage(image,thresholds,exception);
-        return(status);
-      }
   /*
     Random threshold image.
   */
   status=MagickTrue;
   progress=0;
-  if (channel == CompositeChannels)
+  if (image->sync != MagickFalse)
     {
       if (AcquireImageColormap(image,2) == MagickFalse)
         ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed",
@@ -1692,7 +1622,7 @@
               proceed;
 
 #if defined(MAGICKCORE_OPENMP_SUPPORT)
-  #pragma omp critical (MagickCore_RandomThresholdImageChannel)
+  #pragma omp critical (MagickCore_RandomThresholdImage)
 #endif
             proceed=SetImageProgress(image,ThresholdImageTag,progress++,
               image->rows);
@@ -1817,7 +1747,7 @@
           proceed;
 
 #if defined(MAGICKCORE_OPENMP_SUPPORT)
-  #pragma omp critical (MagickCore_RandomThresholdImageChannel)
+  #pragma omp critical (MagickCore_RandomThresholdImage)
 #endif
         proceed=SetImageProgress(image,ThresholdImageTag,progress++,
           image->rows);
@@ -1847,35 +1777,20 @@
 %
 %  The format of the WhiteThresholdImage method is:
 %
-%      MagickBooleanType WhiteThresholdImage(Image *image,const char *threshold)
-%      MagickBooleanType WhiteThresholdImageChannel(Image *image,
-%        const ChannelType channel,const char *threshold,
-%        ExceptionInfo *exception)
+%      MagickBooleanType WhiteThresholdImage(Image *image,
+%        const char *threshold,ExceptionInfo *exception)
 %
 %  A description of each parameter follows:
 %
 %    o image: the image.
 %
-%    o channel: the channel or channels to be thresholded.
-%
 %    o threshold: Define the threshold value.
 %
 %    o exception: return any errors or warnings in this structure.
 %
 */
 MagickExport MagickBooleanType WhiteThresholdImage(Image *image,
-  const char *threshold)
-{
-  MagickBooleanType
-    status;
-
-  status=WhiteThresholdImageChannel(image,DefaultChannels,threshold,
-    &image->exception);
-  return(status);
-}
-
-MagickExport MagickBooleanType WhiteThresholdImageChannel(Image *image,
-  const ChannelType channel,const char *thresholds,ExceptionInfo *exception)
+  const char *thresholds,ExceptionInfo *exception)
 {
 #define ThresholdImageTag  "Threshold/Image"
 
@@ -1958,7 +1873,7 @@
       }
     for (x=0; x < (ssize_t) image->columns; x++)
     {
-      if (channel != DefaultChannels)
+      if (image->sync != MagickFalse)
         {
           if (GetPixelIntensity(image,q) > GetPixelInfoIntensity(&threshold))
             {
@@ -1998,7 +1913,7 @@
           proceed;
 
 #if defined(MAGICKCORE_OPENMP_SUPPORT)
-  #pragma omp critical (MagickCore_WhiteThresholdImageChannel)
+  #pragma omp critical (MagickCore_WhiteThresholdImage)
 #endif
         proceed=SetImageProgress(image,ThresholdImageTag,progress++,
           image->rows);
diff --git a/MagickCore/threshold.h b/MagickCore/threshold.h
index 2743d46..c8c7230 100644
--- a/MagickCore/threshold.h
+++ b/MagickCore/threshold.h
@@ -35,20 +35,12 @@
 
 extern MagickExport MagickBooleanType
   BilevelImage(Image *,const double),
-  BilevelImageChannel(Image *,const ChannelType,const double),
-  BlackThresholdImage(Image *,const char *),
-  BlackThresholdImageChannel(Image *,const ChannelType,const char *,
-    ExceptionInfo *),
+  BlackThresholdImage(Image *,const char *,ExceptionInfo *),
   ClampImage(Image *),
-  ClampImageChannel(Image *,const ChannelType),
   ListThresholdMaps(FILE *,ExceptionInfo *),
   OrderedPosterizeImage(Image *,const char *,ExceptionInfo *),
   RandomThresholdImage(Image *,const char *,ExceptionInfo *),
-  RandomThresholdImageChannel(Image *,const ChannelType,const char *,
-    ExceptionInfo *),
-  WhiteThresholdImage(Image *,const char *),
-  WhiteThresholdImageChannel(Image *,const ChannelType,const char *,
-    ExceptionInfo *);
+  WhiteThresholdImage(Image *,const char *,ExceptionInfo *);
 
 #if defined(__cplusplus) || defined(c_plusplus)
 }
diff --git a/MagickWand/composite.c b/MagickWand/composite.c
index 6f22b80..217cc38 100644
--- a/MagickWand/composite.c
+++ b/MagickWand/composite.c
@@ -122,6 +122,7 @@
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",(*image)->filename);
   assert(exception != (ExceptionInfo *) NULL);
   status=MagickTrue;
+  PushPixelComponentMap(composite_image,composite_options->channel);
   if (composite_image != (Image *) NULL)
     {
       assert(composite_image->signature == MagickSignature);
@@ -189,8 +190,7 @@
               columns=composite_image->columns;
               for (y=0; y < (ssize_t) (*image)->rows; y+=(ssize_t) composite_image->rows)
                 for (x=0; x < (ssize_t) (*image)->columns; x+=(ssize_t) columns)
-                  status&=CompositeImageChannel(*image,
-                    composite_options->channel,composite_options->compose,
+                  status&=CompositeImage(*image,composite_options->compose,
                     composite_image,x,y);
               GetImageException(*image,exception);
             }
@@ -213,12 +213,12 @@
               /*
                 Digitally composite image.
               */
-              status&=CompositeImageChannel(*image,composite_options->channel,
-                composite_options->compose,composite_image,geometry.x,
-                geometry.y);
+              status&=CompositeImage(*image,composite_options->compose,
+                composite_image,geometry.x,geometry.y);
               GetImageException(*image,exception);
             }
     }
+  PopPixelComponentMap(composite_image);
   return(status != 0 ? MagickTrue : MagickFalse);
 }
 
diff --git a/MagickWand/magick-image.c b/MagickWand/magick-image.c
index 09449d9..7cb7d4c 100644
--- a/MagickWand/magick-image.c
+++ b/MagickWand/magick-image.c
@@ -178,35 +178,20 @@
 %
 %      MagickBooleanType MagickAdaptiveBlurImage(MagickWand *wand,
 %        const double radius,const double sigma)
-%      MagickBooleanType MagickAdaptiveBlurImageChannel(MagickWand *wand,
-%        const ChannelType channel,const double radius,const double sigma)
 %
 %  A description of each parameter follows:
 %
 %    o wand: the magick wand.
 %
-%    o channel: the image channel(s).
-%
 %    o radius: the radius of the Gaussian, in pixels, not counting the center
 %      pixel.
 %
 %    o sigma: the standard deviation of the Gaussian, in pixels.
 %
 */
-
 WandExport MagickBooleanType MagickAdaptiveBlurImage(MagickWand *wand,
   const double radius,const double sigma)
 {
-  MagickBooleanType
-    status;
-
-  status=MagickAdaptiveBlurImageChannel(wand,DefaultChannels,radius,sigma);
-  return(status);
-}
-
-WandExport MagickBooleanType MagickAdaptiveBlurImageChannel(MagickWand *wand,
-  const ChannelType channel,const double radius,const double sigma)
-{
   Image
     *sharp_image;
 
@@ -216,8 +201,7 @@
     (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
   if (wand->images == (Image *) NULL)
     ThrowWandException(WandError,"ContainsNoImages",wand->name);
-  sharp_image=AdaptiveBlurImageChannel(wand->images,channel,radius,sigma,
-    wand->exception);
+  sharp_image=AdaptiveBlurImage(wand->images,radius,sigma,wand->exception);
   if (sharp_image == (Image *) NULL)
     return(MagickFalse);
   ReplaceImageInList(&wand->images,sharp_image);
@@ -291,35 +275,20 @@
 %
 %      MagickBooleanType MagickAdaptiveSharpenImage(MagickWand *wand,
 %        const double radius,const double sigma)
-%      MagickBooleanType MagickAdaptiveSharpenImageChannel(MagickWand *wand,
-%        const ChannelType channel,const double radius,const double sigma)
 %
 %  A description of each parameter follows:
 %
 %    o wand: the magick wand.
 %
-%    o channel: the image channel(s).
-%
 %    o radius: the radius of the Gaussian, in pixels, not counting the center
 %      pixel.
 %
 %    o sigma: the standard deviation of the Gaussian, in pixels.
 %
 */
-
 WandExport MagickBooleanType MagickAdaptiveSharpenImage(MagickWand *wand,
   const double radius,const double sigma)
 {
-  MagickBooleanType
-    status;
-
-  status=MagickAdaptiveSharpenImageChannel(wand,DefaultChannels,radius,sigma);
-  return(status);
-}
-
-WandExport MagickBooleanType MagickAdaptiveSharpenImageChannel(MagickWand *wand,
-  const ChannelType channel,const double radius,const double sigma)
-{
   Image
     *sharp_image;
 
@@ -329,8 +298,7 @@
     (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
   if (wand->images == (Image *) NULL)
     ThrowWandException(WandError,"ContainsNoImages",wand->name);
-  sharp_image=AdaptiveSharpenImageChannel(wand->images,channel,radius,sigma,
-    wand->exception);
+  sharp_image=AdaptiveSharpenImage(wand->images,radius,sigma,wand->exception);
   if (sharp_image == (Image *) NULL)
     return(MagickFalse);
   ReplaceImageInList(&wand->images,sharp_image);
@@ -854,7 +822,7 @@
     QuantumFormat "," QuantumFormat "," QuantumFormat "," QuantumFormat,
     PixelGetRedQuantum(threshold),PixelGetGreenQuantum(threshold),
     PixelGetBlueQuantum(threshold),PixelGetOpacityQuantum(threshold));
-  status=BlackThresholdImage(wand->images,thresholds);
+  status=BlackThresholdImage(wand->images,thresholds,&wand->images->exception);
   if (status == MagickFalse)
     InheritException(wand->exception,&wand->images->exception);
   return(status);
@@ -925,35 +893,20 @@
 %
 %      MagickBooleanType MagickBlurImage(MagickWand *wand,const double radius,
 %        const double sigma)
-%      MagickBooleanType MagickBlurImageChannel(MagickWand *wand,
-%        const ChannelType channel,const double radius,const double sigma)
 %
 %  A description of each parameter follows:
 %
 %    o wand: the magick wand.
 %
-%    o channel: the image channel(s).
-%
 %    o radius: the radius of the , in pixels, not counting the center
 %      pixel.
 %
 %    o sigma: the standard deviation of the , in pixels.
 %
 */
-
 WandExport MagickBooleanType MagickBlurImage(MagickWand *wand,
   const double radius,const double sigma)
 {
-  MagickBooleanType
-    status;
-
-  status=MagickBlurImageChannel(wand,DefaultChannels,radius,sigma);
-  return(status);
-}
-
-WandExport MagickBooleanType MagickBlurImageChannel(MagickWand *wand,
-  const ChannelType channel,const double radius,const double sigma)
-{
   Image
     *blur_image;
 
@@ -963,8 +916,7 @@
     (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
   if (wand->images == (Image *) NULL)
     ThrowWandException(WandError,"ContainsNoImages",wand->name);
-  blur_image=BlurImageChannel(wand->images,channel,radius,sigma,
-    wand->exception);
+  blur_image=BlurImage(wand->images,radius,sigma,wand->exception);
   if (blur_image == (Image *) NULL)
     return(MagickFalse);
   ReplaceImageInList(&wand->images,blur_image);
@@ -1202,8 +1154,6 @@
 %  The format of the MagickClampImage method is:
 %
 %      MagickBooleanType MagickClampImage(MagickWand *wand)
-%      MagickBooleanType MagickClampImageChannel(MagickWand *wand,
-%        const ChannelType channel)
 %
 %  A description of each parameter follows:
 %
@@ -1212,29 +1162,18 @@
 %    o channel: the channel.
 %
 */
-
 WandExport MagickBooleanType MagickClampImage(MagickWand *wand)
 {
   MagickBooleanType
     status;
 
-  status=MagickClampImageChannel(wand,DefaultChannels);
-  return(status);
-}
-
-WandExport MagickBooleanType MagickClampImageChannel(MagickWand *wand,
-  const ChannelType channel)
-{
-  MagickBooleanType
-    status;
-
   assert(wand != (MagickWand *) NULL);
   assert(wand->signature == WandSignature);
   if (wand->debug != MagickFalse)
     (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
   if (wand->images == (Image *) NULL)
     ThrowWandException(WandError,"ContainsNoImages",wand->name);
-  status=ClampImageChannel(wand->images,channel);
+  status=ClampImage(wand->images);
   if (status == MagickFalse)
     InheritException(wand->exception,&wand->images->exception);
   return(status);
@@ -1794,9 +1733,6 @@
 %      MagickBooleanType MagickCompositeImage(MagickWand *wand,
 %        const MagickWand *composite_wand,const CompositeOperator compose,
 %        const ssize_t x,const ssize_t y)
-%      MagickBooleanType MagickCompositeImageChannel(MagickWand *wand,
-%        const ChannelType channel,const MagickWand *composite_wand,
-%        const CompositeOperator compose,const ssize_t x,const ssize_t y)
 %
 %  A description of each parameter follows:
 %
@@ -1818,22 +1754,9 @@
 %    o y: the row offset of the composited image.
 %
 */
-
 WandExport MagickBooleanType MagickCompositeImage(MagickWand *wand,
-  const MagickWand *composite_wand,const CompositeOperator compose,const ssize_t x,
-  const ssize_t y)
-{
-  MagickBooleanType
-    status;
-
-  status=MagickCompositeImageChannel(wand,DefaultChannels,composite_wand,
-    compose,x,y);
-  return(status);
-}
-
-WandExport MagickBooleanType MagickCompositeImageChannel(MagickWand *wand,
-  const ChannelType channel,const MagickWand *composite_wand,
-  const CompositeOperator compose,const ssize_t x,const ssize_t y)
+  const MagickWand *composite_wand,const CompositeOperator compose,
+  const ssize_t x,const ssize_t y)
 {
   MagickBooleanType
     status;
@@ -1845,8 +1768,7 @@
   if ((wand->images == (Image *) NULL) ||
       (composite_wand->images == (Image *) NULL))
     ThrowWandException(WandError,"ContainsNoImages",wand->name);
-  status=CompositeImageChannel(wand->images,channel,compose,
-    composite_wand->images,x,y);
+  status=CompositeImage(wand->images,compose,composite_wand->images,x,y);
   if (status == MagickFalse)
     InheritException(wand->exception,&wand->images->exception);
   return(status);
@@ -1963,35 +1885,19 @@
 %
 %      MagickBooleanType MagickConvolveImage(MagickWand *wand,
 %        const size_t order,const double *kernel)
-%      MagickBooleanType MagickConvolveImageChannel(MagickWand *wand,
-%        const ChannelType channel,const size_t order,
-%        const double *kernel)
 %
 %  A description of each parameter follows:
 %
 %    o wand: the magick wand.
 %
-%    o channel: the image channel(s).
-%
 %    o order: the number of columns and rows in the filter kernel.
 %
 %    o kernel: An array of doubles representing the convolution kernel.
 %
 */
-
 WandExport MagickBooleanType MagickConvolveImage(MagickWand *wand,
   const size_t order,const double *kernel)
 {
-  MagickBooleanType
-    status;
-
-  status=MagickConvolveImageChannel(wand,DefaultChannels,order,kernel);
-  return(status);
-}
-
-WandExport MagickBooleanType MagickConvolveImageChannel(MagickWand *wand,
-  const ChannelType channel,const size_t order,const double *kernel)
-{
   Image
     *convolve_image;
 
@@ -2003,8 +1909,7 @@
     return(MagickFalse);
   if (wand->images == (Image *) NULL)
     ThrowWandException(WandError,"ContainsNoImages",wand->name);
-  convolve_image=ConvolveImageChannel(wand->images,channel,order,kernel,
-    wand->exception);
+  convolve_image=ConvolveImage(wand->images,order,kernel,wand->exception);
   if (convolve_image == (Image *) NULL)
     return(MagickFalse);
   ReplaceImageInList(&wand->images,convolve_image);
@@ -3041,32 +2946,17 @@
 %
 %      MagickBooleanType MagickFilterImage(MagickWand *wand,
 %        const KernelInfo *kernel)
-%      MagickBooleanType MagickFilterImageChannel(MagickWand *wand,
-%        const ChannelType channel,const KernelInfo *kernel)
 %
 %  A description of each parameter follows:
 %
 %    o wand: the magick wand.
 %
-%    o channel: the image channel(s).
-%
 %    o kernel: An array of doubles representing the convolution kernel.
 %
 */
-
 WandExport MagickBooleanType MagickFilterImage(MagickWand *wand,
   const KernelInfo *kernel)
 {
-  MagickBooleanType
-    status;
-
-  status=MagickFilterImageChannel(wand,DefaultChannels,kernel);
-  return(status);
-}
-
-WandExport MagickBooleanType MagickFilterImageChannel(MagickWand *wand,
-  const ChannelType channel,const KernelInfo *kernel)
-{
   Image
     *filter_image;
 
@@ -3078,7 +2968,7 @@
     return(MagickFalse);
   if (wand->images == (Image *) NULL)
     ThrowWandException(WandError,"ContainsNoImages",wand->name);
-  filter_image=FilterImageChannel(wand->images,channel,kernel,wand->exception);
+  filter_image=FilterImage(wand->images,kernel,wand->exception);
   if (filter_image == (Image *) NULL)
     return(MagickFalse);
   ReplaceImageInList(&wand->images,filter_image);
@@ -3520,35 +3410,20 @@
 %
 %      MagickBooleanType MagickGaussianBlurImage(MagickWand *wand,
 %        const double radius,const double sigma)
-%      MagickBooleanType MagickGaussianBlurImageChannel(MagickWand *wand,
-%        const ChannelType channel,const double radius,const double sigma)
 %
 %  A description of each parameter follows:
 %
 %    o wand: the magick wand.
 %
-%    o channel: the image channel(s).
-%
 %    o radius: the radius of the Gaussian, in pixels, not counting the center
 %      pixel.
 %
 %    o sigma: the standard deviation of the Gaussian, in pixels.
 %
 */
-
 WandExport MagickBooleanType MagickGaussianBlurImage(MagickWand *wand,
   const double radius,const double sigma)
 {
-  MagickBooleanType
-    status;
-
-  status=MagickGaussianBlurImageChannel(wand,DefaultChannels,radius,sigma);
-  return(status);
-}
-
-WandExport MagickBooleanType MagickGaussianBlurImageChannel(MagickWand *wand,
-  const ChannelType channel,const double radius,const double sigma)
-{
   Image
     *blur_image;
 
@@ -3558,8 +3433,7 @@
     (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
   if (wand->images == (Image *) NULL)
     ThrowWandException(WandError,"ContainsNoImages",wand->name);
-  blur_image=GaussianBlurImageChannel(wand->images,channel,radius,sigma,
-    wand->exception);
+  blur_image=GaussianBlurImage(wand->images,radius,sigma,wand->exception);
   if (blur_image == (Image *) NULL)
     return(MagickFalse);
   ReplaceImageInList(&wand->images,blur_image);
@@ -6715,16 +6589,11 @@
 %
 %      MagickBooleanType MagickMorphologyImage(MagickWand *wand,
 %        MorphologyMethod method,const ssize_t iterations,KernelInfo *kernel)
-%      MagickBooleanType MagickMorphologyImageChannel(MagickWand *wand,
-%        ChannelType channel,MorphologyMethod method,const ssize_t iterations,
-%        KernelInfo *kernel)
 %
 %  A description of each parameter follows:
 %
 %    o wand: the magick wand.
 %
-%    o channel: the image channel(s).
-%
 %    o method: the morphology method to be applied.
 %
 %    o iterations: apply the operation this many times (or no change).
@@ -6734,22 +6603,9 @@
 %    o kernel: An array of doubles representing the morphology kernel.
 %
 */
-
 WandExport MagickBooleanType MagickMorphologyImage(MagickWand *wand,
   MorphologyMethod method,const ssize_t iterations,KernelInfo *kernel)
 {
-  MagickBooleanType
-    status;
-
-  status=MagickMorphologyImageChannel(wand,DefaultChannels,method,iterations,
-    kernel);
-  return(status);
-}
-
-WandExport MagickBooleanType MagickMorphologyImageChannel(MagickWand *wand,
-  const ChannelType channel,MorphologyMethod method,const ssize_t iterations,
-  KernelInfo *kernel)
-{
   Image
     *morphology_image;
 
@@ -6761,8 +6617,8 @@
     return(MagickFalse);
   if (wand->images == (Image *) NULL)
     ThrowWandException(WandError,"ContainsNoImages",wand->name);
-  morphology_image=MorphologyImageChannel(wand->images,channel,method,
-    iterations,kernel,wand->exception);
+  morphology_image=MorphologyImage(wand->images,method,iterations,kernel,
+    wand->exception);
   if (morphology_image == (Image *) NULL)
     return(MagickFalse);
   ReplaceImageInList(&wand->images,morphology_image);
@@ -6790,16 +6646,11 @@
 %
 %      MagickBooleanType MagickMotionBlurImage(MagickWand *wand,
 %        const double radius,const double sigma,const double angle)
-%      MagickBooleanType MagickMotionBlurImageChannel(MagickWand *wand,
-%        const ChannelType channel,const double radius,const double sigma,
-%        const double angle)
 %
 %  A description of each parameter follows:
 %
 %    o wand: the magick wand.
 %
-%    o channel: the image channel(s).
-%
 %    o radius: the radius of the Gaussian, in pixels, not counting
 %      the center pixel.
 %
@@ -6808,21 +6659,9 @@
 %    o angle: Apply the effect along this angle.
 %
 */
-
 WandExport MagickBooleanType MagickMotionBlurImage(MagickWand *wand,
   const double radius,const double sigma,const double angle)
 {
-  MagickBooleanType
-    status;
-
-  status=MagickMotionBlurImageChannel(wand,DefaultChannels,radius,sigma,angle);
-  return(status);
-}
-
-WandExport MagickBooleanType MagickMotionBlurImageChannel(MagickWand *wand,
-  const ChannelType channel,const double radius,const double sigma,
-  const double angle)
-{
   Image
     *blur_image;
 
@@ -6832,8 +6671,7 @@
     (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
   if (wand->images == (Image *) NULL)
     ThrowWandException(WandError,"ContainsNoImages",wand->name);
-  blur_image=MotionBlurImageChannel(wand->images,channel,radius,sigma,angle,
-    wand->exception);
+  blur_image=MotionBlurImage(wand->images,radius,sigma,angle,wand->exception);
   if (blur_image == (Image *) NULL)
     return(MagickFalse);
   ReplaceImageInList(&wand->images,blur_image);
@@ -7758,31 +7596,17 @@
 %
 %      MagickBooleanType MagickRadialBlurImage(MagickWand *wand,
 %        const double angle)
-%      MagickBooleanType MagickRadialBlurImageChannel(MagickWand *wand,
-%        const ChannelType channel,const double angle)
 %
 %  A description of each parameter follows:
 %
 %    o wand: the magick wand.
 %
-%    o channel: the image channel(s).
-%
 %    o angle: the angle of the blur in degrees.
 %
 */
 WandExport MagickBooleanType MagickRadialBlurImage(MagickWand *wand,
   const double angle)
 {
-  MagickBooleanType
-    status;
-
-  status=MagickRadialBlurImageChannel(wand,DefaultChannels,angle);
-  return(status);
-}
-
-WandExport MagickBooleanType MagickRadialBlurImageChannel(MagickWand *wand,
-  const ChannelType channel,const double angle)
-{
   Image
     *blur_image;
 
@@ -7792,8 +7616,7 @@
     (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
   if (wand->images == (Image *) NULL)
     ThrowWandException(WandError,"ContainsNoImages",wand->name);
-  blur_image=RadialBlurImageChannel(wand->images,channel,angle,
-    wand->exception);
+  blur_image=RadialBlurImage(wand->images,angle,wand->exception);
   if (blur_image == (Image *) NULL)
     return(MagickFalse);
   ReplaceImageInList(&wand->images,blur_image);
@@ -7877,34 +7700,18 @@
 %
 %      MagickBooleanType MagickRandomThresholdImage(MagickWand *wand,
 %        const double low,const double high)
-%      MagickBooleanType MagickRandomThresholdImageChannel(MagickWand *wand,
-%        const ChannelType channel,const double low,const double high)
 %
 %  A description of each parameter follows:
 %
 %    o wand: the magick wand.
 %
-%    o channel: the image channel(s).
-%
 %    o low,high: Specify the high and low thresholds.  These values range from
 %      0 to QuantumRange.
 %
 */
-
 WandExport MagickBooleanType MagickRandomThresholdImage(MagickWand *wand,
   const double low,const double high)
 {
-  MagickBooleanType
-    status;
-
-  status=MagickRandomThresholdImageChannel(wand,DefaultChannels,low,high);
-  return(status);
-}
-
-WandExport MagickBooleanType MagickRandomThresholdImageChannel(
-  MagickWand *wand,const ChannelType channel,const double low,
-  const double high)
-{
   char
     threshold[MaxTextExtent];
 
@@ -7918,8 +7725,7 @@
   if (wand->images == (Image *) NULL)
     ThrowWandException(WandError,"ContainsNoImages",wand->name);
   (void) FormatLocaleString(threshold,MaxTextExtent,"%gx%g",low,high);
-  status=RandomThresholdImageChannel(wand->images,channel,threshold,
-    wand->exception);
+  status=RandomThresholdImage(wand->images,threshold,wand->exception);
   if (status == MagickFalse)
     InheritException(wand->exception,&wand->images->exception);
   return(status);
@@ -8598,16 +8404,11 @@
 %
 %      MagickBooleanType MagickSelectiveBlurImage(MagickWand *wand,
 %        const double radius,const double sigma,const double threshold)
-%      MagickBooleanType MagickSelectiveBlurImageChannel(MagickWand *wand,
-%        const ChannelType channel,const double radius,const double sigma,
-%        const double threshold)
 %
 %  A description of each parameter follows:
 %
 %    o wand: the magick wand.
 %
-%    o channel: the image channel(s).
-%
 %    o radius: the radius of the gaussian, in pixels, not counting the center
 %      pixel.
 %
@@ -8617,22 +8418,9 @@
 %      in the blur operation.
 %
 */
-
 WandExport MagickBooleanType MagickSelectiveBlurImage(MagickWand *wand,
   const double radius,const double sigma,const double threshold)
 {
-  MagickBooleanType
-    status;
-
-  status=MagickSelectiveBlurImageChannel(wand,DefaultChannels,radius,sigma,
-    threshold);
-  return(status);
-}
-
-WandExport MagickBooleanType MagickSelectiveBlurImageChannel(MagickWand *wand,
-  const ChannelType channel,const double radius,const double sigma,
-  const double threshold)
-{
   Image
     *blur_image;
 
@@ -8642,8 +8430,8 @@
     (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
   if (wand->images == (Image *) NULL)
     ThrowWandException(WandError,"ContainsNoImages",wand->name);
-  blur_image=SelectiveBlurImageChannel(wand->images,channel,radius,sigma,
-    threshold,wand->exception);
+  blur_image=SelectiveBlurImage(wand->images,radius,sigma,threshold,
+    wand->exception);
   if (blur_image == (Image *) NULL)
     return(MagickFalse);
   ReplaceImageInList(&wand->images,blur_image);
@@ -10531,35 +10319,20 @@
 %
 %      MagickBooleanType MagickSharpenImage(MagickWand *wand,
 %        const double radius,const double sigma)
-%      MagickBooleanType MagickSharpenImageChannel(MagickWand *wand,
-%        const ChannelType channel,const double radius,const double sigma)
 %
 %  A description of each parameter follows:
 %
 %    o wand: the magick wand.
 %
-%    o channel: the image channel(s).
-%
 %    o radius: the radius of the Gaussian, in pixels, not counting the center
 %      pixel.
 %
 %    o sigma: the standard deviation of the Gaussian, in pixels.
 %
 */
-
 WandExport MagickBooleanType MagickSharpenImage(MagickWand *wand,
   const double radius,const double sigma)
 {
-  MagickBooleanType
-    status;
-
-  status=MagickSharpenImageChannel(wand,DefaultChannels,radius,sigma);
-  return(status);
-}
-
-WandExport MagickBooleanType MagickSharpenImageChannel(MagickWand *wand,
-  const ChannelType channel,const double radius,const double sigma)
-{
   Image
     *sharp_image;
 
@@ -10569,8 +10342,7 @@
     (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
   if (wand->images == (Image *) NULL)
     ThrowWandException(WandError,"ContainsNoImages",wand->name);
-  sharp_image=SharpenImageChannel(wand->images,channel,radius,sigma,
-    wand->exception);
+  sharp_image=SharpenImage(wand->images,radius,sigma,wand->exception);
   if (sharp_image == (Image *) NULL)
     return(MagickFalse);
   ReplaceImageInList(&wand->images,sharp_image);
@@ -11139,16 +10911,11 @@
 %
 %      MagickBooleanType MagickStatisticImage(MagickWand *wand,
 %        const StatisticType type,const double width,const size_t height)
-%      MagickBooleanType MagickStatisticImageChannel(MagickWand *wand,
-%        const ChannelType channel,const StatisticType type,const double width,
-%        const size_t height)
 %
 %  A description of each parameter follows:
 %
 %    o wand: the magick wand.
 %
-%    o channel: the image channel(s).
-%
 %    o type: the statistic type (e.g. median, mode, etc.).
 %
 %    o width: the width of the pixel neighborhood.
@@ -11157,8 +10924,7 @@
 %
 */
 WandExport MagickBooleanType MagickStatisticImage(MagickWand *wand,
-  const ChannelType channel,const StatisticType type,const size_t width,
-  const size_t height)
+  const StatisticType type,const size_t width,const size_t height)
 {
   Image
     *statistic_image;
@@ -11169,7 +10935,7 @@
     (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
   if (wand->images == (Image *) NULL)
     ThrowWandException(WandError,"ContainsNoImages",wand->name);
-  statistic_image=StatisticImageChannel(wand->images,channel,type,width,height,
+  statistic_image=StatisticImage(wand->images,type,width,height,
     wand->exception);
   if (statistic_image == (Image *) NULL)
     return(MagickFalse);
@@ -11477,7 +11243,7 @@
     (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
   if (wand->images == (Image *) NULL)
     ThrowWandException(WandError,"ContainsNoImages",wand->name);
-  status=BilevelImageChannel(wand->images,channel,threshold);
+  status=BilevelImage(wand->images,threshold);
   if (status == MagickFalse)
     InheritException(wand->exception,&wand->images->exception);
   return(status);
@@ -11950,16 +11716,11 @@
 %      MagickBooleanType MagickUnsharpMaskImage(MagickWand *wand,
 %        const double radius,const double sigma,const double amount,
 %        const double threshold)
-%      MagickBooleanType MagickUnsharpMaskImageChannel(MagickWand *wand,
-%        const ChannelType channel,const double radius,const double sigma,
-%        const double amount,const double threshold)
 %
 %  A description of each parameter follows:
 %
 %    o wand: the magick wand.
 %
-%    o channel: the image channel(s).
-%
 %    o radius: the radius of the Gaussian, in pixels, not counting the center
 %      pixel.
 %
@@ -11971,23 +11732,10 @@
 %    o threshold: the threshold in pixels needed to apply the diffence amount.
 %
 */
-
 WandExport MagickBooleanType MagickUnsharpMaskImage(MagickWand *wand,
   const double radius,const double sigma,const double amount,
   const double threshold)
 {
-  MagickBooleanType
-    status;
-
-  status=MagickUnsharpMaskImageChannel(wand,DefaultChannels,radius,sigma,
-    amount,threshold);
-  return(status);
-}
-
-WandExport MagickBooleanType MagickUnsharpMaskImageChannel(MagickWand *wand,
-  const ChannelType channel,const double radius,const double sigma,
-  const double amount,const double threshold)
-{
   Image
     *unsharp_image;
 
@@ -11997,8 +11745,8 @@
     (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
   if (wand->images == (Image *) NULL)
     ThrowWandException(WandError,"ContainsNoImages",wand->name);
-  unsharp_image=UnsharpMaskImageChannel(wand->images,channel,radius,sigma,
-    amount,threshold,wand->exception);
+  unsharp_image=UnsharpMaskImage(wand->images,radius,sigma,amount,threshold,
+    wand->exception);
   if (unsharp_image == (Image *) NULL)
     return(MagickFalse);
   ReplaceImageInList(&wand->images,unsharp_image);
@@ -12148,7 +11896,7 @@
     QuantumFormat "," QuantumFormat "," QuantumFormat "," QuantumFormat,
     PixelGetRedQuantum(threshold),PixelGetGreenQuantum(threshold),
     PixelGetBlueQuantum(threshold),PixelGetOpacityQuantum(threshold));
-  status=WhiteThresholdImage(wand->images,thresholds);
+  status=WhiteThresholdImage(wand->images,thresholds,&wand->images->exception);
   if (status == MagickFalse)
     InheritException(wand->exception,&wand->images->exception);
   return(status);
diff --git a/MagickWand/magick-image.h b/MagickWand/magick-image.h
index 58ad340..c853ed7 100644
--- a/MagickWand/magick-image.h
+++ b/MagickWand/magick-image.h
@@ -72,12 +72,8 @@
 
 extern WandExport MagickBooleanType
   MagickAdaptiveBlurImage(MagickWand *,const double,const double),
-  MagickAdaptiveBlurImageChannel(MagickWand *,const ChannelType,const double,
-    const double),
   MagickAdaptiveResizeImage(MagickWand *,const size_t,const size_t),
   MagickAdaptiveSharpenImage(MagickWand *,const double,const double),
-  MagickAdaptiveSharpenImageChannel(MagickWand *,const ChannelType,const double,
-    const double),
   MagickAdaptiveThresholdImage(MagickWand *,const size_t,const size_t,
     const ssize_t),
   MagickAddImage(MagickWand *,const MagickWand *),
@@ -91,15 +87,12 @@
   MagickBlackThresholdImage(MagickWand *,const PixelWand *),
   MagickBlueShiftImage(MagickWand *,const double),
   MagickBlurImage(MagickWand *,const double,const double),
-  MagickBlurImageChannel(MagickWand *,const ChannelType,const double,
-    const double),
   MagickBorderImage(MagickWand *,const PixelWand *,const size_t,const size_t),
   MagickBrightnessContrastImage(MagickWand *,const double,const double),
   MagickCharcoalImage(MagickWand *,const double,const double),
   MagickChopImage(MagickWand *,const size_t,const size_t,const ssize_t,
     const ssize_t),
   MagickClampImage(MagickWand *),
-  MagickClampImageChannel(MagickWand *,const ChannelType),
   MagickClipImage(MagickWand *),
   MagickClipImagePath(MagickWand *,const char *,const MagickBooleanType),
   MagickClutImage(MagickWand *,const MagickWand *),
@@ -109,14 +102,11 @@
   MagickCommentImage(MagickWand *,const char *),
   MagickCompositeImage(MagickWand *,const MagickWand *,const CompositeOperator,
     const ssize_t,const ssize_t),
-  MagickCompositeImageChannel(MagickWand *,const ChannelType,const MagickWand *,    const CompositeOperator,const ssize_t,const ssize_t),
   MagickConstituteImage(MagickWand *,const size_t,const size_t,const char *,
     const StorageType,const void *),
   MagickContrastImage(MagickWand *,const MagickBooleanType),
   MagickContrastStretchImage(MagickWand *,const double,const double),
   MagickConvolveImage(MagickWand *,const size_t,const double *),
-  MagickConvolveImageChannel(MagickWand *,const ChannelType,const size_t,
-    const double *),
   MagickCropImage(MagickWand *,const size_t,const size_t,const ssize_t,
     const ssize_t),
   MagickCycleColormapImage(MagickWand *,const ssize_t),
@@ -139,7 +129,6 @@
   MagickExtentImage(MagickWand *,const size_t,const size_t,const ssize_t,
     const ssize_t),
   MagickFilterImage(MagickWand *,const KernelInfo *),
-  MagickFilterImageChannel(MagickWand *,const ChannelType,const KernelInfo *),
   MagickFlipImage(MagickWand *),
   MagickFloodfillPaintImage(MagickWand *,const PixelWand *,const double,
     const PixelWand *,const ssize_t,const ssize_t,const MagickBooleanType),
@@ -151,8 +140,6 @@
     const double *),
   MagickGammaImage(MagickWand *,const double),
   MagickGaussianBlurImage(MagickWand *,const double,const double),
-  MagickGaussianBlurImageChannel(MagickWand *,const ChannelType,const double,
-    const double),
   MagickGetImageAlphaChannel(MagickWand *),
   MagickGetImageBackgroundColor(MagickWand *,PixelWand *),
   MagickGetImageBluePrimary(MagickWand *,double *,double *),
@@ -194,11 +181,7 @@
   MagickModulateImage(MagickWand *,const double,const double,const double),
   MagickMorphologyImage(MagickWand *,MorphologyMethod,const ssize_t,
     KernelInfo *),
-  MagickMorphologyImageChannel(MagickWand *,const ChannelType,MorphologyMethod,
-    const ssize_t,KernelInfo *),
   MagickMotionBlurImage(MagickWand *,const double,const double,const double),
-  MagickMotionBlurImageChannel(MagickWand *,const ChannelType,const double,
-    const double,const double),
   MagickNegateImage(MagickWand *,const MagickBooleanType),
   MagickNewImage(MagickWand *,const size_t,const size_t,const PixelWand *),
   MagickNextImage(MagickWand *),
@@ -220,12 +203,9 @@
   MagickQuantizeImages(MagickWand *,const size_t,const ColorspaceType,
     const size_t,const MagickBooleanType,const MagickBooleanType),
   MagickRadialBlurImage(MagickWand *,const double),
-  MagickRadialBlurImageChannel(MagickWand *,const ChannelType,const double),
   MagickRaiseImage(MagickWand *,const size_t,const size_t,const ssize_t,
     const ssize_t,const MagickBooleanType),
   MagickRandomThresholdImage(MagickWand *,const double,const double),
-  MagickRandomThresholdImageChannel(MagickWand *,const ChannelType,const double,
-    const double),
   MagickReadImage(MagickWand *,const char *),
   MagickReadImageBlob(MagickWand *,const void *,const size_t),
   MagickReadImageFile(MagickWand *,FILE *),
@@ -244,8 +224,6 @@
   MagickSegmentImage(MagickWand *,const ColorspaceType,const MagickBooleanType,
     const double,const double),
   MagickSelectiveBlurImage(MagickWand *,const double,const double,const double),
-  MagickSelectiveBlurImageChannel(MagickWand *,const ChannelType,const double,
-    const double,const double),
   MagickSeparateImage(MagickWand *),
   MagickSepiaToneImage(MagickWand *,const double),
   MagickSetImage(MagickWand *,const MagickWand *),
@@ -294,8 +272,6 @@
   MagickShadowImage(MagickWand *,const double,const double,const ssize_t,
     const ssize_t),
   MagickSharpenImage(MagickWand *,const double,const double),
-  MagickSharpenImageChannel(MagickWand *,const ChannelType,const double,
-    const double),
   MagickShaveImage(MagickWand *,const size_t,const size_t),
   MagickShearImage(MagickWand *,const PixelWand *,const double,const double),
   MagickSigmoidalContrastImage(MagickWand *,const MagickBooleanType,
@@ -307,9 +283,7 @@
   MagickSpliceImage(MagickWand *,const size_t,const size_t,const ssize_t,
     const ssize_t),
   MagickSpreadImage(MagickWand *,const double),
-  MagickStatisticImage(MagickWand *,const ChannelType,const StatisticType,
-    const size_t,const size_t),
-  MagickStatisticImageChannel(MagickWand *,const StatisticType,const size_t,
+  MagickStatisticImage(MagickWand *,const StatisticType,const size_t,
     const size_t),
   MagickStripImage(MagickWand *),
   MagickSwirlImage(MagickWand *,const double),
@@ -324,8 +298,6 @@
   MagickUniqueImageColors(MagickWand *),
   MagickUnsharpMaskImage(MagickWand *,const double,const double,const double,
     const double),
-  MagickUnsharpMaskImageChannel(MagickWand *,const ChannelType,const double,
-    const double,const double,const double),
   MagickVignetteImage(MagickWand *,const double,const double,const ssize_t,
     const ssize_t),
   MagickWaveImage(MagickWand *,const double,const double),
diff --git a/MagickWand/mogrify.c b/MagickWand/mogrify.c
index ae5533d..5c83795 100644
--- a/MagickWand/mogrify.c
+++ b/MagickWand/mogrify.c
@@ -695,8 +695,8 @@
             flags=ParseGeometry(argv[i+1],&geometry_info);
             if ((flags & SigmaValue) == 0)
               geometry_info.sigma=1.0;
-            mogrify_image=AdaptiveBlurImageChannel(*image,channel,
-              geometry_info.rho,geometry_info.sigma,exception);
+            mogrify_image=AdaptiveBlurImage(*image,geometry_info.rho,
+              geometry_info.sigma,exception);
             break;
           }
         if (LocaleCompare("adaptive-resize",option+1) == 0)
@@ -719,8 +719,8 @@
             flags=ParseGeometry(argv[i+1],&geometry_info);
             if ((flags & SigmaValue) == 0)
               geometry_info.sigma=1.0;
-            mogrify_image=AdaptiveSharpenImageChannel(*image,channel,
-              geometry_info.rho,geometry_info.sigma,exception);
+            mogrify_image=AdaptiveSharpenImage(*image,geometry_info.rho,
+              geometry_info.sigma,exception);
             break;
           }
         if (LocaleCompare("affine",option+1) == 0)
@@ -866,8 +866,7 @@
               Black threshold image.
             */
             (void) SyncImageSettings(mogrify_info,*image);
-            (void) BlackThresholdImageChannel(*image,channel,argv[i+1],
-              exception);
+            (void) BlackThresholdImage(*image,argv[i+1],exception);
             InheritException(exception,&(*image)->exception);
             break;
           }
@@ -892,7 +891,7 @@
             flags=ParseGeometry(argv[i+1],&geometry_info);
             if ((flags & SigmaValue) == 0)
               geometry_info.sigma=1.0;
-            mogrify_image=BlurImageChannel(*image,channel,geometry_info.rho,
+            mogrify_image=BlurImage(*image,geometry_info.rho,
               geometry_info.sigma,exception);
             break;
           }
@@ -1009,7 +1008,7 @@
               Clamp image.
             */
             (void) SyncImageSettings(mogrify_info,*image);
-            (void) ClampImageChannel(*image,channel);
+            (void) ClampImage(*image);
             InheritException(exception,&(*image)->exception);
             break;
           }
@@ -1211,7 +1210,7 @@
             gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
             for (j=0; j < (ssize_t) (kernel->width*kernel->height); j++)
               kernel->values[j]*=gamma;
-            mogrify_image=FilterImageChannel(*image,channel,kernel,exception);
+            mogrify_image=FilterImage(*image,kernel,exception);
             kernel=DestroyKernelInfo(kernel);
             break;
           }
@@ -1727,8 +1726,8 @@
             flags=ParseGeometry(argv[i+1],&geometry_info);
             if ((flags & SigmaValue) == 0)
               geometry_info.sigma=1.0;
-            mogrify_image=GaussianBlurImageChannel(*image,channel,
-              geometry_info.rho,geometry_info.sigma,exception);
+            mogrify_image=GaussianBlurImage(*image,geometry_info.rho,
+              geometry_info.sigma,exception);
             break;
           }
         if (LocaleCompare("geometry",option+1) == 0)
@@ -2042,8 +2041,8 @@
             */
             (void) SyncImageSettings(mogrify_info,*image);
             (void) ParseGeometry(argv[i+1],&geometry_info);
-            mogrify_image=StatisticImageChannel(*image,channel,MedianStatistic,
-              (size_t) geometry_info.rho,(size_t) geometry_info.rho,exception);
+            mogrify_image=StatisticImage(*image,MedianStatistic,(size_t)
+              geometry_info.rho,(size_t) geometry_info.rho,exception);
             break;
           }
         if (LocaleCompare("mode",option+1) == 0)
@@ -2053,8 +2052,8 @@
             */
             (void) SyncImageSettings(mogrify_info,*image);
             (void) ParseGeometry(argv[i+1],&geometry_info);
-            mogrify_image=StatisticImageChannel(*image,channel,ModeStatistic,
-              (size_t) geometry_info.rho,(size_t) geometry_info.rho,exception);
+            mogrify_image=StatisticImage(*image,ModeStatistic,(size_t)
+              geometry_info.rho,(size_t) geometry_info.rho,exception);
             break;
           }
         if (LocaleCompare("modulate",option+1) == 0)
@@ -2122,8 +2121,8 @@
                 status=MagickFalse;
                 break;
               }
-            mogrify_image=MorphologyImageChannel(*image,channel,method,
-              iterations,kernel,exception);
+            mogrify_image=MorphologyImage(*image,method,iterations,kernel,
+              exception);
             kernel=DestroyKernelInfo(kernel);
             break;
           }
@@ -2136,8 +2135,8 @@
             flags=ParseGeometry(argv[i+1],&geometry_info);
             if ((flags & SigmaValue) == 0)
               geometry_info.sigma=1.0;
-            mogrify_image=MotionBlurImageChannel(*image,channel,
-              geometry_info.rho,geometry_info.sigma,geometry_info.xi,exception);
+            mogrify_image=MotionBlurImage(*image,geometry_info.rho,
+              geometry_info.sigma,geometry_info.xi,exception);
             break;
           }
         break;
@@ -2158,9 +2157,8 @@
             if (*option == '-')
               {
                 (void) ParseGeometry(argv[i+1],&geometry_info);
-                mogrify_image=StatisticImageChannel(*image,channel,
-                  NonpeakStatistic,(size_t) geometry_info.rho,(size_t)
-                  geometry_info.rho,exception);
+                mogrify_image=StatisticImage(*image,NonpeakStatistic,(size_t)
+                  geometry_info.rho,(size_t) geometry_info.rho,exception);
               }
             else
               {
@@ -2374,8 +2372,8 @@
               Radial blur image.
             */
             (void) SyncImageSettings(mogrify_info,*image);
-            mogrify_image=RadialBlurImageChannel(*image,channel,
-              InterpretLocaleValue(argv[i+1],(char **) NULL),exception);
+            mogrify_image=RadialBlurImage(*image,InterpretLocaleValue(argv[i+1],
+              (char **) NULL),exception);
             break;
           }
         if (LocaleCompare("raise",option+1) == 0)
@@ -2397,8 +2395,7 @@
               Threshold image.
             */
             (void) SyncImageSettings(mogrify_info,*image);
-            (void) RandomThresholdImageChannel(*image,channel,argv[i+1],
-              exception);
+            (void) RandomThresholdImage(*image,argv[i+1],exception);
             break;
           }
         if (LocaleCompare("recolor",option+1) == 0)
@@ -2423,8 +2420,8 @@
                   Composite region.
                 */
                 (void) CompositeImage(region_image,region_image->matte !=
-                     MagickFalse ? CopyCompositeOp : OverCompositeOp,*image,
-                     region_geometry.x,region_geometry.y);
+                   MagickFalse ? CopyCompositeOp : OverCompositeOp,*image,
+                   region_geometry.x,region_geometry.y);
                 InheritException(exception,&region_image->exception);
                 *image=DestroyImage(*image);
                 *image=region_image;
@@ -2576,8 +2573,8 @@
             flags=ParseGeometry(argv[i+1],&geometry_info);
             if ((flags & PercentValue) != 0)
               geometry_info.xi=(double) QuantumRange*geometry_info.xi/100.0;
-            mogrify_image=SelectiveBlurImageChannel(*image,channel,
-              geometry_info.rho,geometry_info.sigma,geometry_info.xi,exception);
+            mogrify_image=SelectiveBlurImage(*image,geometry_info.rho,
+              geometry_info.sigma,geometry_info.xi,exception);
             break;
           }
         if (LocaleCompare("separate",option+1) == 0)
@@ -2696,7 +2693,7 @@
             flags=ParseGeometry(argv[i+1],&geometry_info);
             if ((flags & SigmaValue) == 0)
               geometry_info.sigma=1.0;
-            mogrify_image=SharpenImageChannel(*image,channel,geometry_info.rho,
+            mogrify_image=SharpenImage(*image,geometry_info.rho,
               geometry_info.sigma,exception);
             break;
           }
@@ -2816,8 +2813,8 @@
             type=(StatisticType) ParseCommandOption(MagickStatisticOptions,
               MagickFalse,argv[i+1]);
             (void) ParseGeometry(argv[i+2],&geometry_info);
-            mogrify_image=StatisticImageChannel(*image,channel,type,(size_t)
-              geometry_info.rho,(size_t) geometry_info.sigma,exception);
+            mogrify_image=StatisticImage(*image,type,(size_t) geometry_info.rho,
+              (size_t) geometry_info.sigma,exception);
             break;
           }
         if (LocaleCompare("stretch",option+1) == 0)
@@ -2906,7 +2903,7 @@
               threshold=(double) QuantumRange/2;
             else
               threshold=SiPrefixToDouble(argv[i+1],QuantumRange);
-            (void) BilevelImageChannel(*image,channel,threshold);
+            (void) BilevelImage(*image,threshold);
             InheritException(exception,&(*image)->exception);
             break;
           }
@@ -3055,9 +3052,8 @@
               geometry_info.xi=1.0;
             if ((flags & PsiValue) == 0)
               geometry_info.psi=0.05;
-            mogrify_image=UnsharpMaskImageChannel(*image,channel,
-              geometry_info.rho,geometry_info.sigma,geometry_info.xi,
-              geometry_info.psi,exception);
+            mogrify_image=UnsharpMaskImage(*image,geometry_info.rho,
+              geometry_info.sigma,geometry_info.xi,geometry_info.psi,exception);
             break;
           }
         break;
@@ -3141,8 +3137,7 @@
               White threshold image.
             */
             (void) SyncImageSettings(mogrify_info,*image);
-            (void) WhiteThresholdImageChannel(*image,channel,argv[i+1],
-              exception);
+            (void) WhiteThresholdImage(*image,argv[i+1],exception);
             InheritException(exception,&(*image)->exception);
             break;
           }
@@ -3165,8 +3160,8 @@
       */
       (void) SyncImageSettings(mogrify_info,*image);
       (void) CompositeImage(region_image,region_image->matte !=
-           MagickFalse ? CopyCompositeOp : OverCompositeOp,*image,
-           region_geometry.x,region_geometry.y);
+         MagickFalse ? CopyCompositeOp : OverCompositeOp,*image,
+         region_geometry.x,region_geometry.y);
       InheritException(exception,&region_image->exception);
       *image=DestroyImage(*image);
       *image=region_image;
@@ -7231,9 +7226,6 @@
 WandExport MagickBooleanType MogrifyImageList(ImageInfo *image_info,
   const int argc,const char **argv,Image **images,ExceptionInfo *exception)
 {
-  ChannelType
-    channel;
-
   const char
     *option;
 
@@ -7268,7 +7260,6 @@
     return(MagickTrue);
   mogrify_info=CloneImageInfo(image_info);
   quantize_info=AcquireQuantizeInfo(mogrify_info);
-  channel=mogrify_info->channel;
   status=MagickTrue;
   for (i=0; i < (ssize_t) argc; i++)
   {
@@ -7341,12 +7332,16 @@
       {
         if (LocaleCompare("channel",option+1) == 0)
           {
+            ChannelType
+              channel;
+
             if (*option == '+')
               {
                 channel=DefaultChannels;
                 break;
               }
             channel=(ChannelType) ParseChannelOption(argv[i+1]);
+            SetPixelComponentMap(*images,channel);
             break;
           }
         if (LocaleCompare("clut",option+1) == 0)
@@ -7449,8 +7444,8 @@
                     (void) NegateImage(image->mask,MagickFalse);
                   }
               }
-            (void) CompositeImageChannel(image,channel,image->compose,
-              composite_image,geometry.x,geometry.y);
+            (void) CompositeImage(image,image->compose,composite_image,
+              geometry.x,geometry.y);
             if (mask_image != (Image *) NULL)
               mask_image=image->mask=DestroyImage(image->mask);
             composite_image=DestroyImage(composite_image);
diff --git a/PerlMagick/Magick.xs b/PerlMagick/Magick.xs
index b434871..ba81692 100644
--- a/PerlMagick/Magick.xs
+++ b/PerlMagick/Magick.xs
@@ -7558,8 +7558,10 @@
             geometry_info.sigma=argument_list[2].real_reference;
           if (attribute_flag[3] != 0)
             channel=(ChannelType) argument_list[3].integer_reference;
-          image=BlurImageChannel(image,channel,geometry_info.rho,
-            geometry_info.sigma,exception);
+          PushPixelComponentMap(image,channel);
+          image=BlurImage(image,geometry_info.rho,geometry_info.sigma,
+            exception);
+          PopPixelComponentMap(image);
           break;
         }
         case 7:  /* Chop */
@@ -7715,8 +7717,10 @@
             geometry_info.sigma=argument_list[2].real_reference;
           if (attribute_flag[3] != 0)
             channel=(ChannelType) argument_list[3].integer_reference;
-          image=StatisticImageChannel(image,channel,MedianStatistic,
-            (size_t) geometry_info.rho,(size_t) geometry_info.sigma,exception);
+          PushPixelComponentMap(image,channel);
+          image=StatisticImage(image,MedianStatistic,(size_t) geometry_info.rho,
+            (size_t) geometry_info.sigma,exception);
+          PopPixelComponentMap(image);
           break;
         }
         case 19:  /* Minify */
@@ -7747,8 +7751,10 @@
             geometry_info.sigma=argument_list[2].real_reference;
           if (attribute_flag[3] != 0)
             channel=(ChannelType) argument_list[3].integer_reference;
-          image=StatisticImageChannel(image,channel,NonpeakStatistic,
-            (size_t) geometry_info.rho,(size_t) geometry_info.sigma,exception);
+          PushPixelComponentMap(image,channel);
+          image=StatisticImage(image,NonpeakStatistic,(size_t)
+            geometry_info.rho,(size_t) geometry_info.sigma,exception);
+          PopPixelComponentMap(image);
           break;
         }
         case 22:  /* Roll */
@@ -7836,8 +7842,10 @@
             geometry_info.sigma=argument_list[2].real_reference;
           if (attribute_flag[3] != 0)
             channel=(ChannelType) argument_list[3].integer_reference;
-          image=SharpenImageChannel(image,channel,geometry_info.rho,
-            geometry_info.sigma,exception);
+          PushPixelComponentMap(image,channel);
+          image=SharpenImage(image,geometry_info.rho,geometry_info.sigma,
+            exception);
+          PopPixelComponentMap(image);
           break;
         }
         case 28:  /* Shear */
@@ -8343,9 +8351,9 @@
             geometry.y);
           flags=ParseGravityGeometry(image,composite_geometry,&geometry,
             exception);
+          PushPixelComponentMap(image,channel);
           if (attribute_flag[8] == 0) /* no rotate */
-            CompositeImageChannel(image,channel,compose,composite_image,
-              geometry.x,geometry.y);
+            CompositeImage(image,compose,composite_image,geometry.x,geometry.y);
           else
             {
               /*
@@ -8355,8 +8363,7 @@
                 composite_image->columns)/2;
               geometry.y-=(ssize_t) (rotate_image->rows-
                 composite_image->rows)/2;
-              CompositeImageChannel(image,channel,compose,rotate_image,
-                geometry.x,geometry.y);
+              CompositeImage(image,compose,rotate_image,geometry.x,geometry.y);
               rotate_image=DestroyImage(rotate_image);
             }
           if (attribute_flag[10] != 0) /* mask */
@@ -8367,6 +8374,7 @@
               else
                 image->mask=DestroyImage(image->mask);
             }
+          PopPixelComponentMap(image);
           break;
         }
         case 36:  /* Contrast */
@@ -8998,7 +9006,9 @@
             channel=(ChannelType) argument_list[1].integer_reference;
           threshold=SiPrefixToDouble(argument_list[0].string_reference,
             QuantumRange);
-          (void) BilevelImageChannel(image,channel,threshold);
+          PushPixelComponentMap(image,channel);
+          (void) BilevelImage(image,threshold);
+          PopPixelComponentMap(image);
           break;
         }
         case 58:  /* Charcoal */
@@ -9105,8 +9115,10 @@
             geometry_info.sigma=argument_list[2].real_reference;
           if (attribute_flag[3] != 0)
             channel=(ChannelType) argument_list[3].integer_reference;
-          image=GaussianBlurImageChannel(image,channel,geometry_info.rho,
-            geometry_info.sigma,exception);
+          PushPixelComponentMap(image,channel);
+          image=GaussianBlurImage(image,geometry_info.rho,geometry_info.sigma,
+            exception);
+          PopPixelComponentMap(image);
           break;
         }
         case 67:  /* Convolve */
@@ -9140,7 +9152,9 @@
             kernel[j]=(double) SvNV(*(av_fetch(av,j,0)));
           for ( ; j < (ssize_t) (order*order); j++)
             kernel[j]=0.0;
-          image=ConvolveImageChannel(image,channel,order,kernel,exception);
+          PushPixelComponentMap(image,channel);
+          image=ConvolveImage(image,order,kernel,exception);
+          PopPixelComponentMap(image);
           kernel=(double *) RelinquishMagickMemory(kernel);
           break;
         }
@@ -9238,8 +9252,10 @@
             geometry_info.psi=argument_list[4].real_reference;
           if (attribute_flag[5] != 0)
             channel=(ChannelType) argument_list[5].integer_reference;
-          image=UnsharpMaskImageChannel(image,channel,geometry_info.rho,
-            geometry_info.sigma,geometry_info.xi,geometry_info.psi,exception);
+          PushPixelComponentMap(image,channel);
+          image=UnsharpMaskImage(image,geometry_info.rho,geometry_info.sigma,
+            geometry_info.xi,geometry_info.psi,exception);
+          PopPixelComponentMap(image);
           break;
         }
         case 70:  /* MotionBlur */
@@ -9261,8 +9277,10 @@
             geometry_info.xi=argument_list[3].real_reference;
           if (attribute_flag[4] != 0)
             channel=(ChannelType) argument_list[4].integer_reference;
-          image=MotionBlurImageChannel(image,channel,geometry_info.rho,
-            geometry_info.sigma,geometry_info.xi,exception);
+          PushPixelComponentMap(image,channel);
+          image=MotionBlurImage(image,geometry_info.rho,geometry_info.sigma,
+            geometry_info.xi,exception);
+          PopPixelComponentMap(image);
           break;
         }
         case 71:  /* OrderedDither */
@@ -9552,8 +9570,10 @@
             argument_list[0].string_reference="50%";
           if (attribute_flag[2] != 0)
             channel=(ChannelType) argument_list[2].integer_reference;
-          BlackThresholdImageChannel(image,channel,
-            argument_list[0].string_reference,exception);
+          PushPixelComponentMap(image,channel);
+          BlackThresholdImage(image,argument_list[0].string_reference,
+            exception);
+          PopPixelComponentMap(image);
           break;
         }
         case 81:  /* WhiteThreshold */
@@ -9562,8 +9582,10 @@
             argument_list[0].string_reference="50%";
           if (attribute_flag[2] != 0)
             channel=(ChannelType) argument_list[2].integer_reference;
-          WhiteThresholdImageChannel(image,channel,
-            argument_list[0].string_reference,exception);
+          PushPixelComponentMap(image,channel);
+          WhiteThresholdImage(image,argument_list[0].string_reference,
+            exception);
+          PopPixelComponentMap(image);
           break;
         }
         case 82:  /* RadialBlur */
@@ -9579,8 +9601,9 @@
             geometry_info.rho=argument_list[1].real_reference;
           if (attribute_flag[2] != 0)
             channel=(ChannelType) argument_list[2].integer_reference;
-          image=RadialBlurImageChannel(image,channel,geometry_info.rho,
-            exception);
+          PushPixelComponentMap(image,channel);
+          image=RadialBlurImage(image,geometry_info.rho,exception);
+          PopPixelComponentMap(image);
           break;
         }
         case 83:  /* Thumbnail */
@@ -9856,8 +9879,10 @@
             geometry_info.sigma=argument_list[2].real_reference;
           if (attribute_flag[3] != 0)
             channel=(ChannelType) argument_list[3].integer_reference;
-          image=AdaptiveSharpenImageChannel(image,channel,geometry_info.rho,
+          PushPixelComponentMap(image,channel);
+          image=AdaptiveSharpenImage(image,geometry_info.rho,
             geometry_info.sigma,exception);
+          PopPixelComponentMap(image);
           break;
         }
         case 99:  /* Transpose */
@@ -9929,8 +9954,10 @@
             geometry_info.sigma=argument_list[2].real_reference;
           if (attribute_flag[3] != 0)
             channel=(ChannelType) argument_list[3].integer_reference;
-          image=AdaptiveBlurImageChannel(image,channel,geometry_info.rho,
-            geometry_info.sigma,exception);
+          PushPixelComponentMap(image,channel);
+          image=AdaptiveBlurImage(image,geometry_info.rho,geometry_info.sigma,
+            exception);
+          PopPixelComponentMap(image);
           break;
         }
         case 103:  /* Sketch */
@@ -10353,8 +10380,10 @@
             geometry_info.xi=argument_list[3].integer_reference;;
           if (attribute_flag[4] != 0)
             channel=(ChannelType) argument_list[4].integer_reference;
-          image=SelectiveBlurImageChannel(image,channel,geometry_info.rho,
-            geometry_info.sigma,geometry_info.xi,exception);
+          PushPixelComponentMap(image,channel);
+          image=SelectiveBlurImage(image,geometry_info.rho,geometry_info.sigma,
+            geometry_info.xi,exception);
+          PopPixelComponentMap(image);
           break;
         }
         case 122:  /* HaldClut */
@@ -10446,7 +10475,9 @@
         {
           if (attribute_flag[0] != 0)
             channel=(ChannelType) argument_list[0].integer_reference;
-          (void) ClampImageChannel(image,channel);
+          PushPixelComponentMap(image,channel);
+          (void) ClampImage(image);
+          PopPixelComponentMap(image);
           break;
         }
         case 131:  /* Filter */
@@ -10464,7 +10495,9 @@
           if (attribute_flag[2] != 0)
             image->bias=SiPrefixToDouble(argument_list[2].string_reference,
               QuantumRange);
-          image=FilterImageChannel(image,channel,kernel,exception);
+          PushPixelComponentMap(image,channel);
+          image=FilterImage(image,kernel,exception);
+          PopPixelComponentMap(image);
           kernel=DestroyKernelInfo(kernel);
           break;
         }
@@ -10519,8 +10552,9 @@
           iterations=1;
           if (attribute_flag[3] != 0)
             iterations=argument_list[4].integer_reference;
-          image=MorphologyImageChannel(image,channel,method,iterations,kernel,
-            exception);
+          PushPixelComponentMap(image,channel);
+          image=MorphologyImage(image,method,iterations,kernel,exception);
+          PopPixelComponentMap(image);
           kernel=DestroyKernelInfo(kernel);
           break;
         }
@@ -10594,8 +10628,10 @@
             geometry_info.sigma=argument_list[2].real_reference;
           if (attribute_flag[3] != 0)
             channel=(ChannelType) argument_list[3].integer_reference;
-          image=StatisticImageChannel(image,channel,ModeStatistic,
-            (size_t) geometry_info.rho,(size_t) geometry_info.sigma,exception);
+          PushPixelComponentMap(image,channel);
+          image=StatisticImage(image,ModeStatistic,(size_t) geometry_info.rho,
+            (size_t) geometry_info.sigma,exception);
+          PopPixelComponentMap(image);
           break;
         }
         case 137:  /* Statistic */
@@ -10619,8 +10655,10 @@
             channel=(ChannelType) argument_list[3].integer_reference;
           if (attribute_flag[4] != 0)
             statistic=(StatisticType) argument_list[4].integer_reference;
-          image=StatisticImageChannel(image,channel,statistic,
-            (size_t) geometry_info.rho,(size_t) geometry_info.sigma,exception);
+          PushPixelComponentMap(image,channel);
+          image=StatisticImage(image,statistic,(size_t) geometry_info.rho,
+            (size_t) geometry_info.sigma,exception);
+          PopPixelComponentMap(image);
           break;
         }
       }
@@ -10630,7 +10668,7 @@
         {
           /*
             Composite region.
-          */
+          */ 
           status=CompositeImage(region_image,CopyCompositeOp,image,
             region_info.x,region_info.y);
           (void) status;
diff --git a/coders/msl.c b/coders/msl.c
index c10a29b..0e8ea07 100644
--- a/coders/msl.c
+++ b/coders/msl.c
@@ -1231,9 +1231,10 @@
                 }
               }
             }
-          blur_image=BlurImageChannel(msl_info->image[n],channel,
-            geometry_info.rho,geometry_info.sigma,
-            &msl_info->image[n]->exception);
+          PushPixelComponentMap(msl_info->image[n],channel);
+          blur_image=BlurImage(msl_info->image[n],geometry_info.rho,
+            geometry_info.sigma,&msl_info->image[n]->exception);
+          PopPixelComponentMap(msl_info->image[n]);
           if (blur_image == (Image *) NULL)
             break;
           msl_info->image[n]=DestroyImage(msl_info->image[n]);
@@ -2054,9 +2055,9 @@
             geometry.y);
           flags=ParseGravityGeometry(image,composite_geometry,&geometry,
             &exception);
+          PushPixelComponentMap(image,channel);
           if (rotate_image == (Image *) NULL)
-            CompositeImageChannel(image,channel,compose,composite_image,
-              geometry.x,geometry.y);
+            CompositeImage(image,compose,composite_image,geometry.x,geometry.y);
           else
             {
               /*
@@ -2065,10 +2066,10 @@
               geometry.x-=(ssize_t) (rotate_image->columns-
                 composite_image->columns)/2;
               geometry.y-=(ssize_t) (rotate_image->rows-composite_image->rows)/2;
-              CompositeImageChannel(image,channel,compose,rotate_image,
-                geometry.x,geometry.y);
+              CompositeImage(image,compose,rotate_image,geometry.x,geometry.y);
               rotate_image=DestroyImage(rotate_image);
             }
+          PopPixelComponentMap(image);
           composite_image=DestroyImage(composite_image);
           break;
         }
@@ -7070,9 +7071,7 @@
           process image.
         */
         {
-        BilevelImageChannel(msl_info->image[n],
-          (ChannelType) ((ssize_t) (CompositeChannels &~ (ssize_t) OpacityChannel)),
-          threshold);
+          BilevelImage(msl_info->image[n],threshold);
         break;
         }
       }
