Index: trunk/src/org/openstreetmap/josm/actions/AlignInCircleAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/AlignInCircleAction.java	(revision 18613)
+++ trunk/src/org/openstreetmap/josm/actions/AlignInCircleAction.java	(revision 18615)
@@ -150,4 +150,7 @@
      * Case 3: Only nodes are selected
      * --&gt; Align these nodes, all are fix
+     * <p>
+     * Case 4: Circularize selected ways
+     * --&gt; Circularize each way of the selection.
      * @param ds data set in which the command operates
      * @return the resulting command to execute to perform action, or null if nothing was changed
@@ -227,4 +230,41 @@
             fixNodes.addAll(onWay);
             nodes = collectNodesAnticlockwise(ways);
+        } else if (!ways.isEmpty() && selectedNodes.isEmpty()) {
+            List<Command> rcmds = new LinkedList<>();
+            for (Way w : ways) {
+                if (!w.isDeleted() && w.isArea()) {
+                    List<Node> wnodes = w.getNodes();
+                    wnodes.remove(wnodes.size() - 1);
+                    if (validateGeometry(wnodes)) {
+                        center = Geometry.getCenter(wnodes);
+                    }
+                    if (center == null) {
+                        continue;
+                    }
+                    boolean skipThisWay = false;
+                    radius = 0;
+                    for (Node n : wnodes) {
+                        if (!n.isLatLonKnown()) {
+                            skipThisWay = true;
+                            break;
+                        } else {
+                            radius += center.distance(n.getEastNorth());
+                        }
+                    }
+                    if (skipThisWay) {
+                        continue;
+                    } else {
+                        radius /= wnodes.size();
+                    }
+                    Command c = moveNodesCommand(wnodes, Collections.emptySet(), center, radius);
+                    if (c != null) {
+                        rcmds.add(c);
+                    }
+                }
+            }
+            if (rcmds.isEmpty()) {
+                throw new InvalidSelection();
+            }
+            return new SequenceCommand(tr("Align each Way in Circle"), rcmds);
         } else {
             throw new InvalidSelection();
@@ -259,5 +299,21 @@
             radius = radius / nodes.size();
         }
-
+        return moveNodesCommand(nodes, fixNodes, center, radius);
+    }
+
+    /**
+     * Move each node of the list of nodes to be arranged in a circle.
+     * @param nodes The list of nodes to be moved.
+     * @param fixNodes The list of nodes that must not be moved.
+     * @param center A center of the circle formed by the nodes.
+     * @param radius A radius of the circle formed by the nodes.
+     * @return the command that arranges the nodes in a circle.
+     * @since 18615
+     */
+    public static Command moveNodesCommand(
+            List<Node> nodes,
+            Set<Node> fixNodes,
+            EastNorth center,
+            double radius) {
         List<Command> cmds = new LinkedList<>();
 
