Index: applications/editors/josm/plugins/buildings_tools/src/buildings_tools/Building.java
===================================================================
--- applications/editors/josm/plugins/buildings_tools/src/buildings_tools/Building.java	(revision 34025)
+++ applications/editors/josm/plugins/buildings_tools/src/buildings_tools/Building.java	(revision 34026)
@@ -9,5 +9,7 @@
 import java.awt.Point;
 import java.awt.geom.GeneralPath;
+import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.LinkedList;
 import java.util.List;
@@ -17,4 +19,5 @@
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.actions.CreateCircleAction;
 import org.openstreetmap.josm.command.AddCommand;
 import org.openstreetmap.josm.command.ChangeCommand;
@@ -71,5 +74,6 @@
 
     public boolean isRectDrawing() {
-        return drawingAngle != null && ToolSettings.getWidth() == 0 && ToolSettings.getLenStep() == 0;
+        return drawingAngle != null && ToolSettings.getWidth() == 0 && ToolSettings.getLenStep() == 0
+                && ToolSettings.Shape.RECTANGLE.equals(ToolSettings.getShape());
     }
 
@@ -131,8 +135,10 @@
         final EastNorth p1 = en[0];
         en[1] = new EastNorth(p1.east() + Math.sin(heading) * len * meter, p1.north() + Math.cos(heading) * len * meter);
-        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);
-        en[3] = new EastNorth(p1.east() + Math.cos(heading) * width * meter,
-                p1.north() - Math.sin(heading) * width * meter);
+        if (ToolSettings.Shape.RECTANGLE.equals(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);
+            en[3] = new EastNorth(p1.east() + Math.cos(heading) * width * meter,
+                    p1.north() - Math.sin(heading) * width * meter);
+        }
     }
 
@@ -173,4 +179,15 @@
     }
 
+    public void setPlaceCircle(EastNorth p2, double width, boolean ignoreConstraints) {
+        if (en[0] == null)
+            throw new IllegalStateException("setPlace() called without the base point");
+        this.heading = en[0].heading(p2);
+        if (!ignoreConstraints)
+            this.heading = angleSnap.snapAngle(this.heading);
+        this.len = width;
+
+        updatePos();
+    }
+
     public void setPlaceRect(EastNorth p2) {
         if (en[0] == null)
@@ -199,11 +216,12 @@
         Point pp1 = mv.getPoint(eastNorth2latlon(en[0]));
         Point pp2 = mv.getPoint(eastNorth2latlon(en[1]));
-        Point pp3 = mv.getPoint(eastNorth2latlon(en[2]));
-        Point pp4 = mv.getPoint(eastNorth2latlon(en[3]));
-
         b.moveTo(pp1.x, pp1.y);
         b.lineTo(pp2.x, pp2.y);
-        b.lineTo(pp3.x, pp3.y);
-        b.lineTo(pp4.x, pp4.y);
+        if (ToolSettings.Shape.RECTANGLE.equals(ToolSettings.getShape())) {
+            Point pp3 = mv.getPoint(eastNorth2latlon(en[2]));
+            Point pp4 = mv.getPoint(eastNorth2latlon(en[3]));
+            b.lineTo(pp3.x, pp3.y);
+            b.lineTo(pp4.x, pp4.y);
+        }
         b.lineTo(pp1.x, pp1.y);
         g.draw(b);
@@ -234,6 +252,8 @@
     private Node getAddressNode() {
         BBox bbox = new BBox(eastNorth2latlon(en[0]), eastNorth2latlon(en[1]));
-        bbox.add(eastNorth2latlon(en[2]));
-        bbox.add(eastNorth2latlon(en[3]));
+        if (ToolSettings.Shape.RECTANGLE.equals(ToolSettings.getShape())) {
+            bbox.add(eastNorth2latlon(en[2]));
+            bbox.add(eastNorth2latlon(en[3]));
+        }
         List<Node> nodes = new LinkedList<>();
         nodesloop:
@@ -266,5 +286,73 @@
     }
 
-    public Way create() {
+    public Way createCircle() {
+        DataSet ds = MainApplication.getLayerManager().getEditDataSet();
+        Collection<OsmPrimitive> selectedPrimitives = ds.getAllSelected();
+        ds.clearSelection();
+
+        if (len == 0)
+            return null;
+        final boolean[] created = new boolean[2];
+        final Node[] nodes = new Node[2];
+        for (int i = 0; i < 2; i++) {
+
+            Node n = findNode(en[i]);
+            if (n == null) {
+                nodes[i] = new Node(eastNorth2latlon(en[i]));
+                created[i] = true;
+            } else {
+                nodes[i] = n;
+                created[i] = false;
+            }
+            if (nodes[i].getCoor().isOutSideWorld()) {
+                JOptionPane.showMessageDialog(Main.parent,
+                        tr("Cannot place building outside of the world."));
+                return null;
+            }
+        }
+        Way w = new Way();
+        w.addNode(nodes[0]);
+        w.addNode(nodes[1]);
+
+        Collection<Command> addNodesCmd = new LinkedList<>();
+
+        for (int i = 0; i < 2; i++) {
+            if (created[i]) {
+                AddCommand addNode = new AddCommand(ds, nodes[i]);
+                addNodesCmd.add(addNode);
+            }
+        }
+
+        if (addNodesCmd.size() > 0) {
+            Command addNodes = new SequenceCommand(tr("Add nodes for building"), addNodesCmd);
+            Main.main.undoRedo.add(addNodes);
+        }
+
+        // Nodes must be selected for create circle action
+        for (int i = 0; i < 2; i++) {
+            if (created[i]) {
+                ds.addSelected(nodes[i]);
+            }
+        }
+
+        CreateCircleAction action = new CreateCircleAction();
+        action.setEnabled(true);
+        action.actionPerformed(null);
+
+        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);
+
+        return w;
+    }
+
+    public Way createRectangle() {
         if (len == 0)
             return null;
@@ -307,7 +395,16 @@
         cmds.add(new AddCommand(ds, w));
 
+        addAddress(w);
+
+        Command c = new SequenceCommand(tr("Create building"), cmds);
+        Main.main.undoRedo.add(c);
+        return w;
+    }
+
+    private void addAddress(Way w) {
         if (ToolSettings.PROP_USE_ADDR_NODE.get()) {
             Node addrNode = getAddressNode();
             if (addrNode != null) {
+                Collection<Command> addressCmds = new LinkedList<>();
                 for (Entry<String, String> entry : addrNode.getKeys().entrySet()) {
                     w.put(entry.getKey(), entry.getValue());
@@ -323,12 +420,11 @@
                         }
                     }
-                    cmds.add(new ChangeCommand(r, rnew));
+                    addressCmds.add(new ChangeCommand(r, rnew));
                 }
-                cmds.add(new DeleteCommand(addrNode));
-            }
-        }
-        Command c = new SequenceCommand(tr("Create building"), cmds);
-        Main.main.undoRedo.add(c);
-        return w;
+                addressCmds.add(new DeleteCommand(addrNode));
+                Command c = new SequenceCommand(tr("Add address for building"), addressCmds);
+                Main.main.undoRedo.add(c);
+            }
+        }
     }
 }
Index: applications/editors/josm/plugins/buildings_tools/src/buildings_tools/BuildingCircleAction.java
===================================================================
--- applications/editors/josm/plugins/buildings_tools/src/buildings_tools/BuildingCircleAction.java	(revision 34026)
+++ applications/editors/josm/plugins/buildings_tools/src/buildings_tools/BuildingCircleAction.java	(revision 34026)
@@ -0,0 +1,27 @@
+// License: GPL. For details, see LICENSE file.
+package buildings_tools;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.KeyEvent;
+
+import org.openstreetmap.josm.actions.JosmAction;
+import org.openstreetmap.josm.tools.Shortcut;
+
+@SuppressWarnings("serial")
+public class BuildingCircleAction extends JosmAction {
+
+    public BuildingCircleAction() {
+        super(tr("Set building shape to circle"), "mapmode/building", tr("Set buildings shape to circle"),
+                Shortcut.registerShortcut("buildings_tools:circle",
+                        tr("Data: {0}", tr("Set buildings shape to circle")),
+                        KeyEvent.VK_Z, Shortcut.ALT),
+                true);
+    }
+
+    @Override
+    public void actionPerformed(ActionEvent e) {
+        ToolSettings.saveShape(ToolSettings.Shape.CIRCLE);
+    }
+}
Index: applications/editors/josm/plugins/buildings_tools/src/buildings_tools/BuildingRectangleAction.java
===================================================================
--- applications/editors/josm/plugins/buildings_tools/src/buildings_tools/BuildingRectangleAction.java	(revision 34026)
+++ applications/editors/josm/plugins/buildings_tools/src/buildings_tools/BuildingRectangleAction.java	(revision 34026)
@@ -0,0 +1,27 @@
+// License: GPL. For details, see LICENSE file.
+package buildings_tools;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.KeyEvent;
+
+import org.openstreetmap.josm.actions.JosmAction;
+import org.openstreetmap.josm.tools.Shortcut;
+
+@SuppressWarnings("serial")
+public class BuildingRectangleAction extends JosmAction {
+
+    public BuildingRectangleAction() {
+        super(tr("Set building shape to rectangle"), "mapmode/building", tr("Set buildings shape to rectangle"),
+                Shortcut.registerShortcut("buildings_tools:rectangle",
+                        tr("Data: {0}", tr("Set buildings shape to rectangle")),
+                        KeyEvent.VK_R, Shortcut.ALT),
+                true);
+    }
+
+    @Override
+    public void actionPerformed(ActionEvent e) {
+        ToolSettings.saveShape(ToolSettings.Shape.RECTANGLE);
+    }
+}
Index: applications/editors/josm/plugins/buildings_tools/src/buildings_tools/BuildingSizeDialog.java
===================================================================
--- applications/editors/josm/plugins/buildings_tools/src/buildings_tools/BuildingSizeDialog.java	(revision 34025)
+++ applications/editors/josm/plugins/buildings_tools/src/buildings_tools/BuildingSizeDialog.java	(revision 34026)
@@ -9,7 +9,9 @@
 import java.text.ParseException;
 
+import javax.swing.ButtonGroup;
 import javax.swing.JButton;
 import javax.swing.JCheckBox;
 import javax.swing.JFormattedTextField;
+import javax.swing.JRadioButton;
 
 import org.openstreetmap.josm.tools.GBC;
@@ -22,9 +24,20 @@
     private final JCheckBox cAutoSelect = new JCheckBox(tr("Auto-select building"));
     private final JCheckBox cAddrNode = new JCheckBox(tr("Use address nodes under buildings"));
+    private final JRadioButton circleRadio = new JRadioButton(tr("Circle"));
+    private final JRadioButton rectangleRadio = new JRadioButton(tr("Rectangle"));
 
     public BuildingSizeDialog() {
-        super(tr("Set buildings size"));
+        super(tr("Set buildings size and shape"));
 
-        addLabelled(tr("Buildings width:"), twidth);
+        ButtonGroup shapeGroup = new ButtonGroup();
+        shapeGroup.add(circleRadio);
+        shapeGroup.add(rectangleRadio);
+        circleRadio.setSelected(ToolSettings.Shape.CIRCLE.equals(ToolSettings.getShape()));
+        rectangleRadio.setSelected(ToolSettings.Shape.RECTANGLE.equals(ToolSettings.getShape()));
+
+        panel.add(rectangleRadio, GBC.eol().fill(GBC.HORIZONTAL));
+        panel.add(circleRadio, GBC.eol().fill(GBC.HORIZONTAL));
+
+        addLabelled(tr("Buildings width/diameter:"), twidth);
         addLabelled(tr("Length step:"), tlenstep);
         panel.add(caddr, GBC.eol().fill(GBC.HORIZONTAL));
@@ -75,4 +88,9 @@
 
     public final void saveSettings() {
+        if (circleRadio.isSelected()) {
+            ToolSettings.saveShape(ToolSettings.Shape.CIRCLE);
+        } else if (rectangleRadio.isSelected()) {
+            ToolSettings.saveShape(ToolSettings.Shape.RECTANGLE);
+        }
         ToolSettings.setSizes(width(), lenstep());
         ToolSettings.setAddrDialog(useAddr());
Index: applications/editors/josm/plugins/buildings_tools/src/buildings_tools/BuildingsToolsPlugin.java
===================================================================
--- applications/editors/josm/plugins/buildings_tools/src/buildings_tools/BuildingsToolsPlugin.java	(revision 34025)
+++ applications/editors/josm/plugins/buildings_tools/src/buildings_tools/BuildingsToolsPlugin.java	(revision 34026)
@@ -30,4 +30,6 @@
         JMenu dataMenu = MainApplication.getMenu().dataMenu;
         MainMenu.add(dataMenu, new BuildingSizeAction());
+        MainMenu.add(dataMenu, new BuildingCircleAction());
+        MainMenu.add(dataMenu, new BuildingRectangleAction());
         MainMenu.add(dataMenu, new MergeAddrPointsAction());
     }
Index: applications/editors/josm/plugins/buildings_tools/src/buildings_tools/DrawBuildingAction.java
===================================================================
--- applications/editors/josm/plugins/buildings_tools/src/buildings_tools/DrawBuildingAction.java	(revision 34025)
+++ applications/editors/josm/plugins/buildings_tools/src/buildings_tools/DrawBuildingAction.java	(revision 34026)
@@ -78,5 +78,9 @@
     private static Cursor getCursor() {
         try {
-            return ImageProvider.getCursor("crosshair", "building");
+            if (ToolSettings.Shape.CIRCLE.equals(ToolSettings.getShape())) {
+                return ImageProvider.getCursor("crosshair", "silo");
+            } else {
+                return ImageProvider.getCursor("crosshair", "building");
+            }
         } catch (Exception e) {
             Logging.error(e);
@@ -212,5 +216,6 @@
 
     private boolean isRectDrawing() {
-        return building.isRectDrawing() && (!shift || ToolSettings.isBBMode());
+        return building.isRectDrawing() && (!shift || ToolSettings.isBBMode())
+                && ToolSettings.Shape.RECTANGLE.equals(ToolSettings.getShape());
     }
 
@@ -218,6 +223,15 @@
         EastNorth p = getEastNorth();
         if (isRectDrawing()) {
-            building.setPlaceRect(p);
-            return shift ? Mode.DrawingAngFix : Mode.None;
+                building.setPlaceRect(p);
+                return shift ? Mode.DrawingAngFix : Mode.None;
+        } else if (ToolSettings.Shape.CIRCLE.equals(ToolSettings.getShape())) {
+            if (ToolSettings.getWidth() != 0) {
+                building.setPlaceCircle(p, ToolSettings.getWidth(), shift);
+            } else {
+                building.setPlace(p, ToolSettings.getWidth(), ToolSettings.getLenStep(), shift);
+            }
+            MainApplication.getMap().statusLine.setDist(building.getLength());
+            this.nextMode = Mode.None;
+            return this.nextMode;
         } else {
             building.setPlace(p, ToolSettings.getWidth(), ToolSettings.getLenStep(), shift);
@@ -278,10 +292,13 @@
         mousePos = e.getPoint();
         drawStartPos = mousePos;
-
-        Node n = MainApplication.getMap().mapView.getNearestNode(mousePos, OsmPrimitive::isUsable);
-        if (n == null) {
+        if (ToolSettings.Shape.CIRCLE.equals(ToolSettings.getShape())) {
             building.setBase(latlon2eastNorth(MainApplication.getMap().mapView.getLatLon(mousePos.x, mousePos.y)));
         } else {
-            building.setBase(n);
+            Node n = MainApplication.getMap().mapView.getNearestNode(mousePos, OsmPrimitive::isUsable);
+            if (n == null) {
+                building.setBase(latlon2eastNorth(MainApplication.getMap().mapView.getLatLon(mousePos.x, mousePos.y)));
+            } else {
+                building.setBase(n);
+            }
         }
         mode = Mode.Drawing;
@@ -301,5 +318,10 @@
     private void drawingFinish() {
         if (building.getLength() != 0) {
-            Way w = building.create();
+            Way w;
+            if (ToolSettings.Shape.CIRCLE.equals(ToolSettings.getShape())) {
+                w = building.createCircle();
+            } else {
+                w = building.createRectangle();
+            }
             if (w != null) {
                 if (!alt || ToolSettings.isUsingAddr())
@@ -372,5 +394,5 @@
                 setCursor(customCursor);
             else
-                setCursor(cursorCrosshair);
+                setCursor(getCursor());
         }
 
Index: applications/editors/josm/plugins/buildings_tools/src/buildings_tools/ToolSettings.java
===================================================================
--- applications/editors/josm/plugins/buildings_tools/src/buildings_tools/ToolSettings.java	(revision 34025)
+++ applications/editors/josm/plugins/buildings_tools/src/buildings_tools/ToolSettings.java	(revision 34026)
@@ -22,4 +22,10 @@
 
     public static final BooleanProperty PROP_USE_ADDR_NODE = new BooleanProperty("buildings_tools.addrNode", false);
+
+    public enum Shape {
+            CIRCLE, RECTANGLE
+    }
+
+    private static Shape shape = loadShape();
     private static double width = 0;
     private static double lenstep = 0;
@@ -27,4 +33,9 @@
     private static final Map<String, String> TAGS = new HashMap<>();
     private static boolean autoSelect;
+
+    public static Shape getShape() {
+        loadShape();
+        return shape;
+    }
 
     public static void setAddrDialog(boolean _useAddr) {
@@ -78,4 +89,19 @@
     }
 
+    public static void saveShape(Shape shape) {
+        Main.pref.put("buildings_tool.shape", shape.name());
+    }
+
+    private static Shape loadShape() {
+        String shape = Main.pref.get("buildings_tool.shape");
+        if (ToolSettings.Shape.CIRCLE.name().equals(shape)) {
+            ToolSettings.shape = Shape.CIRCLE;
+            return Shape.CIRCLE;
+        } else {
+            ToolSettings.shape = Shape.RECTANGLE;
+            return (Shape.RECTANGLE);
+        }
+    }
+
     public static void setBBMode(boolean bbmode) {
         Main.pref.putBoolean("buildings_tools.bbmode", bbmode);
