Index: applications/editors/josm/plugins/navigator/src/at/dallermassl/josm/plugin/navigator/NavigatorModel.java
===================================================================
--- applications/editors/josm/plugins/navigator/src/at/dallermassl/josm/plugin/navigator/NavigatorModel.java	(revision 3829)
+++ applications/editors/josm/plugins/navigator/src/at/dallermassl/josm/plugin/navigator/NavigatorModel.java	(revision 3830)
@@ -17,4 +17,5 @@
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Segment;
+import org.openstreetmap.josm.data.osm.Way;
 
 /**
@@ -27,4 +28,5 @@
     private int selectionChangedCalls;
     List<Segment> segmentPath;
+    List<SegmentEdge> edgePath;
 
     public NavigatorModel() {
@@ -74,19 +76,64 @@
             fullWeight += routing.getPathLength();
         }
-        segmentPath = new LinkedList<Segment>();
-        synchronized(segmentPath) {
-            for (SegmentEdge edge : fullPath) {
-                segmentPath.add(edge.getSegment());
+        
+        edgePath = new ArrayList<SegmentEdge>();
+        edgePath.addAll(fullPath);
+        
+        System.out.println("shortest path found: " + fullPath + " weight: " + fullWeight);
+        System.out.println(getPathDescription());
+//        double weight2 = 0;
+//        for(Segment seg : getSegmentPath()) {
+//            weight2 += Math.sqrt(seg.from.coor.distance(seg.to.coor)) * 111000;
+//        }
+//        System.out.println("all added: " + weight2);
+    }
+    
+    public String getPathDescription() {
+        List<PathDescription> pathDescriptions = getPathDescriptions();
+        
+        // create text representation from description:
+        StringBuilder builder = new StringBuilder();
+        for(PathDescription desc : pathDescriptions) {
+            builder.append("follow ");
+            String tmp = desc.getWay().get("name");
+            if(tmp == null) {
+                builder.append("unkown street ");
+            } else {
+                builder.append(tmp).append(" ");
             }
+            tmp = desc.getWay().get("highway");
+            if(tmp != null) {
+                builder.append("(").append(tmp).append(") ");
+            }
+            builder.append("for ").append((int)desc.getLength()).append(" meters, then\n");
         }
-        Main.ds.setSelected(segmentPath);
-        Main.map.mapView.repaint();
-        System.out.println("shortest path found: " + fullPath + " weight: " + fullWeight);
-        
-        double weight2 = 0;
-        for(Segment seg : segmentPath) {
-            weight2 += Math.sqrt(seg.from.coor.distance(seg.to.coor)) * 111000;
+        builder.delete(builder.length() - ", then ".length(), builder.length());
+        return builder.toString();
+    }
+
+    /**
+     * @return
+     */
+    private List<PathDescription> getPathDescriptions() {
+        List<PathDescription> pathDescriptions = new LinkedList<PathDescription>();
+        PathDescription description;
+        double length = 0;
+        Way oldWay = null;
+        Way way = null;
+        for(SegmentEdge edge : edgePath) {
+            way = edge.getWay();
+            length += edge.getLengthInM();
+            if(oldWay != null && !oldWay.equals(way)) {
+                description = new PathDescription(oldWay, length);
+                pathDescriptions.add(description);
+                length = 0;
+            }
+            oldWay = way;
         }
-        System.out.println("all added: " + weight2);
+        if(way != null) {
+            description = new PathDescription(way, length);
+            pathDescriptions.add(description);
+        }
+        return pathDescriptions;
     }
 
@@ -101,8 +148,16 @@
 
     /**
-     * @return the segmentPath
+     * @return the segmentPath or <code>null</code>.
      */
     public List<Segment> getSegmentPath() {
-        return this.segmentPath;
+        if(segmentPath == null && edgePath != null) {
+            segmentPath = new LinkedList<Segment>();
+            synchronized(segmentPath) {
+                for (SegmentEdge edge : edgePath) {
+                    segmentPath.add(edge.getSegment());
+                }
+            }
+        }
+        return segmentPath;
     }
 
@@ -115,10 +170,19 @@
         nodes.add(node);
     }
+
+    /**
+     * @return the edgePath
+     */
+    public List<SegmentEdge> getEdgePath() {
+        return this.edgePath;
+    }
     
     /**
-     * Clear all nodes to navigate. 
+     * Resets all data (nodes, edges, segments).
      */
-    public void clearNodes() {
-        nodes.clear();        
+    public void reset() {
+        segmentPath = null;
+        edgePath = null;
+        nodes.clear();
     }
 
