Index: /applications/editors/josm/plugins/buildings_tools/src/buildings_tools/AdvancedSettingsDialog.java
===================================================================
--- /applications/editors/josm/plugins/buildings_tools/src/buildings_tools/AdvancedSettingsDialog.java	(revision 25892)
+++ /applications/editors/josm/plugins/buildings_tools/src/buildings_tools/AdvancedSettingsDialog.java	(revision 25893)
@@ -17,4 +17,5 @@
     private final JCheckBox cBigMode = new JCheckBox(tr("Big buildings mode"));
     private final JCheckBox cSoftCur = new JCheckBox(tr("Rotate crosshair"));
+    private final JCheckBox cAddrNode = new JCheckBox(tr("Use address nodes under buildings"));
 
     public AdvancedSettingsDialog() {
@@ -30,7 +31,9 @@
         panel.add(cBigMode, GBC.eol().fill(GBC.HORIZONTAL));
         panel.add(cSoftCur, GBC.eol().fill(GBC.HORIZONTAL));
+        panel.add(cAddrNode, GBC.eol().fill(GBC.HORIZONTAL));
 
         cBigMode.setSelected(ToolSettings.isBBMode());
         cSoftCur.setSelected(ToolSettings.isSoftCursor());
+        cAddrNode.setSelected(ToolSettings.PROP_USE_ADDR_NODE.get());
 
         setupDialog();
@@ -38,17 +41,10 @@
     }
 
-    public boolean isBBMode() {
-        return cBigMode.isSelected();
-    }
-
-    public boolean isSoftCursor() {
-        return cSoftCur.isSelected();
-    }
-
     public void saveSettings() {
         tagsModel.applyToTags(ToolSettings.getTags());
         ToolSettings.saveTags();
-        ToolSettings.setBBMode(isBBMode());
-        ToolSettings.setSoftCursor(isSoftCursor());
+        ToolSettings.setBBMode(cBigMode.isSelected());
+        ToolSettings.setSoftCursor(cSoftCur.isSelected());
+        ToolSettings.PROP_USE_ADDR_NODE.put(cAddrNode.isSelected());
     }
 }
Index: /applications/editors/josm/plugins/buildings_tools/src/buildings_tools/Building.java
===================================================================
--- /applications/editors/josm/plugins/buildings_tools/src/buildings_tools/Building.java	(revision 25892)
+++ /applications/editors/josm/plugins/buildings_tools/src/buildings_tools/Building.java	(revision 25893)
@@ -17,5 +17,7 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.command.AddCommand;
+import org.openstreetmap.josm.command.ChangeCommand;
 import org.openstreetmap.josm.command.Command;
+import org.openstreetmap.josm.command.DeleteCommand;
 import org.openstreetmap.josm.command.SequenceCommand;
 import org.openstreetmap.josm.data.coor.*;
@@ -24,4 +26,7 @@
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
+import org.openstreetmap.josm.data.osm.Relation;
+import org.openstreetmap.josm.data.osm.RelationMember;
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.gui.MapView;
@@ -214,4 +219,36 @@
     }
 
+    /**
+     * Returns a node with "building=yes" tag under the building
+     *
+     * @return
+     */
+    private Node getAddressNode() {
+        BBox bbox = new BBox(eastNorth2latlon(en[0]), eastNorth2latlon(en[1]));
+        bbox.add(eastNorth2latlon(en[2]));
+        bbox.add(eastNorth2latlon(en[3]));
+        List<Node> nodes = new LinkedList<Node>();
+        nodesloop:
+        for (Node n : Main.main.getCurrentDataSet().searchNodes(bbox)) {
+            if (!n.isUsable() || n.getKeys().get("building") == null)
+                continue;
+            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);
+        }
+        if (nodes.size() != 1)
+            return null;
+        return nodes.get(0);
+    }
+
     public Way create() {
         if (len == 0)
@@ -247,5 +284,4 @@
         }
         w.addNode(nodes[0]);
-        w.setKeys(ToolSettings.getTags());
         Collection<Command> cmds = new LinkedList<Command>();
         for (int i = 0; i < 4; i++) {
@@ -254,4 +290,23 @@
         }
         cmds.add(new AddCommand(w));
+        Node addrNode;
+        if (ToolSettings.PROP_USE_ADDR_NODE.get() && (addrNode = getAddressNode()) != null) {
+            w.setKeys(addrNode.getKeys());
+            for (OsmPrimitive p : addrNode.getReferrers()) {
+                Relation r = (Relation) p;
+                Relation rnew = new Relation(r);
+                for (int i = 0; i < r.getMembersCount(); i++) {
+                    RelationMember member = r.getMember(i);
+                    if (member.getMember() == addrNode) {
+                        rnew.removeMember(i);
+                        rnew.addMember(i, new RelationMember(member.getRole(), w));
+                    }
+                }
+                cmds.add(new ChangeCommand(r, rnew));
+            }
+            cmds.add(new DeleteCommand(addrNode));
+        } else {
+            w.setKeys(ToolSettings.getTags());
+        }
         Command c = new SequenceCommand(tr("Create building"), cmds);
         Main.main.undoRedo.add(c);
Index: /applications/editors/josm/plugins/buildings_tools/src/buildings_tools/ToolSettings.java
===================================================================
--- /applications/editors/josm/plugins/buildings_tools/src/buildings_tools/ToolSettings.java	(revision 25892)
+++ /applications/editors/josm/plugins/buildings_tools/src/buildings_tools/ToolSettings.java	(revision 25893)
@@ -11,6 +11,8 @@
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.preferences.BooleanProperty;
 
 public class ToolSettings {
+    public static BooleanProperty PROP_USE_ADDR_NODE = new BooleanProperty("buildings_tools.addrNode", true);
     private static double width = 0;
     private static double lenstep = 0;
