Index: /applications/editors/josm/plugins/buildings_tools/build.xml
===================================================================
--- /applications/editors/josm/plugins/buildings_tools/build.xml	(revision 33734)
+++ /applications/editors/josm/plugins/buildings_tools/build.xml	(revision 33735)
@@ -4,5 +4,5 @@
     <property name="commit.message" value="BuildingTools: Alt key to disable tags"/>
     <!-- enter the *lowest* JOSM version this plugin is currently compatible with -->
-    <property name="plugin.main.version" value="10580"/>
+    <property name="plugin.main.version" value="12987"/>
     
     <!-- Configure these properties (replace "..." accordingly).
Index: /applications/editors/josm/plugins/buildings_tools/src/buildings_tools/Building.java
===================================================================
--- /applications/editors/josm/plugins/buildings_tools/src/buildings_tools/Building.java	(revision 33734)
+++ /applications/editors/josm/plugins/buildings_tools/src/buildings_tools/Building.java	(revision 33735)
@@ -32,4 +32,5 @@
 import org.openstreetmap.josm.data.osm.RelationMember;
 import org.openstreetmap.josm.data.osm.Way;
+import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.MapView;
 
@@ -161,5 +162,5 @@
         updatePos();
 
-        Main.map.statusLine.setHeading(Math.toDegrees(heading));
+        MainApplication.getMap().statusLine.setHeading(Math.toDegrees(heading));
         if (this.drawingAngle != null && !ignoreConstraints) {
             double ang = Math.toDegrees(heading - this.drawingAngle);
@@ -168,5 +169,5 @@
             if (ang > 360)
                 ang -= 360;
-            Main.map.statusLine.setAngle(ang);
+            MainApplication.getMap().statusLine.setAngle(ang);
         }
     }
@@ -179,5 +180,5 @@
         heading = drawingAngle;
         setLengthWidth(projection1(p2), projection2(p2));
-        Main.map.statusLine.setHeading(Math.toDegrees(heading));
+        MainApplication.getMap().statusLine.setHeading(Math.toDegrees(heading));
     }
 
@@ -210,5 +211,5 @@
 
     private Node findNode(EastNorth pos) {
-        DataSet ds = Main.getLayerManager().getEditDataSet();
+        DataSet ds = MainApplication.getLayerManager().getEditDataSet();
         LatLon l = eastNorth2latlon(pos);
         List<Node> nodes = ds.searchNodes(new BBox(l.lon() - 0.0000001, l.lat() - 0.0000001,
@@ -237,5 +238,5 @@
         List<Node> nodes = new LinkedList<>();
         nodesloop:
-        for (Node n : Main.getLayerManager().getEditDataSet().searchNodes(bbox)) {
+        for (Node n : MainApplication.getLayerManager().getEditDataSet().searchNodes(bbox)) {
             if (!n.isUsable())
                 continue;
@@ -298,10 +299,11 @@
         }
         w.addNode(nodes[0]);
+        DataSet ds = MainApplication.getLayerManager().getEditDataSet();
         Collection<Command> cmds = new LinkedList<>();
         for (int i = 0; i < 4; i++) {
             if (created[i])
-                cmds.add(new AddCommand(nodes[i]));
-        }
-        cmds.add(new AddCommand(w));
+                cmds.add(new AddCommand(ds, nodes[i]));
+        }
+        cmds.add(new AddCommand(ds, w));
 
         if (ToolSettings.PROP_USE_ADDR_NODE.get()) {
Index: /applications/editors/josm/plugins/buildings_tools/src/buildings_tools/BuildingsToolsPlugin.java
===================================================================
--- /applications/editors/josm/plugins/buildings_tools/src/buildings_tools/BuildingsToolsPlugin.java	(revision 33734)
+++ /applications/editors/josm/plugins/buildings_tools/src/buildings_tools/BuildingsToolsPlugin.java	(revision 33735)
@@ -2,5 +2,6 @@
 package buildings_tools;
 
-import org.openstreetmap.josm.Main;
+import javax.swing.JMenu;
+
 import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.coor.LatLon;
@@ -8,4 +9,5 @@
 import org.openstreetmap.josm.data.projection.Projections;
 import org.openstreetmap.josm.gui.IconToggleButton;
+import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.MainMenu;
 import org.openstreetmap.josm.gui.MapFrame;
@@ -26,6 +28,7 @@
     public BuildingsToolsPlugin(PluginInformation info) {
         super(info);
-        MainMenu.add(Main.main.menu.dataMenu, new BuildingSizeAction());
-        MainMenu.add(Main.main.menu.dataMenu, new MergeAddrPointsAction());
+        JMenu dataMenu = MainApplication.getMenu().dataMenu;
+        MainMenu.add(dataMenu, new BuildingSizeAction());
+        MainMenu.add(dataMenu, new MergeAddrPointsAction());
     }
 
@@ -33,5 +36,5 @@
     public void mapFrameInitialized(MapFrame oldFrame, MapFrame newFrame) {
         if (oldFrame == null && newFrame != null) {
-            Main.map.addMapMode(new IconToggleButton(new DrawBuildingAction(Main.map)));
+            MainApplication.getMap().addMapMode(new IconToggleButton(new DrawBuildingAction()));
         }
     }
Index: /applications/editors/josm/plugins/buildings_tools/src/buildings_tools/DrawBuildingAction.java
===================================================================
--- /applications/editors/josm/plugins/buildings_tools/src/buildings_tools/DrawBuildingAction.java	(revision 33734)
+++ /applications/editors/josm/plugins/buildings_tools/src/buildings_tools/DrawBuildingAction.java	(revision 33735)
@@ -22,5 +22,4 @@
 import java.util.Map.Entry;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.mapmode.MapMode;
 import org.openstreetmap.josm.data.Bounds;
@@ -31,5 +30,6 @@
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Way;
-import org.openstreetmap.josm.data.preferences.ColorProperty;
+import org.openstreetmap.josm.data.preferences.NamedColorProperty;
+import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.MapFrame;
 import org.openstreetmap.josm.gui.MapView;
@@ -38,11 +38,12 @@
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.gui.util.KeyPressReleaseListener;
-import org.openstreetmap.josm.gui.util.ModifierListener;
+import org.openstreetmap.josm.gui.util.ModifierExListener;
 import org.openstreetmap.josm.tools.ImageProvider;
+import org.openstreetmap.josm.tools.Logging;
 import org.openstreetmap.josm.tools.Shortcut;
 
 @SuppressWarnings("serial")
 public class DrawBuildingAction extends MapMode implements MapViewPaintable, SelectionChangedListener,
-        KeyPressReleaseListener, ModifierListener {
+        KeyPressReleaseListener, ModifierExListener {
     private enum Mode {
         None, Drawing, DrawingWidth, DrawingAngFix
@@ -63,10 +64,10 @@
     final Building building = new Building();
 
-    public DrawBuildingAction(MapFrame mapFrame) {
+    public DrawBuildingAction() {
         super(tr("Draw buildings"), "building", tr("Draw buildings"),
                 Shortcut.registerShortcut("mapmode:buildings",
                         tr("Mode: {0}", tr("Draw buildings")),
                         KeyEvent.VK_B, Shortcut.DIRECT),
-                mapFrame, getCursor());
+                getCursor());
 
         cursorCrosshair = getCursor();
@@ -79,5 +80,5 @@
             return ImageProvider.getCursor("crosshair", "building");
         } catch (Exception e) {
-            Main.error(e);
+            Logging.error(e);
         }
         return Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR);
@@ -94,16 +95,14 @@
         try {
             // We invoke this to prevent strange things from happening
-            EventQueue.invokeLater(new Runnable() {
-                @Override
-                public void run() {
-                    // Don't change cursor when mode has changed already
-                    if (!(Main.map.mapMode instanceof DrawBuildingAction))
-                        return;
-                    Main.map.mapView.setCursor(c);
-                }
+            EventQueue.invokeLater(() -> {
+                MapFrame map = MainApplication.getMap();
+                // Don't change cursor when mode has changed already
+                if (!(map.mapMode instanceof DrawBuildingAction))
+                    return;
+                map.mapView.setCursor(c);
             });
             currCursor = c;
         } catch (Exception e) {
-            Main.error(e);
+            Logging.error(e);
         }
     }
@@ -128,15 +127,16 @@
     public void enterMode() {
         super.enterMode();
+        MapFrame map = MainApplication.getMap();
         if (getLayerManager().getEditDataSet() == null) {
-            Main.map.selectSelectTool(false);
-            return;
-        }
-        selectedColor = new ColorProperty(marktr("selected"), selectedColor).get();
+            map.selectSelectTool(false);
+            return;
+        }
+        selectedColor = new NamedColorProperty(marktr("selected"), selectedColor).get();
         currCursor = cursorCrosshair;
-        Main.map.mapView.addMouseListener(this);
-        Main.map.mapView.addMouseMotionListener(this);
-        Main.map.mapView.addTemporaryLayer(this);
-        Main.map.keyDetector.addKeyListener(this);
-        Main.map.keyDetector.addModifierListener(this);
+        map.mapView.addMouseListener(this);
+        map.mapView.addMouseMotionListener(this);
+        map.mapView.addTemporaryLayer(this);
+        map.keyDetector.addKeyListener(this);
+        map.keyDetector.addModifierExListener(this);
         DataSet.addSelectionListener(this);
         updateSnap(getLayerManager().getEditDataSet().getSelected());
@@ -146,12 +146,13 @@
     public void exitMode() {
         super.exitMode();
-        Main.map.mapView.removeMouseListener(this);
-        Main.map.mapView.removeMouseMotionListener(this);
-        Main.map.mapView.removeTemporaryLayer(this);
-        Main.map.keyDetector.removeKeyListener(this);
-        Main.map.keyDetector.removeModifierListener(this);
+        MapFrame map = MainApplication.getMap();
+        map.mapView.removeMouseListener(this);
+        map.mapView.removeMouseMotionListener(this);
+        map.mapView.removeTemporaryLayer(this);
+        map.keyDetector.removeKeyListener(this);
+        map.keyDetector.removeModifierExListener(this);
         DataSet.removeSelectionListener(this);
         if (mode != Mode.None)
-            Main.map.mapView.repaint();
+            map.mapView.repaint();
         mode = Mode.None;
     }
@@ -159,23 +160,24 @@
     public final void cancelDrawing() {
         mode = Mode.None;
-        if (Main.map == null || Main.map.mapView == null)
-            return;
-        Main.map.statusLine.setHeading(-1);
-        Main.map.statusLine.setAngle(-1);
+        MapFrame map = MainApplication.getMap();
+        if (map == null || map.mapView == null)
+            return;
+        map.statusLine.setHeading(-1);
+        map.statusLine.setAngle(-1);
         building.reset();
-        Main.map.mapView.repaint();
+        map.mapView.repaint();
         updateStatusLine();
     }
 
     @Override
-    public void modifiersChanged(int modifiers) {
+    public void modifiersExChanged(int modifiers) {
         boolean oldCtrl = ctrl;
         boolean oldShift = shift;
-        updateKeyModifiers(modifiers);
+        updateKeyModifiersEx(modifiers);
         if (ctrl != oldCtrl || shift != oldShift) {
             processMouseEvent(null);
             updCursor();
             if (mode != Mode.None)
-                Main.map.mapView.repaint();
+                MainApplication.getMap().mapView.repaint();
         }
     }
@@ -200,8 +202,8 @@
             n = null;
         } else {
-            n = Main.map.mapView.getNearestNode(mousePos, OsmPrimitive::isUsable);
+            n = MainApplication.getMap().mapView.getNearestNode(mousePos, OsmPrimitive::isUsable);
         }
         if (n == null) {
-            return latlon2eastNorth(Main.map.mapView.getLatLon(mousePos.x, mousePos.y));
+            return latlon2eastNorth(MainApplication.getMap().mapView.getLatLon(mousePos.x, mousePos.y));
         } else {
             return latlon2eastNorth(n.getCoor());
@@ -220,5 +222,5 @@
         } else {
             building.setPlace(p, ToolSettings.getWidth(), ToolSettings.getLenStep(), shift);
-            Main.map.statusLine.setDist(building.getLength());
+            MainApplication.getMap().statusLine.setDist(building.getLength());
             this.nextMode = ToolSettings.getWidth() == 0 ? Mode.DrawingWidth : Mode.None;
             return this.nextMode;
@@ -228,5 +230,5 @@
     private Mode modeDrawingWidth() {
         building.setWidth(getEastNorth());
-        Main.map.statusLine.setDist(Math.abs(building.getWidth()));
+        MainApplication.getMap().statusLine.setDist(Math.abs(building.getWidth()));
         return Mode.None;
     }
@@ -277,7 +279,7 @@
         drawStartPos = mousePos;
 
-        Node n = Main.map.mapView.getNearestNode(mousePos, OsmPrimitive::isUsable);
+        Node n = MainApplication.getMap().mapView.getNearestNode(mousePos, OsmPrimitive::isUsable);
         if (n == null) {
-            building.setBase(latlon2eastNorth(Main.map.mapView.getLatLon(mousePos.x, mousePos.y)));
+            building.setBase(latlon2eastNorth(MainApplication.getMap().mapView.getLatLon(mousePos.x, mousePos.y)));
         } else {
             building.setBase(n);
@@ -320,5 +322,5 @@
         if (e.getButton() != MouseEvent.BUTTON1)
             return;
-        if (!Main.map.mapView.isActiveLayerDrawable())
+        if (!MainApplication.getMap().mapView.isActiveLayerDrawable())
             return;
 
@@ -334,5 +336,5 @@
         updCursor();
         if (mode != Mode.None)
-            Main.map.mapView.repaint();
+            MainApplication.getMap().mapView.repaint();
     }
 
@@ -341,5 +343,5 @@
         if (e.getButton() != MouseEvent.BUTTON1)
             return;
-        if (!Main.map.mapView.isActiveLayerDrawable())
+        if (!MainApplication.getMap().mapView.isActiveLayerDrawable())
             return;
         boolean dragged = true;
@@ -359,9 +361,9 @@
         if (mousePos == null)
             return;
-        if (!Main.isDisplayingMapView())
+        if (!MainApplication.isDisplayingMapView())
             return;
         Node n = null;
         if (!ctrl)
-            n = Main.map.mapView.getNearestNode(mousePos, OsmPrimitive::isUsable);
+            n = MainApplication.getMap().mapView.getNearestNode(mousePos, OsmPrimitive::isUsable);
         if (n != null) {
             setCursor(cursorJoinNode);
@@ -377,10 +379,10 @@
     @Override
     public void mouseMoved(MouseEvent e) {
-        if (!Main.map.mapView.isActiveLayerDrawable())
+        if (!MainApplication.getMap().mapView.isActiveLayerDrawable())
             return;
         processMouseEvent(e);
         updCursor();
         if (mode != Mode.None)
-            Main.map.mapView.repaint();
+            MainApplication.getMap().mapView.repaint();
     }
 
Index: /applications/editors/josm/plugins/buildings_tools/src/buildings_tools/ToolSettings.java
===================================================================
--- /applications/editors/josm/plugins/buildings_tools/src/buildings_tools/ToolSettings.java	(revision 33734)
+++ /applications/editors/josm/plugins/buildings_tools/src/buildings_tools/ToolSettings.java	(revision 33735)
@@ -13,4 +13,5 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.preferences.BooleanProperty;
+import org.openstreetmap.josm.tools.Logging;
 
 public final class ToolSettings {
@@ -61,11 +62,11 @@
             values.add(entry.getValue());
         }
-        Main.pref.putCollection("buildings_tools.tags", values);
+        Main.pref.putList("buildings_tools.tags", values);
     }
 
     private static void loadTags() {
         TAGS.clear();
-        Collection<String> values = Main.pref.getCollection("buildings_tools.tags",
-                Arrays.asList(new String[] {"building", "yes"}));
+        Collection<String> values = Main.pref.getList("buildings_tools.tags",
+                Arrays.asList("building", "yes"));
         try {
             for (Iterator<String> iterator = values.iterator(); iterator.hasNext();) {
@@ -73,10 +74,10 @@
             }
         } catch (NoSuchElementException e) {
-            Main.warn(e);
+            Logging.warn(e);
         }
     }
 
     public static void setBBMode(boolean bbmode) {
-        Main.pref.put("buildings_tools.bbmode", bbmode);
+        Main.pref.putBoolean("buildings_tools.bbmode", bbmode);
     }
 
@@ -86,5 +87,5 @@
 
     public static void setSoftCursor(boolean softCursor) {
-        Main.pref.put("buildings_tools.softcursor", softCursor);
+        Main.pref.putBoolean("buildings_tools.softcursor", softCursor);
     }
 
