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 35739)
+++ /applications/editors/josm/plugins/buildings_tools/src/org/openstreetmap/josm/plugins/buildings_tools/DrawBuildingAction.java	(revision 35740)
@@ -40,4 +40,6 @@
 import org.openstreetmap.josm.gui.util.KeyPressReleaseListener;
 import org.openstreetmap.josm.gui.util.ModifierExListener;
+import org.openstreetmap.josm.spi.preferences.Config;
+import org.openstreetmap.josm.spi.preferences.PreferenceChangedListener;
 import org.openstreetmap.josm.tools.Geometry;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -51,5 +53,4 @@
     }
 
-    private final Cursor cursorCrosshair;
     private final Cursor cursorJoinNode;
     private final Cursor cursorJoinWay;
@@ -65,4 +66,6 @@
 
     final transient Building building = new Building();
+
+    private final PreferenceChangedListener shapeChangeListener = event -> updCursor();
 
     public DrawBuildingAction() {
@@ -71,10 +74,12 @@
                         tr("Mode: {0}", tr("Draw buildings")),
                         KeyEvent.VK_B, Shortcut.DIRECT),
-                getCursor());
-
-        cursorCrosshair = getCursor();
+                // Set super.cursor to crosshair without overlay because super.cursor is final,
+                // but we use two different cursors with overlays for rectangular and circular buildings
+                // the actual cursor is drawn in enterMode()
+                ImageProvider.getCursor("crosshair", null));
+
+        currCursor = getCursor();
         cursorJoinNode = ImageProvider.getCursor("crosshair", "joinnode");
         cursorJoinWay = ImageProvider.getCursor("crosshair", "joinway");
-        currCursor = cursorCrosshair;
     }
 
@@ -134,4 +139,5 @@
     public void enterMode() {
         super.enterMode();
+
         MapFrame map = MainApplication.getMap();
         if (getLayerManager().getEditDataSet() == null) {
@@ -140,5 +146,4 @@
         }
         selectedColor = new NamedColorProperty(marktr("selected"), selectedColor).get();
-        currCursor = cursorCrosshair;
         map.mapView.addMouseListener(this);
         map.mapView.addMouseMotionListener(this);
@@ -147,5 +152,9 @@
         map.keyDetector.addModifierExListener(this);
         SelectionEventManager.getInstance().addSelectionListener(this);
+        Config.getPref().addKeyPreferenceChangeListener("buildings_tool.shape", shapeChangeListener);
+
         updateSnap(getLayerManager().getEditDataSet().getSelected());
+        // super.enterMode() draws the basic cursor. Overwrite it with the cursor for the current building mode.
+        updCursor();
     }
 
@@ -160,4 +169,6 @@
         map.keyDetector.removeModifierExListener(this);
         SelectionEventManager.getInstance().removeSelectionListener(this);
+        Config.getPref().removeKeyPreferenceChangeListener("buildings_tool.shape", shapeChangeListener);
+
         if (mode != Mode.None)
             map.mapView.repaint();
@@ -386,11 +397,9 @@
 
     private void updCursor() {
-        if (mousePos == null)
-            return;
         if (!MainApplication.isDisplayingMapView())
             return;
-        Node n = null;
-        if (!ctrl) {
-            n = MainApplication.getMap().mapView.getNearestNode(mousePos, OsmPrimitive::isSelectable);
+
+        if (!ctrl && (mousePos != null)) {
+            Node n = MainApplication.getMap().mapView.getNearestNode(mousePos, OsmPrimitive::isSelectable);
             if (n != null) {
                 setCursor(cursorJoinNode);
