Index: /applications/editors/josm/plugins/print/build.xml
===================================================================
--- /applications/editors/josm/plugins/print/build.xml	(revision 32190)
+++ /applications/editors/josm/plugins/print/build.xml	(revision 32191)
@@ -5,5 +5,5 @@
     <property name="commit.message" value="Added a field to specify the map scale."/>
     <!-- enter the *lowest* JOSM version this plugin is currently compatible with -->
-    <property name="plugin.main.version" value="8554"/>
+    <property name="plugin.main.version" value="10282"/>
 
     <property name="plugin.author" value="Kai Pastor"/>
Index: /applications/editors/josm/plugins/print/src/org/openstreetmap/josm/plugins/print/PrintableLayerManager.java
===================================================================
--- /applications/editors/josm/plugins/print/src/org/openstreetmap/josm/plugins/print/PrintableLayerManager.java	(revision 32191)
+++ /applications/editors/josm/plugins/print/src/org/openstreetmap/josm/plugins/print/PrintableLayerManager.java	(revision 32191)
@@ -0,0 +1,126 @@
+package org.openstreetmap.josm.plugins.print;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.MainLayerManager;
+import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+
+public class PrintableLayerManager extends MainLayerManager {
+
+    private static final MainLayerManager layerManager = Main.getLayerManager();
+
+    @Override
+    public synchronized void addActiveLayerChangeListener(ActiveLayerChangeListener listener,
+            boolean initialFire) {
+        layerManager.addActiveLayerChangeListener(listener, initialFire);
+    }
+
+    @Override
+    public synchronized void removeActiveLayerChangeListener(ActiveLayerChangeListener listener) {
+        layerManager.removeActiveLayerChangeListener(listener);
+    }
+
+    @Override
+    public void setActiveLayer(Layer layer) {
+        layerManager.setActiveLayer(layer);
+    }
+
+    @Override
+    public synchronized Layer getActiveLayer() {
+        return layerManager.getActiveLayer();
+    }
+
+    @Override
+    public synchronized OsmDataLayer getEditLayer() {
+        return layerManager.getEditLayer();
+    }
+
+    @Override
+    public synchronized DataSet getEditDataSet() {
+        return layerManager.getEditDataSet();
+    }
+
+    @Override
+    public synchronized List<Layer> getVisibleLayersInZOrder() {
+        ArrayList<Layer> layers = new ArrayList<>();
+        for (Layer l: layerManager.getLayers()) {
+            if (l.isVisible()) {
+                layers.add(l);
+            }
+        }
+        Collections.sort(
+            layers,
+            new Comparator<Layer>() {
+                @Override
+                public int compare(Layer l2, Layer l1) { // l1 and l2 swapped!
+                    if (l1 instanceof OsmDataLayer && l2 instanceof OsmDataLayer) {
+                        if (l1 == layerManager.getActiveLayer()) return -1;
+                        if (l2 == layerManager.getActiveLayer()) return 1;
+                        return Integer.valueOf(layerManager.getLayers().indexOf(l1)).
+                                     compareTo(layerManager.getLayers().indexOf(l2));
+                    } else
+                        return Integer.valueOf(layerManager.getLayers().indexOf(l1)).
+                                     compareTo(layerManager.getLayers().indexOf(l2));
+                }
+            }
+        );
+        return layers;
+    }
+
+    @Override
+    public void addLayer(Layer layer) {
+        layerManager.addLayer(layer);
+    }
+
+    @Override
+    public void removeLayer(Layer layer) {
+        layerManager.removeLayer(layer);
+    }
+
+    @Override
+    public void moveLayer(Layer layer, int position) {
+        layerManager.moveLayer(layer, position);
+    }
+
+    @Override
+    public List<Layer> getLayers() {
+        return layerManager.getLayers();
+    }
+
+    @Override
+    public <T extends Layer> List<T> getLayersOfType(Class<T> ofType) {
+        return layerManager.getLayersOfType(ofType);
+    }
+
+    @Override
+    public synchronized boolean containsLayer(Layer layer) {
+        return layerManager.containsLayer(layer);
+    }
+
+    @Override
+    public synchronized void addLayerChangeListener(LayerChangeListener listener) {
+        layerManager.addLayerChangeListener(listener);
+    }
+
+    @Override
+    public synchronized void addLayerChangeListener(LayerChangeListener listener, boolean fireAdd) {
+        layerManager.addLayerChangeListener(listener, fireAdd);
+    }
+
+    @Override
+    public synchronized void removeLayerChangeListener(LayerChangeListener listener) {
+        layerManager.removeLayerChangeListener(listener);
+    }
+
+    @Override
+    public synchronized void removeLayerChangeListener(LayerChangeListener listener,
+            boolean fireRemove) {
+        layerManager.removeLayerChangeListener(listener, fireRemove);
+    }
+}
Index: /applications/editors/josm/plugins/print/src/org/openstreetmap/josm/plugins/print/PrintableMapView.java
===================================================================
--- /applications/editors/josm/plugins/print/src/org/openstreetmap/josm/plugins/print/PrintableMapView.java	(revision 32190)
+++ /applications/editors/josm/plugins/print/src/org/openstreetmap/josm/plugins/print/PrintableMapView.java	(revision 32191)
@@ -34,4 +34,5 @@
 import java.awt.Graphics2D;
 import java.awt.Shape;
+import java.awt.event.ComponentListener;
 import java.awt.font.FontRenderContext;
 import java.awt.font.GlyphVector;
@@ -41,8 +42,4 @@
 import java.awt.print.Printable;
 import java.awt.print.PrinterException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
 
 import javax.swing.JPanel;
@@ -54,5 +51,4 @@
 import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.gui.layer.Layer;
-import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 
 /**
@@ -72,10 +68,5 @@
      * resolution
      */
-     protected double g2dFactor;
-    
-    /**
-     * The real MapView which is the data source
-     */
-    protected MapView mapView;
+    protected double g2dFactor;
     
     /**
@@ -89,14 +80,12 @@
     public PrintableMapView() {
         /* Initialize MapView with a dummy parent */
-        super(new JPanel(), null);
+        super(new PrintableLayerManager(), new JPanel(), null);
         
         /* Disable MapView's ComponentLister, 
          * as it will interfere with the main MapView. */
-        java.awt.event.ComponentListener listeners[] = getComponentListeners();
+        ComponentListener listeners[] = getComponentListeners();
         for (int i=0; i<listeners.length; i++) {
             removeComponentListener(listeners[i]);
         }
-        
-        mapView = Main.map.mapView;
     }
 
@@ -155,5 +144,5 @@
         if (dim.width != width || dim.height != height) {
             super.setSize(width, height);
-            zoomTo(mapView.getRealBounds());
+            zoomTo(Main.map.mapView.getRealBounds());
             rezoomToFixedScale();
         }
@@ -168,5 +157,5 @@
         if (dim.width != newSize.width || dim.height != newSize.height) {
             super.setSize(newSize);
-            zoomTo(mapView.getRealBounds());
+            zoomTo(Main.map.mapView.getRealBounds());
             rezoomToFixedScale();
         }
@@ -230,6 +219,5 @@
         
         Bounds box = getRealBounds();
-        List<Layer> visibleLayers = getVisibleLayersInZOrder();
-        for (Layer l : visibleLayers) {
+        for (Layer l : getLayerManager().getVisibleLayersInZOrder()) {
             if (l.getOpacity() < 1) {
                 g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,(float)l.getOpacity()));
@@ -357,6 +345,5 @@
      * Paint a text.
      * 
-     * This method will not only draw the letters but also a background 
-     * which improves redability.
+     * This method will not only draw the letters but also a background which improves redability.
      * 
      * @param g2d the graphics context to use for painting
@@ -365,74 +352,21 @@
      * @param y the y coordinate
      */
-    
     public void paintText(Graphics2D g2d, String text, int x, int y) {
-            AffineTransform ax = g2d.getTransform();
-            g2d.translate(x,y);
-
-            FontRenderContext frc = g2d.getFontRenderContext();
-            GlyphVector gv = g2d.getFont().createGlyphVector(frc, text);
-            Shape textOutline = gv.getOutline();
-
-            g2d.setStroke(new BasicStroke(1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND));
-            g2d.setColor(Color.WHITE);
-            g2d.draw(textOutline);
-            
-            g2d.setStroke(new BasicStroke());
-            g2d.setColor(Color.BLACK);
-            g2d.drawString(text, 0, 0);
-
-            g2d.setTransform(ax);
-    }
-
-    /**
-     * Get the active layer
-     * 
-     * This method is implemented in MapView but we need at this instance.
-     */
-    @Override
-    public Layer getActiveLayer() {
-        return mapView.getActiveLayer();
-    }
-
-    /**
-     * Get the position of a particular layer in the stack of layers
-     * 
-     * This method is implemented in MapView but we need at this instance.
-     */
-    @Override
-    public int getLayerPos(Layer layer) {
-        return mapView.getLayerPos(layer);
-    }
-    
-    /**
-     * This method is implemented in MapView but protected.
-     * 
-     * The algorithm is slightly modified.
-     */
-    @Override
-    public List<Layer> getVisibleLayersInZOrder() {
-        ArrayList<Layer> layers = new ArrayList<>();
-        for (Layer l: mapView.getAllLayersAsList()) {
-            if (l.isVisible()) {
-                layers.add(l);
-            }
-        }
-        Collections.sort(
-            layers,
-            new Comparator<Layer>() {
-                @Override
-                public int compare(Layer l2, Layer l1) { // l1 and l2 swapped!
-                    if (l1 instanceof OsmDataLayer && l2 instanceof OsmDataLayer) {
-                        if (l1 == getActiveLayer()) return -1;
-                        if (l2 == getActiveLayer()) return 1;
-                        return Integer.valueOf(getLayerPos(l1)).
-                                     compareTo(getLayerPos(l2));
-                    } else
-                        return Integer.valueOf(getLayerPos(l1)).
-                                     compareTo(getLayerPos(l2));
-                }
-            }
-        );
-        return layers;
+        AffineTransform ax = g2d.getTransform();
+        g2d.translate(x, y);
+
+        FontRenderContext frc = g2d.getFontRenderContext();
+        GlyphVector gv = g2d.getFont().createGlyphVector(frc, text);
+        Shape textOutline = gv.getOutline();
+
+        g2d.setStroke(new BasicStroke(1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND));
+        g2d.setColor(Color.WHITE);
+        g2d.draw(textOutline);
+
+        g2d.setStroke(new BasicStroke());
+        g2d.setColor(Color.BLACK);
+        g2d.drawString(text, 0, 0);
+
+        g2d.setTransform(ax);
     }
 }
