Index: trunk/src/org/openstreetmap/josm/gui/MapView.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MapView.java	(revision 8624)
+++ trunk/src/org/openstreetmap/josm/gui/MapView.java	(revision 8625)
@@ -1152,5 +1152,6 @@
         if (evt.getPropertyName().equals(Layer.VISIBLE_PROP)) {
             repaint();
-        } else if (evt.getPropertyName().equals(Layer.OPACITY_PROP)) {
+        } else if (evt.getPropertyName().equals(Layer.OPACITY_PROP) ||
+                evt.getPropertyName().equals(Layer.FILTER_STATE_PROP)) {
             Layer l = (Layer) evt.getSource();
             if (l.isVisible()) {
Index: trunk/src/org/openstreetmap/josm/gui/layer/AbstractTileSourceLayer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/AbstractTileSourceLayer.java	(revision 8624)
+++ trunk/src/org/openstreetmap/josm/gui/layer/AbstractTileSourceLayer.java	(revision 8625)
@@ -17,4 +17,5 @@
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
+import java.awt.image.BufferedImage;
 import java.awt.image.ImageObserver;
 import java.io.File;
@@ -1017,4 +1018,8 @@
                 continue;
             }
+
+            // applying all filters to this layer
+            img = applyImageProcessors((BufferedImage) img);
+
             Rectangle sourceRect = tileToRect(tile);
             if (borderRect != null && !sourceRect.intersects(borderRect)) {
Index: trunk/src/org/openstreetmap/josm/gui/layer/ImageProcessor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/ImageProcessor.java	(revision 8625)
+++ trunk/src/org/openstreetmap/josm/gui/layer/ImageProcessor.java	(revision 8625)
@@ -0,0 +1,25 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.layer;
+
+import java.awt.image.BufferedImage;
+
+/**
+ * Processor that modifies images (sharpen, brightness, etc.).
+ * This interface is used by {@link ImageryLayer}s to filter the
+ * displayed images (implemented in plugins).
+ *
+ * @author Nipel-Crumple
+ */
+public interface ImageProcessor {
+
+    /**
+     * This method should process given image according to image processors
+     * which is contained in the {@link Layer}
+     *
+     * @param image that should be processed
+     *
+     * @return processed image
+     */
+    public BufferedImage process(BufferedImage image);
+
+}
Index: trunk/src/org/openstreetmap/josm/gui/layer/ImageryLayer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/ImageryLayer.java	(revision 8624)
+++ trunk/src/org/openstreetmap/josm/gui/layer/ImageryLayer.java	(revision 8625)
@@ -22,4 +22,5 @@
 import java.text.AttributedCharacterIterator;
 import java.text.AttributedString;
+import java.util.ArrayList;
 import java.util.Hashtable;
 import java.util.List;
@@ -55,4 +56,6 @@
     public static final IntegerProperty PROP_FADE_AMOUNT = new IntegerProperty("imagery.fade_amount", 0);
     public static final IntegerProperty PROP_SHARPEN_LEVEL = new IntegerProperty("imagery.sharpen_level", 0);
+
+    private final List<ImageProcessor> imageProcessors = new ArrayList<>();
 
     public static Color getFadeColor() {
@@ -249,4 +252,49 @@
         BufferedImageOp op = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null);
         return op.filter(tmp, null);
+    }
+
+    /**
+     * This method adds the {@link ImageProcessor} to this Layer
+     *
+     * @param processor that processes the image
+     *
+     * @return true if processor was added, false otherwise
+     */
+    public boolean addImageProcessor(ImageProcessor processor) {
+        return imageProcessors.add(processor);
+    }
+
+    /**
+     * This method removes given {@link ImageProcessor} from this layer
+     *
+     * @param processor which is needed to be removed
+     *
+     * @return true if processor was removed
+     */
+    public boolean removeImageProcessor(ImageProcessor processor) {
+        return imageProcessors.remove(processor);
+    }
+
+    /**
+     * This method gets all {@link ImageProcessor}s of the layer
+     *
+     * @return list of image processors without removed one
+     */
+    public List<ImageProcessor> getImageProcessors() {
+        return imageProcessors;
+    }
+
+    /**
+     * Applies all the chosen {@link ImageProcessor}s to the image
+     *
+     * @param img - image which should be changed
+     *
+     * @return the new changed image
+     */
+    public BufferedImage applyImageProcessors(BufferedImage img) {
+        for (ImageProcessor processor : imageProcessors) {
+            img = processor.process(img);
+        }
+        return img;
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/layer/Layer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/Layer.java	(revision 8624)
+++ trunk/src/org/openstreetmap/josm/gui/layer/Layer.java	(revision 8625)
@@ -86,4 +86,5 @@
     public static final String OPACITY_PROP = Layer.class.getName() + ".opacity";
     public static final String NAME_PROP = Layer.class.getName() + ".name";
+    public static final String FILTER_STATE_PROP = Layer.class.getName() + ".filterstate";
 
     public static final int ICON_SIZE = 16;
@@ -314,4 +315,11 @@
 
     /**
+     * Sets new state to the layer after applying {@link ImageProcessor}.
+     */
+    public void setFilterStateChanged() {
+        fireFilterStateChanged();
+    }
+
+    /**
      * Toggles the visibility state of this layer.
      */
@@ -356,4 +364,11 @@
     protected void fireOpacityChanged(double oldValue, double newValue) {
         propertyChangeSupport.firePropertyChange(OPACITY_PROP, oldValue, newValue);
+    }
+
+    /**
+     * fires a property change for the property {@link #FILTER_STATE_PROP}.
+     */
+    protected void fireFilterStateChanged() {
+        propertyChangeSupport.firePropertyChange(FILTER_STATE_PROP, null, null);
     }
 
Index: trunk/src/org/openstreetmap/josm/io/session/SessionWriter.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/session/SessionWriter.java	(revision 8624)
+++ trunk/src/org/openstreetmap/josm/io/session/SessionWriter.java	(revision 8625)
@@ -64,5 +64,5 @@
      * Register a session layer exporter.
      *
-     * The exporter class must have an one-argument constructor with layerClass as formal parameter type.
+     * The exporter class must have a one-argument constructor with layerClass as formal parameter type.
      */
     public static void registerSessionLayerExporter(Class<? extends Layer> layerClass, Class<? extends SessionLayerExporter> exporter) {
@@ -93,5 +93,5 @@
      * Constructs a new {@code SessionWriter}.
      * @param layers The ordered list of layers to save
-     * @param active The index of active layer in {@code layers} (starts to 0). Ignored if set to -1
+     * @param active The index of active layer in {@code layers} (starts at 0). Ignored if set to -1
      * @param exporters The exporters to use to save layers
      * @param zip {@code true} if a joz archive has to be created, {@code false otherwise}
