public void saveNewCache() {
   if (CacheControl.cacheEnabled) {
     getCacheControl().deleteCacheFile();
     wmsLayer.imagesLock.lock();
     for (GeorefImage image : wmsLayer.getImages()) {
       getCacheControl().saveCache(image);
     }
     wmsLayer.imagesLock.unlock();
   }
 }
 @Override
 public void run() {
   for (; ; ) {
     while (getImagesToGrabSize() > 0) {
       lockImagesToGrag.lock();
       lockCurrentGrabImage.lock();
       currentGrabImage = imagesToGrab.get(0);
       lockCurrentGrabImage.unlock();
       imagesToGrab.remove(0);
       lockImagesToGrag.unlock();
       if (canceled) {
         break;
       } else {
         GeorefImage newImage;
         try {
           Main.map.repaint(); // paint the current grab box
           newImage = grabber.grab(wmsLayer, currentGrabImage.min, currentGrabImage.max);
         } catch (IOException e) {
           Main.warn("Download action canceled by user or server did not respond");
           setCanceled(true);
           break;
         } catch (OsmTransferException e) {
           Main.error("OSM transfer failed");
           setCanceled(true);
           break;
         }
         if (grabber.getWmsInterface().downloadCanceled) {
           Main.info("Download action canceled by user");
           setCanceled(true);
           break;
         }
         try {
           if (CadastrePlugin.backgroundTransparent) {
             wmsLayer.imagesLock.lock();
             for (GeorefImage img : wmsLayer.getImages()) {
               if (img.overlap(newImage))
                 // mask overlapping zone in already grabbed image
                 img.withdraw(newImage);
               else
                 // mask overlapping zone in new image only when new image covers completely the
                 // existing image
                 newImage.withdraw(img);
             }
             wmsLayer.imagesLock.unlock();
           }
           wmsLayer.addImage(newImage);
           Main.map.mapView.repaint();
           saveToCache(newImage);
         } catch (NullPointerException e) {
           Main.info("Layer destroyed. Cancel grab thread");
           setCanceled(true);
         }
       }
     }
     Main.info("grab thread list empty");
     lockCurrentGrabImage.lock();
     currentGrabImage = null;
     lockCurrentGrabImage.unlock();
     if (canceled) {
       clearImagesToGrab();
       canceled = false;
     }
     if (wmsLayer.isRaster()) {
       notifyWaiter();
     }
     waitNotification();
   }
 }