Index: applications/editors/josm/plugins/tways/build.xml
===================================================================
--- applications/editors/josm/plugins/tways/build.xml	(revision 2844)
+++ applications/editors/josm/plugins/tways/build.xml	(revision 2844)
@@ -0,0 +1,30 @@
+<project name="tways" default="jar" basedir=".">
+
+  <property name="josm" location="../../core/dist/josm-custom.jar" />
+
+  <target name="compile">
+    <mkdir dir="build"></mkdir>
+    <javac srcdir="src" debug="true" classpath="${josm}" destdir="build">
+      <include name="**/*.java" />
+    </javac>
+  </target>
+
+  <target name="jar" depends="compile">
+    <jar destfile="tways.jar" basedir="build">
+      <manifest>
+        <attribute name="Plugin-Class" value="org.openstreetmap.josm.plugins.tways.TwaysPlugin" />
+        <attribute name="Plugin-Description" value="Create ways automagically" />
+      </manifest>
+    </jar>
+  </target>
+
+  <target name="clean">
+    <delete dir="build" />
+    <delete file="tways.jar" />
+  </target>
+
+  <target name="install" depends="jar">
+    <copy file="tways.jar" todir="${user.home}/.josm/plugins"/>
+  </target>
+
+</project>
Index: applications/editors/josm/plugins/tways/src/org/openstreetmap/josm/plugins/tways/CreateLinearWaysAction.java
===================================================================
--- applications/editors/josm/plugins/tways/src/org/openstreetmap/josm/plugins/tways/CreateLinearWaysAction.java	(revision 2844)
+++ applications/editors/josm/plugins/tways/src/org/openstreetmap/josm/plugins/tways/CreateLinearWaysAction.java	(revision 2844)
@@ -0,0 +1,85 @@
+package org.openstreetmap.josm.plugins.tways;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+import static org.openstreetmap.josm.tools.I18n.trn;
+
+import java.awt.event.ActionEvent;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.LinkedList;
+
+import javax.swing.AbstractAction;
+import javax.swing.JOptionPane;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.command.AddCommand;
+import org.openstreetmap.josm.command.Command;
+import org.openstreetmap.josm.command.SequenceCommand;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.Segment;
+import org.openstreetmap.josm.data.osm.Way;
+
+/**
+ * A plugin to add ways manipulation things
+ * 
+ * @author Thomas.Walraet
+ */
+class CreateLinearWaysAction extends AbstractAction {
+
+    public CreateLinearWaysAction() {
+	super("Create linear ways");
+    }
+
+    public void actionPerformed(ActionEvent e) {
+	HashSet<Segment> orphanSegments = new HashSet<Segment>();
+	for (OsmPrimitive osm : Main.ds.getSelected()) {
+	    if (osm instanceof Segment) {
+		orphanSegments.add((Segment) osm);
+	    }
+	}
+	for (Way way : Main.ds.ways) {
+	    if (!way.deleted) {
+		orphanSegments.removeAll(way.segments);
+	    }
+	}
+	
+	if (orphanSegments.isEmpty()) {
+	    JOptionPane.showMessageDialog(Main.parent, tr("You have to select some segments that don't belong to any way."));
+	    return;
+	}
+
+	int segmentCount = orphanSegments.size();
+	ParsedSegmentSet pss = new ParsedSegmentSet(Main.ds.segments);
+
+	LinkedList<Way> ways = new LinkedList<Way>();
+	Collection<Command> commands = new LinkedList<Command>();
+	while (!orphanSegments.isEmpty()) {
+	    Segment segment = orphanSegments.iterator().next();
+	    orphanSegments.remove(segment);
+	    Way way = new Way();
+	    way.segments.add(segment);
+	    Segment previousSegment = pss.getSegmentToNode(segment.from);
+	    while (previousSegment != null
+		    && orphanSegments.contains(previousSegment)
+		    && pss.isOneInOneOut(previousSegment.to)) {
+		way.segments.add(0, previousSegment);
+		orphanSegments.remove(previousSegment);
+		previousSegment = pss.getSegmentToNode(previousSegment.from);
+	    }
+	    Segment nextSegment = pss.getSegmentFromNode(segment.to);
+	    while (nextSegment != null && orphanSegments.contains(nextSegment)
+		    && pss.isOneInOneOut(nextSegment.from)) {
+		way.segments.add(nextSegment);
+		orphanSegments.remove(nextSegment);
+		nextSegment = pss.getSegmentFromNode(nextSegment.to);
+	    }
+	    ways.add(way);
+	    commands.add(new AddCommand(way));
+	}
+	
+	if (JOptionPane.YES_OPTION == JOptionPane.showConfirmDialog(Main.parent,trn("Create {0} way from {1} segments?","Create {0} ways from {1} segments?", ways.size(), ways.size(), segmentCount),tr("Create ways"), JOptionPane.YES_NO_OPTION)) {
+	    Main.main.editLayer().add(new SequenceCommand(tr("Create linear ways"), commands));
+	    Main.ds.setSelected(ways);
+	}
+    }
+}
Index: applications/editors/josm/plugins/tways/src/org/openstreetmap/josm/plugins/tways/ParsedSegmentSet.java
===================================================================
--- applications/editors/josm/plugins/tways/src/org/openstreetmap/josm/plugins/tways/ParsedSegmentSet.java	(revision 2844)
+++ applications/editors/josm/plugins/tways/src/org/openstreetmap/josm/plugins/tways/ParsedSegmentSet.java	(revision 2844)
@@ -0,0 +1,69 @@
+package org.openstreetmap.josm.plugins.tways;
+
+import java.util.Collection;
+import java.util.ArrayList;
+import java.util.HashMap;
+
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.Segment;
+import org.openstreetmap.josm.data.osm.Way;
+
+/**
+ * Parse a set of segments to provide helper functions
+ *
+ * @author Thomas.Walraet
+ */
+public class ParsedSegmentSet {
+
+    private SegmentMap outSegments = new SegmentMap();
+    private SegmentMap inSegments = new SegmentMap();
+
+    public ParsedSegmentSet(Collection<Segment> segments) {
+	for (Segment segment : segments) {
+	    if (!segment.deleted) {
+		outSegments.putSegment(segment.from, segment);
+		inSegments.putSegment(segment.to, segment);
+	    }
+	}
+    }
+
+    public Segment getSegmentFromNode(Node node) {
+	return outSegments.getSegment(node);
+    }
+
+    public Segment getSegmentToNode(Node node) {
+	return inSegments.getSegment(node);
+    }
+
+    public boolean isOneInOneOut(Node node) {
+	return outSegments.count(node) == 1 && inSegments.count(node) == 1;
+    }
+
+    class SegmentMap {
+	public HashMap<Node, ArrayList<Segment>> map = new HashMap<Node, ArrayList<Segment>>();
+
+	public void putSegment(Node node, Segment segment) {
+	    ArrayList<Segment> segmentList = map.get(node);
+	    if (segmentList == null) {
+		segmentList = new ArrayList<Segment>();
+		map.put(node, segmentList);
+	    }
+	    segmentList.add(segment);
+	}
+
+	public Segment getSegment(Node node) {
+	    ArrayList<Segment> segmentList = map.get(node);
+	    if (segmentList != null && segmentList.size() == 1) {
+		return segmentList.get(0);
+	    } else {
+		return null;
+	    }
+	}
+
+	public int count(Node node) {
+            return map.get(node) != null ? map.get(node).size() : 0;
+	}
+    }
+
+}
Index: applications/editors/josm/plugins/tways/src/org/openstreetmap/josm/plugins/tways/TwaysPlugin.java
===================================================================
--- applications/editors/josm/plugins/tways/src/org/openstreetmap/josm/plugins/tways/TwaysPlugin.java	(revision 2844)
+++ applications/editors/josm/plugins/tways/src/org/openstreetmap/josm/plugins/tways/TwaysPlugin.java	(revision 2844)
@@ -0,0 +1,25 @@
+package org.openstreetmap.josm.plugins.tways;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import javax.swing.JMenu;
+import javax.swing.JMenuBar;
+import javax.swing.JMenuItem;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.plugins.Plugin;
+
+/**
+ * A plugin to add ways manipulation things
+ *
+ * @author Thomas.Walraet
+ */
+public class TwaysPlugin extends Plugin {
+
+    public TwaysPlugin() {
+        JMenu waysMenu = new JMenu(tr("Ways"));
+        waysMenu.add(new JMenuItem(new CreateLinearWaysAction()));
+        Main.main.menu.add(waysMenu, 2);
+    }
+
+}
