diff --git a/magick/cache.c b/magick/cache.c
index bf0cea8..66790ac 100644
--- a/magick/cache.c
+++ b/magick/cache.c
@@ -200,7 +200,6 @@
   cache_info->nexus_info=AcquirePixelCacheNexus(cache_info->number_threads);
   if (cache_info->nexus_info == (NexusInfo **) NULL)
     ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
-  GetPixelCacheMethods(&cache_info->methods);
   cache_info->semaphore=AllocateSemaphoreInfo();
   cache_info->reference_count=1;
   cache_info->disk_semaphore=AllocateSemaphoreInfo();
@@ -1409,9 +1408,12 @@
   assert(image->cache != (Cache) NULL);
   cache_info=(CacheInfo *) image->cache;
   assert(cache_info->signature == MagickSignature);
-  if (cache_info->methods.destroy_pixel_handler == (DestroyPixelHandler) NULL)
-    return;
-  cache_info->methods.destroy_pixel_handler(image);
+  if (cache_info->methods.destroy_pixel_handler != (DestroyPixelHandler) NULL)
+    {
+      cache_info->methods.destroy_pixel_handler(image);
+      return;
+    }
+  DestroyImagePixelCache(image);
 }
 
 /*
@@ -1655,10 +1657,10 @@
   assert(image->cache != (Cache) NULL);
   cache_info=(CacheInfo *) image->cache;
   assert(cache_info->signature == MagickSignature);
-  if (cache_info->methods.get_authentic_indexes_from_handler ==
+  if (cache_info->methods.get_authentic_indexes_from_handler !=
        (GetAuthenticIndexesFromHandler) NULL)
-    return((IndexPacket *) NULL);
-  return(cache_info->methods.get_authentic_indexes_from_handler(image));
+    return(cache_info->methods.get_authentic_indexes_from_handler(image));
+  return(GetAuthenticIndexesFromCache(image));
 }
 
 /*
@@ -1810,10 +1812,10 @@
   assert(image->cache != (Cache) NULL);
   cache_info=(CacheInfo *) image->cache;
   assert(cache_info->signature == MagickSignature);
-  if (cache_info->methods.get_authentic_pixels_from_handler ==
-      (GetAuthenticPixelsFromHandler) NULL)
-    return((PixelPacket *) NULL);
-  return(cache_info->methods.get_authentic_pixels_from_handler(image));
+  if (cache_info->methods.get_authentic_pixels_from_handler !=
+       (GetAuthenticPixelsFromHandler) NULL)
+    return(cache_info->methods.get_authentic_pixels_from_handler(image));
+  return(GetAuthenticPixelsFromCache(image));
 }
 
 /*
@@ -1869,20 +1871,16 @@
   CacheInfo
     *cache_info;
 
-  PixelPacket
-    *pixels;
-
   assert(image != (Image *) NULL);
   assert(image->signature == MagickSignature);
   assert(image->cache != (Cache) NULL);
   cache_info=(CacheInfo *) image->cache;
   assert(cache_info->signature == MagickSignature);
-  if (cache_info->methods.get_authentic_pixels_handler ==
-      (GetAuthenticPixelsHandler) NULL)
-    return((PixelPacket *) NULL);
-  pixels=cache_info->methods.get_authentic_pixels_handler(image,x,y,columns,
-    rows,exception);
-  return(pixels);
+  if (cache_info->methods.get_authentic_pixels_handler !=
+       (GetAuthenticPixelsHandler) NULL)
+    return(cache_info->methods.get_authentic_pixels_handler(image,x,y,columns,
+      rows,exception));
+  return(GetAuthenticPixelsCache(image,x,y,columns,rows,exception));
 }
 
 /*
@@ -2168,26 +2166,17 @@
   CacheInfo
     *cache_info;
 
-  GetOneAuthenticPixelFromHandler
-    get_one_authentic_pixel_from_handler;
-
-  MagickBooleanType
-    status;
-
   assert(image != (Image *) NULL);
   assert(image->signature == MagickSignature);
   assert(image->cache != (Cache) NULL);
   cache_info=(CacheInfo *) image->cache;
   assert(cache_info->signature == MagickSignature);
   *pixel=image->background_color;
-  get_one_authentic_pixel_from_handler=
-    cache_info->methods.get_one_authentic_pixel_from_handler;
-  if (get_one_authentic_pixel_from_handler ==
-      (GetOneAuthenticPixelFromHandler) NULL)
-    return(MagickFalse);
-  status=cache_info->methods.get_one_authentic_pixel_from_handler(image,x,y,
-    pixel,exception);
-  return(status);
+  if (cache_info->methods.get_one_authentic_pixel_from_handler !=
+       (GetOneAuthenticPixelFromHandler) NULL)
+    return(cache_info->methods.get_one_authentic_pixel_from_handler(image,x,y,
+      pixel,exception));
+  return(GetOneAuthenticPixelFromCache(image,x,y,pixel,exception));
 }
 
 /*
@@ -2334,29 +2323,21 @@
   const VirtualPixelMethod virtual_pixel_method,const ssize_t x,const ssize_t y,
   PixelPacket *pixel,ExceptionInfo *exception)
 {
-  GetOneVirtualPixelFromHandler
-    get_one_virtual_pixel_from_handler;
-
   CacheInfo
     *cache_info;
 
-  MagickBooleanType
-    status;
-
   assert(image != (const Image *) NULL);
   assert(image->signature == MagickSignature);
   assert(image->cache != (Cache) NULL);
   cache_info=(CacheInfo *) image->cache;
   assert(cache_info->signature == MagickSignature);
   *pixel=image->background_color;
-  get_one_virtual_pixel_from_handler=
-    cache_info->methods.get_one_virtual_pixel_from_handler;
-  if (get_one_virtual_pixel_from_handler ==
-      (GetOneVirtualPixelFromHandler) NULL)
-    return(MagickFalse);
-  status=get_one_virtual_pixel_from_handler(image,virtual_pixel_method,x,y,
-    pixel,exception);
-  return(status);
+  if (cache_info->methods.get_one_virtual_pixel_from_handler !=
+       (GetOneVirtualPixelFromHandler) NULL)
+    return(cache_info->methods.get_one_virtual_pixel_from_handler(image,
+      virtual_pixel_method,x,y,pixel,exception));
+  return(GetOneVirtualPixelFromCache(image,virtual_pixel_method,x,y,pixel,
+    exception));
 }
 
 /*
@@ -2393,29 +2374,21 @@
 MagickExport MagickBooleanType GetOneVirtualPixel(const Image *image,
   const ssize_t x,const ssize_t y,PixelPacket *pixel,ExceptionInfo *exception)
 {
-  GetOneVirtualPixelFromHandler
-    get_one_virtual_pixel_from_handler;
-
   CacheInfo
     *cache_info;
 
-  MagickBooleanType
-    status;
-
   assert(image != (const Image *) NULL);
   assert(image->signature == MagickSignature);
   assert(image->cache != (Cache) NULL);
   cache_info=(CacheInfo *) image->cache;
   assert(cache_info->signature == MagickSignature);
   *pixel=image->background_color;
-  get_one_virtual_pixel_from_handler=
-    cache_info->methods.get_one_virtual_pixel_from_handler;
-  if (get_one_virtual_pixel_from_handler ==
-      (GetOneVirtualPixelFromHandler) NULL)
-    return(MagickFalse);
-  status=get_one_virtual_pixel_from_handler(image,GetPixelCacheVirtualMethod(
-    image),x,y,pixel,exception);
-  return(status);
+  if (cache_info->methods.get_one_virtual_pixel_from_handler !=
+       (GetOneVirtualPixelFromHandler) NULL)
+    return(cache_info->methods.get_one_virtual_pixel_from_handler(image,
+      GetPixelCacheVirtualMethod(image),x,y,pixel,exception));
+  return(GetOneVirtualPixelFromCache(image,GetPixelCacheVirtualMethod(image),
+    x,y,pixel,exception));
 }
 
 /*
@@ -2982,10 +2955,10 @@
   assert(image->cache != (Cache) NULL);
   cache_info=(CacheInfo *) image->cache;
   assert(cache_info->signature == MagickSignature);
-  if (cache_info->methods.get_virtual_indexes_from_handler ==
-      (GetVirtualIndexesFromHandler) NULL)
-    return((IndexPacket *) NULL);
-  return(cache_info->methods.get_virtual_indexes_from_handler(image));
+  if (cache_info->methods.get_virtual_indexes_from_handler !=
+       (GetVirtualIndexesFromHandler) NULL)
+    return(cache_info->methods.get_virtual_indexes_from_handler(image));
+  return(GetVirtualIndexesFromCache(image));
 }
 
 /*
@@ -3484,7 +3457,7 @@
   const size_t columns,const size_t rows,ExceptionInfo *exception)
 {
   CacheInfo
-   *cache_info;
+    *cache_info;
 
   const int
     id = GetOpenMPThreadId();
@@ -3528,10 +3501,10 @@
   assert(image->cache != (Cache) NULL);
   cache_info=(CacheInfo *) image->cache;
   assert(cache_info->signature == MagickSignature);
-  if (cache_info->methods.get_virtual_pixels_handler ==
-      (GetVirtualPixelsHandler) NULL)
-    return((PixelPacket *) NULL);
-  return(cache_info->methods.get_virtual_pixels_handler(image));
+  if (cache_info->methods.get_virtual_pixels_handler !=
+       (GetVirtualPixelsHandler) NULL)
+    return(cache_info->methods.get_virtual_pixels_handler(image));
+  return(GetVirtualPixelsCache(image));
 }
 
 /*
@@ -3589,20 +3562,17 @@
   CacheInfo
     *cache_info;
 
-  const PixelPacket
-    *pixels;
-
   assert(image != (const Image *) NULL);
   assert(image->signature == MagickSignature);
   assert(image->cache != (Cache) NULL);
   cache_info=(CacheInfo *) image->cache;
   assert(cache_info->signature == MagickSignature);
-  if (cache_info->methods.get_virtual_pixel_handler ==
-      (GetVirtualPixelHandler) NULL)
-    return((const PixelPacket *) NULL);
-  pixels=cache_info->methods.get_virtual_pixel_handler(image,
-    GetPixelCacheVirtualMethod(image),x,y,columns,rows,exception);
-  return(pixels);
+  if (cache_info->methods.get_virtual_pixel_handler !=
+       (GetVirtualPixelHandler) NULL)
+    return(cache_info->methods.get_virtual_pixel_handler(image,
+      GetPixelCacheVirtualMethod(image),x,y,columns,rows,exception));
+  return(GetVirtualPixelCache(image,GetPixelCacheVirtualMethod(image),x,y,
+    columns,rows,exception));
 }
 
 /*
@@ -4429,20 +4399,16 @@
   CacheInfo
     *cache_info;
 
-  PixelPacket
-    *pixels;
-
   assert(image != (Image *) NULL);
   assert(image->signature == MagickSignature);
   assert(image->cache != (Cache) NULL);
   cache_info=(CacheInfo *) image->cache;
   assert(cache_info->signature == MagickSignature);
-  if (cache_info->methods.queue_authentic_pixels_handler ==
-      (QueueAuthenticPixelsHandler) NULL)
-    return((PixelPacket *) NULL);
-  pixels=cache_info->methods.queue_authentic_pixels_handler(image,x,y,columns,
-    rows,exception);
-  return(pixels);
+  if (cache_info->methods.queue_authentic_pixels_handler !=
+       (QueueAuthenticPixelsHandler) NULL)
+    return(cache_info->methods.queue_authentic_pixels_handler(image,x,y,columns,
+      rows,exception));
+  return(QueueAuthenticPixelsCache(image,x,y,columns,rows,exception));
 }
 
 /*
@@ -5164,10 +5130,10 @@
   assert(image->cache != (Cache) NULL);
   cache_info=(CacheInfo *) image->cache;
   assert(cache_info->signature == MagickSignature);
-  if (cache_info->methods.sync_authentic_pixels_handler ==
-      (SyncAuthenticPixelsHandler) NULL)
-    return(MagickFalse);
-  return(cache_info->methods.sync_authentic_pixels_handler(image,exception));
+  if (cache_info->methods.sync_authentic_pixels_handler !=
+       (SyncAuthenticPixelsHandler) NULL)
+    return(cache_info->methods.sync_authentic_pixels_handler(image,exception));
+  return(SyncAuthenticPixelsCache(image,exception));
 }
 
 /*