Index: src/org/openstreetmap/josm/actions/ReorderAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/ReorderAction.java	(revision 184)
+++ src/org/openstreetmap/josm/actions/ReorderAction.java	(revision 184)
@@ -0,0 +1,85 @@
+package org.openstreetmap.josm.actions;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.KeyEvent;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedList;
+
+import javax.swing.JOptionPane;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.command.ChangeCommand;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.Segment;
+import org.openstreetmap.josm.data.osm.Way;
+
+public class ReorderAction extends JosmAction {
+
+	public ReorderAction() {
+		super(tr("Reorder segments"), "reorder", tr("Try to reorder segments of a way so that they are in a line. May try to flip segments around to match a line."), KeyEvent.VK_R, KeyEvent.CTRL_DOWN_MASK | KeyEvent.ALT_DOWN_MASK, true);
+    }
+	
+	public void actionPerformed(ActionEvent e) {
+		Collection<Way> ways = new LinkedList<Way>();
+		for (OsmPrimitive osm : Main.ds.getSelected())
+			if (osm instanceof Way)
+				ways.add((Way)osm);
+		if (ways.size() < 1) {
+			JOptionPane.showMessageDialog(Main.parent, tr("Please select at least one way."));
+			return;
+		}
+		if (ways.size() > 1) {
+			int answer = JOptionPane.showConfirmDialog(Main.parent, tr("You selected more than one way. Reorder the segments of {0} ways?"), tr("Reorder segments"), JOptionPane.OK_CANCEL_OPTION);
+			if (answer != JOptionPane.OK_OPTION)
+				return;
+		}
+		for (Way way : ways) {
+			Way newWay = new Way(way);
+			newWay.segments.clear();
+			newWay.segments.addAll(sortSegments(new HashSet<Segment>(way.segments)));
+			Main.main.editLayer().add(new ChangeCommand(way, newWay));
+			Main.map.mapView.repaint();
+		}
+	}
+
+	/**
+	 * sort the segments in best possible order. This is done by:
+	 * 0  if no elements in list, quit
+	 * 1  taking the first ls as pivot, remove it from list
+	 * 2  searching for a connection at from or to of pivot
+	 * 3  if found, attach it, remove it from list, goto 2
+	 * 4  if not found, save the pivot-string and goto 0
+	 */
+	public static LinkedList<Segment> sortSegments(HashSet<Segment> segmentSet) {
+		LinkedList<Segment> sortedSegments = new LinkedList<Segment>();
+		LinkedList<Segment> segments = new LinkedList<Segment>(segmentSet);
+		while (!segments.isEmpty()) {
+			LinkedList<Segment> pivotList = new LinkedList<Segment>();
+			pivotList.add(segments.getFirst());
+			segments.removeFirst();
+			for (boolean found = true; found;) {
+				found = false;
+				for (Iterator<Segment> it = segments.iterator(); it.hasNext();) {
+					Segment ls = it.next();
+					if (ls.incomplete)
+						continue; // incomplete segments are never added to a new way
+					if (ls.from == pivotList.getLast().to) {
+						pivotList.addLast(ls);
+						it.remove();
+						found = true;
+					} else if (ls.to == pivotList.getFirst().from) {
+						pivotList.addFirst(ls);
+						it.remove();
+						found = true;
+					}
+				}
+			}
+			sortedSegments.addAll(pivotList);
+		}
+	    return sortedSegments;
+    }
+}
Index: src/org/openstreetmap/josm/actions/ReverseSegmentAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/ReverseSegmentAction.java	(revision 183)
+++ src/org/openstreetmap/josm/actions/ReverseSegmentAction.java	(revision 184)
@@ -20,4 +20,6 @@
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Segment;
+import org.openstreetmap.josm.data.osm.Way;
+import org.openstreetmap.josm.data.osm.visitor.Visitor;
 
 public final class ReverseSegmentAction extends JosmAction {
@@ -28,21 +30,21 @@
 
 	public void actionPerformed(ActionEvent e) {
-    	Collection<OsmPrimitive> sel = Main.ds.getSelected();
-    	boolean hasSegments = false;
-    	for (OsmPrimitive osm : sel) {
-    		if (osm instanceof Segment) {
-    			hasSegments = true;
-    			break;
-    		}
-    	}
-    	if (!hasSegments) {
+    	final Collection<Segment> sel = new LinkedList<Segment>();
+    	new Visitor(){
+			public void visit(Node n)    {}
+			public void visit(Segment s) {sel.add(s);}
+			public void visit(Way w)     {sel.addAll(w.segments);}
+			public void visitAll() {
+				for (OsmPrimitive osm : Main.ds.getSelected())
+					osm.visit(this);
+			}
+    	}.visitAll();
+
+    	if (sel.isEmpty()) {
     		JOptionPane.showMessageDialog(Main.parent, tr("Please select at least one segment."));
     		return;
     	}
     	Collection<Command> c = new LinkedList<Command>();
-    	for (OsmPrimitive osm : sel) {
-    		if (!(osm instanceof Segment))
-    			continue;
-    		Segment s = (Segment)osm;
+    	for (Segment s : sel) {
     		Segment snew = new Segment(s);
     		Node n = snew.from;
Index: src/org/openstreetmap/josm/actions/mapmode/AddNodeAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/mapmode/AddNodeAction.java	(revision 183)
+++ src/org/openstreetmap/josm/actions/mapmode/AddNodeAction.java	(revision 184)
@@ -149,7 +149,10 @@
 				if (way != null) {
 					Way newWay = new Way(way);
-					if (way.segments.get(0).from == n1)
+					if (way.segments.get(0).from == n1) {
+						Node tmp = s.from;
+						s.from = s.to;
+						s.to = tmp;
 						newWay.segments.add(0, s);
-					else
+					} else
 						newWay.segments.add(s);
 					cmds.add(new ChangeCommand(way, newWay));
Index: src/org/openstreetmap/josm/actions/mapmode/AddWayAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/mapmode/AddWayAction.java	(revision 183)
+++ src/org/openstreetmap/josm/actions/mapmode/AddWayAction.java	(revision 184)
@@ -9,5 +9,4 @@
 import java.util.Collection;
 import java.util.HashSet;
-import java.util.Iterator;
 import java.util.LinkedList;
 
@@ -15,4 +14,5 @@
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.actions.ReorderAction;
 import org.openstreetmap.josm.command.AddCommand;
 import org.openstreetmap.josm.command.ChangeCommand;
@@ -189,35 +189,5 @@
 			return null;
 
-		// sort the segments in best possible order. This is done by:
-		// 0  if no elements in list, quit
-		// 1  taking the first ls as pivot, remove it from list
-		// 2  searching for a connection at from or to of pivot
-		// 3  if found, attach it, remove it from list, goto 2
-		// 4  if not found, save the pivot-string and goto 0
-		LinkedList<Segment> sortedSegments = new LinkedList<Segment>();
-		LinkedList<Segment> segments = new LinkedList<Segment>(segmentSet);
-		while (!segments.isEmpty()) {
-			LinkedList<Segment> pivotList = new LinkedList<Segment>();
-			pivotList.add(segments.getFirst());
-			segments.removeFirst();
-			for (boolean found = true; found;) {
-				found = false;
-				for (Iterator<Segment> it = segments.iterator(); it.hasNext();) {
-					Segment ls = it.next();
-					if (ls.incomplete)
-						continue; // incomplete segments are never added to a new way
-					if (ls.from == pivotList.getLast().to) {
-						pivotList.addLast(ls);
-						it.remove();
-						found = true;
-					} else if (ls.to == pivotList.getFirst().from) {
-						pivotList.addFirst(ls);
-						it.remove();
-						found = true;
-					}
-				}
-			}
-			sortedSegments.addAll(pivotList);
-		}
+		LinkedList<Segment> sortedSegments = ReorderAction.sortSegments(segmentSet);
 
 		if (wayToAdd != null) {
Index: src/org/openstreetmap/josm/gui/MainMenu.java
===================================================================
--- src/org/openstreetmap/josm/gui/MainMenu.java	(revision 183)
+++ src/org/openstreetmap/josm/gui/MainMenu.java	(revision 184)
@@ -20,4 +20,5 @@
 import org.openstreetmap.josm.actions.PreferencesAction;
 import org.openstreetmap.josm.actions.RedoAction;
+import org.openstreetmap.josm.actions.ReorderAction;
 import org.openstreetmap.josm.actions.ReverseSegmentAction;
 import org.openstreetmap.josm.actions.SaveAction;
@@ -48,4 +49,5 @@
 	public final Action alignInCircle = new AlignInCircleAction();
 	public final Action alignInLine = new AlignInLineAction();
+	public final Action reorder = new ReorderAction();
 	public final Action upload = new UploadAction();
 	public final Action save = new SaveAction();
@@ -87,4 +89,5 @@
 		editMenu.add(alignInCircle);
 		editMenu.add(alignInLine);
+		editMenu.add(reorder);
 		editMenu.addSeparator();
 		editMenu.add(preferences);
