Index: applications/editors/josm/plugins/buildings_tools/build.xml
===================================================================
--- applications/editors/josm/plugins/buildings_tools/build.xml	(revision 34967)
+++ applications/editors/josm/plugins/buildings_tools/build.xml	(revision 34968)
@@ -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="14153"/>
+    <property name="plugin.main.version" value="14960"/>
     
     <!-- Configure these properties (replace "..." accordingly).
Index: applications/editors/josm/plugins/buildings_tools/src/org/openstreetmap/josm/plugins/buildings_tools/Building.java
===================================================================
--- applications/editors/josm/plugins/buildings_tools/src/org/openstreetmap/josm/plugins/buildings_tools/Building.java	(revision 34967)
+++ applications/editors/josm/plugins/buildings_tools/src/org/openstreetmap/josm/plugins/buildings_tools/Building.java	(revision 34968)
@@ -3,9 +3,9 @@
 
 import static org.openstreetmap.josm.plugins.buildings_tools.BuildingsToolsPlugin.eastNorth2latlon;
-import static org.openstreetmap.josm.plugins.buildings_tools.BuildingsToolsPlugin.latlon2eastNorth;
 import static org.openstreetmap.josm.tools.I18n.tr;
 
 import java.awt.Graphics2D;
 import java.awt.Point;
+import java.awt.geom.Area;
 import java.awt.geom.GeneralPath;
 import java.util.ArrayList;
@@ -79,5 +79,5 @@
     public boolean isRectDrawing() {
         return drawingAngle != null && ToolSettings.getWidth() == 0 && ToolSettings.getLenStep() == 0
-                && ToolSettings.Shape.RECTANGLE.equals(ToolSettings.getShape());
+                && ToolSettings.Shape.RECTANGLE == ToolSettings.getShape();
     }
 
@@ -134,5 +134,5 @@
         final EastNorth p1 = en[0];
         en[1] = new EastNorth(p1.east() + Math.sin(heading) * len * meter, p1.north() + Math.cos(heading) * len * meter);
-        if (ToolSettings.Shape.RECTANGLE.equals(ToolSettings.getShape())) {
+        if (ToolSettings.Shape.RECTANGLE == ToolSettings.getShape()) {
             en[2] = new EastNorth(p1.east() + Math.sin(heading) * len * meter + Math.cos(heading) * width * meter,
                     p1.north() + Math.cos(heading) * len * meter - Math.sin(heading) * width * meter);
@@ -217,5 +217,5 @@
         b.moveTo(pp1.x, pp1.y);
         b.lineTo(pp2.x, pp2.y);
-        if (ToolSettings.Shape.RECTANGLE.equals(ToolSettings.getShape())) {
+        if (ToolSettings.Shape.RECTANGLE == ToolSettings.getShape()) {
             Point pp3 = mv.getPoint(eastNorth2latlon(en[2]));
             Point pp4 = mv.getPoint(eastNorth2latlon(en[3]));
@@ -238,28 +238,28 @@
      * Returns a node with address tags under the building.
      *
+     * @param w
+     *            the building way
      * @return A node with address tags under the building.
      */
-    private Node getAddressNode() {
-        BBox bbox = new BBox(eastNorth2latlon(en[0]), eastNorth2latlon(en[1]));
-        if (ToolSettings.Shape.RECTANGLE.equals(ToolSettings.getShape())) {
-            bbox.add(eastNorth2latlon(en[2]));
-            bbox.add(eastNorth2latlon(en[3]));
-        }
+    private static Node getAddressNode(Way w) {
+        BBox bbox = w.getBBox();
         List<Node> nodes = new LinkedList<>();
-        nodesloop:
+        Area area = Geometry.getArea(w.getNodes());
         for (Node n : MainApplication.getLayerManager().getEditDataSet().searchNodes(bbox)) {
             if (n.isUsable() && findUsableTag(n)) {
-                double x = projection1(latlon2eastNorth(n.getCoor()));
-                double y = projection2(latlon2eastNorth(n.getCoor()));
-                if (Math.signum(x) != Math.signum(len) || Math.signum(y) != Math.signum(width))
-                    continue;
-                if (Math.abs(x) > Math.abs(len) || Math.abs(y) > Math.abs(width))
-                    continue;
-                for (OsmPrimitive p : n.getReferrers()) {
-                    // Don't use nodes if they're referenced by ways
-                    if (p.getType() == OsmPrimitiveType.WAY)
-                        continue nodesloop;
+                EastNorth enTest = n.getEastNorth();
+                if (area.contains(enTest.getX(), enTest.getY())) {
+                    boolean useNode = true;
+                    for (OsmPrimitive p : n.getReferrers()) {
+                        // Don't use nodes if they're referenced by ways
+                        if (p.getType() == OsmPrimitiveType.WAY) {
+                            useNode = false;
+                            break;
+                        }
+                    }
+                    if (useNode) {
+                        nodes.add(n);
+                    }
                 }
-                nodes.add(n);
             }
         }
@@ -297,5 +297,5 @@
                 created[i] = false;
             }
-            if (nodes[i].getCoor().isOutSideWorld()) {
+            if (nodes[i].isOutSideWorld()) {
                 JOptionPane.showMessageDialog(MainApplication.getMainFrame(),
                         tr("Cannot place building outside of the world."));
@@ -325,4 +325,5 @@
         ds.addSelected(w.getNodes());
 
+        int oldNumWays = ds.getWays().size();
         CreateCircleAction action = new CreateCircleAction();
         action.setEnabled(true);
@@ -332,14 +333,21 @@
         ds.clearSelection();
         ds.addSelected(selectedPrimitives);
-
-        // get the way with the smallest id with the assumption that it is
-        // newest way created by CreateCirclAction
-        List<Way> ways = new ArrayList<>(ds.getWays());
-        Collections.sort(ways);
-        w = ways.get(0);
-
-        addAddress(w, null);
-
-        return w;
+        if (oldNumWays < ds.getWays().size()) {
+            // get the way with the smallest id with the assumption that it is
+            // newest way created by CreateCirclAction
+            List<Way> ways = new ArrayList<>(ds.getWays());
+            Collections.sort(ways);
+            w = ways.get(0);
+
+            addAddress(w, null);
+
+            return w;
+        } else {
+            // CreateCircleAction failed
+            if (!addNodesCmd.isEmpty()) {
+                UndoRedoHandler.getInstance().undo(1);
+            }
+            return null;
+        }
     }
 
@@ -362,5 +370,5 @@
                 created[i] = false;
             }
-            if (nodes[i].getCoor().isOutSideWorld()) {
+            if (nodes[i].isOutSideWorld()) {
                 JOptionPane.showMessageDialog(MainApplication.getMainFrame(),
                         tr("Cannot place building outside of the world."));
@@ -458,7 +466,7 @@
     }
 
-    private void addAddress(Way w, Collection<Command> cmdList) {
+    private static void addAddress(Way w, Collection<Command> cmdList) {
         if (ToolSettings.PROP_USE_ADDR_NODE.get()) {
-            Node addrNode = getAddressNode();
+            Node addrNode = getAddressNode(w);
             if (addrNode != null) {
                 Collection<Command> addressCmds = cmdList != null ? cmdList : new LinkedList<>();
Index: applications/editors/josm/plugins/buildings_tools/src/org/openstreetmap/josm/plugins/buildings_tools/BuildingSizeDialog.java
===================================================================
--- applications/editors/josm/plugins/buildings_tools/src/org/openstreetmap/josm/plugins/buildings_tools/BuildingSizeDialog.java	(revision 34967)
+++ applications/editors/josm/plugins/buildings_tools/src/org/openstreetmap/josm/plugins/buildings_tools/BuildingSizeDialog.java	(revision 34968)
@@ -32,6 +32,6 @@
         shapeGroup.add(circleRadio);
         shapeGroup.add(rectangleRadio);
-        circleRadio.setSelected(ToolSettings.Shape.CIRCLE.equals(ToolSettings.getShape()));
-        rectangleRadio.setSelected(ToolSettings.Shape.RECTANGLE.equals(ToolSettings.getShape()));
+        circleRadio.setSelected(ToolSettings.Shape.CIRCLE == ToolSettings.getShape());
+        rectangleRadio.setSelected(ToolSettings.Shape.RECTANGLE == ToolSettings.getShape());
 
         panel.add(rectangleRadio, GBC.eol().fill(GBC.HORIZONTAL));
Index: applications/editors/josm/plugins/buildings_tools/src/org/openstreetmap/josm/plugins/buildings_tools/DrawBuildingAction.java
===================================================================
--- applications/editors/josm/plugins/buildings_tools/src/org/openstreetmap/josm/plugins/buildings_tools/DrawBuildingAction.java	(revision 34967)
+++ applications/editors/josm/plugins/buildings_tools/src/org/openstreetmap/josm/plugins/buildings_tools/DrawBuildingAction.java	(revision 34968)
@@ -81,5 +81,5 @@
     private static Cursor getCursor() {
         try {
-            if (ToolSettings.Shape.CIRCLE.equals(ToolSettings.getShape())) {
+            if (ToolSettings.Shape.CIRCLE == ToolSettings.getShape()) {
                 return ImageProvider.getCursor("crosshair", "silo");
             } else {
@@ -226,5 +226,5 @@
     private boolean isRectDrawing() {
         return building.isRectDrawing() && (!shift || ToolSettings.isBBMode())
-                && ToolSettings.Shape.RECTANGLE.equals(ToolSettings.getShape());
+                && ToolSettings.Shape.RECTANGLE == ToolSettings.getShape();
     }
 
@@ -234,5 +234,5 @@
             building.setPlaceRect(p);
             return shift ? Mode.DrawingAngFix : Mode.None;
-        } else if (ToolSettings.Shape.CIRCLE.equals(ToolSettings.getShape())) {
+        } else if (ToolSettings.Shape.CIRCLE == ToolSettings.getShape()) {
             if (ToolSettings.getWidth() != 0) {
                 building.setPlaceCircle(p, ToolSettings.getWidth(), shift);
@@ -320,5 +320,5 @@
         if (building.getLength() != 0) {
             Way w;
-            if (ToolSettings.Shape.CIRCLE.equals(ToolSettings.getShape())) {
+            if (ToolSettings.Shape.CIRCLE == ToolSettings.getShape()) {
                 w = building.createCircle();
             } else {
