Index: src/org/openstreetmap/josm/plugins/buildings_tools/Building.java
===================================================================
--- src/org/openstreetmap/josm/plugins/buildings_tools/Building.java	(revision 34716)
+++ src/org/openstreetmap/josm/plugins/buildings_tools/Building.java	(working copy)
@@ -34,8 +34,10 @@
 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.data.osm.WaySegment;
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.MapView;
+import org.openstreetmap.josm.tools.Geometry;
 
 class Building {
     private final EastNorth[] en = new EastNorth[4];
@@ -244,6 +246,24 @@
         return bestnode;
     }
 
+    private WaySegment findSnapWay(EastNorth pos) {
+        MapView mapView = MainApplication.getMap().mapView;
+        List<WaySegment> wss = mapView.getNearestWaySegments(mapView.getPoint(pos), OsmPrimitive::isSelectable);
+        double minDist = 0.0001;
+
+        WaySegment wsBest = null;
+        for (WaySegment ws : wss) {
+            EastNorth x = Geometry.closestPointToSegment(ws.getFirstNode().getEastNorth(),
+                    ws.getSecondNode().getEastNorth(), pos);
+            double dist = x.distanceSq(pos);
+            if (dist < minDist) {
+                minDist = dist;
+                wsBest = ws;
+            }
+        }
+        return wsBest;
+    }
+
     /**
      * Returns a node with address tags under the building.
      *
@@ -358,11 +378,19 @@
             return null;
         final boolean[] created = new boolean[4];
         final Node[] nodes = new Node[4];
+        WaySegment snapWaySegment = null;
+        Node snapNode = null;
         for (int i = 0; i < 4; i++) {
 
             Node n = findNode(en[i]);
             if (n == null) {
                 nodes[i] = new Node(eastNorth2latlon(en[i]));
+                if (snapWaySegment == null) {
+                    snapWaySegment = findSnapWay(en[i]);
+                    if (snapWaySegment != null) {
+                        snapNode = nodes[i];
+                    }
+                }
                 created[i] = true;
             } else {
                 nodes[i] = n;
@@ -386,6 +414,36 @@
             w.addNode(nodes[1]);
         }
         w.addNode(nodes[0]);
+
+        if (!created[0]) {
+            // first node was snapped, check if we have to snap to other nodes
+            List<Node> wayNodes = w.getNodes();
+            List<OsmPrimitive> refs = nodes[0].getReferrers();
+            final double maxDist = 0.001;
+            for (OsmPrimitive ref : refs) {
+                if (ref instanceof Way && ref.hasKey("building")) {
+                    Way other = (Way) ref;
+                    for (int i = 0; i < wayNodes.size(); i++) {
+                        Node n0 = wayNodes.get(i);
+                        Node n1 = wayNodes.get(i + 1 == wayNodes.size() ? 0 : i + 1);
+
+                        for (Node n2 : other.getNodes()) {
+                            if (n2 == n0 || n2 == n1)
+                                continue;
+                            EastNorth x = Geometry.closestPointToSegment(n0.getEastNorth(), n1.getEastNorth(),
+                                    n2.getEastNorth());
+                            if (x.distanceSq(n2.getEastNorth()) < maxDist) {
+                                wayNodes.add(i + 1, n2);
+                            }
+                        }
+                        if (wayNodes.size() > 5)
+                            break;
+                    }
+                }
+            }
+            w.setNodes(wayNodes);
+        }
+
         DataSet ds = MainApplication.getLayerManager().getEditDataSet();
         Collection<Command> cmds = new LinkedList<>();
         for (int i = 0; i < 4; i++) {
@@ -396,6 +454,15 @@
 
         addAddress(w);
 
+        if (!created[0]) {
+            if (snapWaySegment != null && snapNode != null) {
+                Way newWay = new Way(snapWaySegment.way);
+                List<Node> nodesCopy = snapWaySegment.way.getNodes();
+                nodesCopy.add(snapWaySegment.lowerIndex + 1, snapNode);
+                newWay.setNodes(nodesCopy);
+                cmds.add(new ChangeCommand(snapWaySegment.way, newWay));
+            }
+        }
         Command c = new SequenceCommand(tr("Create building"), cmds);
         UndoRedoHandler.getInstance().add(c);
         return w;
