Index: /applications/editors/josm/plugins/buildings_tools/src/org/openstreetmap/josm/plugins/buildings_tools/AngleSnap.java
===================================================================
--- /applications/editors/josm/plugins/buildings_tools/src/org/openstreetmap/josm/plugins/buildings_tools/AngleSnap.java	(revision 34849)
+++ /applications/editors/josm/plugins/buildings_tools/src/org/openstreetmap/josm/plugins/buildings_tools/AngleSnap.java	(revision 34850)
@@ -25,7 +25,6 @@
     public final Double addSnap(Node[] nodes) {
         if (nodes.length == 2) {
-            EastNorth p1, p2;
-            p1 = latlon2eastNorth(nodes[0].getCoor());
-            p2 = latlon2eastNorth(nodes[1].getCoor());
+            EastNorth p1 = latlon2eastNorth(nodes[0].getCoor());
+            EastNorth p2 = latlon2eastNorth(nodes[1].getCoor());
             double heading = p1.heading(p2);
             addSnap(heading);
@@ -39,7 +38,6 @@
     public final void addSnap(Way way) {
         for (Pair<Node, Node> pair : way.getNodePairs(false)) {
-            EastNorth a, b;
-            a = latlon2eastNorth(pair.a.getCoor());
-            b = latlon2eastNorth(pair.b.getCoor());
+            EastNorth a = latlon2eastNorth(pair.a.getCoor());
+            EastNorth b = latlon2eastNorth(pair.b.getCoor());
             double heading = a.heading(b);
             addSnap(heading);
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 34849)
+++ /applications/editors/josm/plugins/buildings_tools/src/org/openstreetmap/josm/plugins/buildings_tools/Building.java	(revision 34850)
@@ -44,12 +44,12 @@
     private final EastNorth[] en = new EastNorth[4];
 
-    double meter = 0;
-
-    private double len = 0;
+    double meter;
+
+    private double len;
     private double width;
     private double heading;
     private AngleSnap angleSnap = new AngleSnap();
     private Double drawingAngle;
-    private final static double EQUAL_NODE_DIST_TOLERANCE = 1e-6;
+    private static final double EQUAL_NODE_DIST_TOLERANCE = 1e-6;
 
     public void clearAngleSnap() {
@@ -227,5 +227,5 @@
     }
 
-    private Node findNode(EastNorth pos) {
+    private static Node findNode(EastNorth pos) {
         MapView mv = MainApplication.getMap().mapView;
         Node n = mv.getNearestNode(mv.getPoint(eastNorth2latlon(pos)), OsmPrimitive::isSelectable);
@@ -249,29 +249,31 @@
         nodesloop:
         for (Node n : MainApplication.getLayerManager().getEditDataSet().searchNodes(bbox)) {
-            if (!n.isUsable())
-                continue;
-            tagcheck: do {
-                for (String key : n.getKeys().keySet()) {
-                    if (key.equals("building") || key.startsWith("addr:"))
-                        break tagcheck;
+            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;
                 }
-                continue nodesloop;
-            } while (false);
-            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;
-            }
-            nodes.add(n);
+                nodes.add(n);
+            }
         }
         if (nodes.size() != 1)
             return null;
         return nodes.get(0);
+    }
+
+    static boolean findUsableTag(OsmPrimitive p) {
+        for (String key : p.getKeys().keySet()) {
+            if ("building".equals(key) || key.startsWith("addr:")) {
+                return true;
+            }
+        }
+        return false;
     }
 
@@ -315,5 +317,5 @@
 
         snapBuildings(w, nodes, addNodesCmd);
-        if (addNodesCmd.size() > 0) {
+        if (!addNodesCmd.isEmpty()) {
             Command addNodes = new SequenceCommand(tr("Add nodes for building"), addNodesCmd);
             UndoRedoHandler.getInstance().add(addNodes);
@@ -396,5 +398,5 @@
     }
 
-    private void snapBuildings(Way w, Node[] nodes, Collection<Command> cmds) {
+    private static void snapBuildings(Way w, Node[] nodes, Collection<Command> cmds) {
         // calculate BBox which is slightly larger than the new building
         List<Node> wayNodes = w.getNodes();
@@ -435,18 +437,22 @@
      */
     private static void snapToWay(List<Node> wayNodes, Collection<Node> otherNodes) {
-        for (int i = 0; i < wayNodes.size(); i++) {
+        int i = 0;
+        while (i < wayNodes.size()) {
             Node n0 = wayNodes.get(i);
             Node n1 = wayNodes.get(i + 1 == wayNodes.size() ? 0 : i + 1);
             for (Node n2 : otherNodes) {
-                if (n2 == n0 || n2 == n1)
-                    continue;
-                EastNorth x = Geometry.closestPointToSegment(n0.getEastNorth(), n1.getEastNorth(), n2.getEastNorth());
-                if (x.distance(n2.getEastNorth()) <= EQUAL_NODE_DIST_TOLERANCE && !wayNodes.contains(n2)) {
-                    wayNodes.add(i + 1, n2);
-                    // we may add multiple nodes to one segment, so repeat it
-                    i--;
-                    break;
+                if (n2 != n0 && n2 != n1) {
+                    EastNorth x = Geometry.closestPointToSegment(n0.getEastNorth(), n1.getEastNorth(),
+                            n2.getEastNorth());
+                    if (x.distance(n2.getEastNorth()) <= EQUAL_NODE_DIST_TOLERANCE && !wayNodes.contains(n2)) {
+                        wayNodes.add(i + 1, n2);
+                        // we may add multiple nodes to one segment, so repeat
+                        // it
+                        i--;
+                        break;
+                    }
                 }
             }
+            i++;
         }
     }
Index: /applications/editors/josm/plugins/buildings_tools/src/org/openstreetmap/josm/plugins/buildings_tools/MergeAddrPointsAction.java
===================================================================
--- /applications/editors/josm/plugins/buildings_tools/src/org/openstreetmap/josm/plugins/buildings_tools/MergeAddrPointsAction.java	(revision 34849)
+++ /applications/editors/josm/plugins/buildings_tools/src/org/openstreetmap/josm/plugins/buildings_tools/MergeAddrPointsAction.java	(revision 34850)
@@ -91,6 +91,7 @@
                     if (mergeNode != null) {
                         multi++;
-                        continue buildingsLoop; // Multiple address nodes inside
-                                                // one building -- skipping
+                        // Multiple address nodes inside one building --
+                        // skipping
+                        continue buildingsLoop;
                     } else
                         mergeNode = n;
