Index: trunk/src/org/openstreetmap/josm/gui/layer/AbstractTileSourceLayer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/AbstractTileSourceLayer.java	(revision 8722)
+++ trunk/src/org/openstreetmap/josm/gui/layer/AbstractTileSourceLayer.java	(revision 8723)
@@ -208,7 +208,4 @@
             tile.setImage(null);
         }
-        if (sharpenLevel != 0 && success) {
-            tile.setImage(sharpenImage(tile.getImage()));
-        }
         tile.setLoaded(success);
         needRedraw = true;
Index: trunk/src/org/openstreetmap/josm/gui/layer/ImageryLayer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/ImageryLayer.java	(revision 8722)
+++ trunk/src/org/openstreetmap/josm/gui/layer/ImageryLayer.java	(revision 8723)
@@ -75,6 +75,4 @@
     protected double dy = 0.0;
 
-    protected int sharpenLevel;
-
     private final ImageryAdjustAction adjustAction = new ImageryAdjustAction(this);
 
@@ -93,5 +91,5 @@
             icon = ImageProvider.get("imagery_small");
         }
-        this.sharpenLevel = PROP_SHARPEN_LEVEL.get();
+        addImageProcessor(createSharpener(PROP_SHARPEN_LEVEL.get()));
     }
 
@@ -238,22 +236,19 @@
     }
 
-    public BufferedImage sharpenImage(BufferedImage img) {
-        if (sharpenLevel <= 0) return img;
-        int width = img.getWidth(null);
-        int height = img.getHeight(null);
-        BufferedImage tmp = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
-        tmp.getGraphics().drawImage(img, 0, 0, null);
-        Kernel kernel;
+    public ImageProcessor createSharpener(int sharpenLevel) {
+        final Kernel kernel;
         if (sharpenLevel == 1) {
-            kernel = new Kernel(3, 3, new float[] {-0.25f, -0.5f, -0.25f, -0.5f, 4, -0.5f, -0.25f, -0.5f, -0.25f});
+            kernel = new Kernel(3, 3, new float[]{-0.25f, -0.5f, -0.25f, -0.5f, 4, -0.5f, -0.25f, -0.5f, -0.25f});
+        } else if (sharpenLevel == 2) {
+            kernel = new Kernel(3, 3, new float[]{-0.5f, -1, -0.5f, -1, 7, -1, -0.5f, -1, -0.5f});
         } else {
-            kernel = new Kernel(3, 3, new float[] {-0.5f, -1, -0.5f, -1, 7, -1, -0.5f, -1, -0.5f});
+            return null;
         }
         BufferedImageOp op = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null);
-        return op.filter(tmp, null);
-    }
-
-    /**
-     * This method adds the {@link ImageProcessor} to this Layer
+        return createImageProcessor(op, false);
+    }
+
+    /**
+     * This method adds the {@link ImageProcessor} to this Layer if it is not {@code null}.
      *
      * @param processor that processes the image
@@ -262,5 +257,5 @@
      */
     public boolean addImageProcessor(ImageProcessor processor) {
-        return imageProcessors.add(processor);
+        return processor != null && imageProcessors.add(processor);
     }
 
@@ -274,4 +269,20 @@
     public boolean removeImageProcessor(ImageProcessor processor) {
         return imageProcessors.remove(processor);
+    }
+
+    /**
+     * Wraps a {@link BufferedImageOp} to be used as {@link ImageProcessor}.
+     * @param op the {@link BufferedImageOp}
+     * @param inPlace true to apply filter in place, i.e., not create a new {@link BufferedImage} for the result
+     *                (the {@code op} needs to support this!)
+     * @return the {@link ImageProcessor} wrapper
+     */
+    public static ImageProcessor createImageProcessor(final BufferedImageOp op, final boolean inPlace) {
+        return new ImageProcessor() {
+            @Override
+            public BufferedImage process(BufferedImage image) {
+                return op.filter(image, inPlace ? image : null);
+            }
+        };
     }
 
Index: trunk/src/org/openstreetmap/josm/tools/ImageOverlay.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/ImageOverlay.java	(revision 8722)
+++ trunk/src/org/openstreetmap/josm/tools/ImageOverlay.java	(revision 8723)
@@ -1,4 +1,6 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.tools;
+
+import org.openstreetmap.josm.gui.layer.ImageProcessor;
 
 import java.awt.Dimension;
@@ -10,5 +12,5 @@
  * @since 8095
  */
-public class ImageOverlay {
+public class ImageOverlay implements ImageProcessor {
     /** the image resource to use as overlay */
     public ImageProvider image;
@@ -65,5 +67,6 @@
      * @since 8095
      */
-    public BufferedImage apply(BufferedImage ground) {
+    @Override
+    public BufferedImage process(BufferedImage ground) {
         /* get base dimensions for calculation */
         int w = ground.getWidth();
Index: trunk/src/org/openstreetmap/josm/tools/ImageResource.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/ImageResource.java	(revision 8722)
+++ trunk/src/org/openstreetmap/josm/tools/ImageResource.java	(revision 8723)
@@ -115,5 +115,5 @@
             if (overlayInfo != null) {
                 for (ImageOverlay o : overlayInfo) {
-                    o.apply(bimg);
+                    o.process(bimg);
                 }
             }
@@ -139,5 +139,5 @@
             if (overlayInfo != null) {
                 for (ImageOverlay o : overlayInfo) {
-                    o.apply(bimg);
+                    o.process(bimg);
                 }
             }
