Index: /applications/editors/josm/plugins/undelete/src/org/openstreetmap/josm/plugins/undelete/Undelete.java
===================================================================
--- /applications/editors/josm/plugins/undelete/src/org/openstreetmap/josm/plugins/undelete/Undelete.java	(revision 21123)
+++ /applications/editors/josm/plugins/undelete/src/org/openstreetmap/josm/plugins/undelete/Undelete.java	(revision 21124)
@@ -13,4 +13,5 @@
 import java.util.LinkedList;
 import java.util.ArrayList;
+import java.util.List;
 
 import javax.swing.JCheckBox;
@@ -42,4 +43,5 @@
 import org.openstreetmap.josm.data.osm.history.HistoryNode;
 import org.openstreetmap.josm.data.osm.history.HistoryOsmPrimitive;
+import org.openstreetmap.josm.data.osm.history.HistoryWay;
 import org.openstreetmap.josm.gui.ExtendedDialog;
 import org.openstreetmap.josm.gui.MainMenu;
@@ -119,5 +121,7 @@
         Main.pref.put("undelete.newlayer", layer.isSelected());
         Main.pref.putInteger("undelete.osmid", tfId.getOsmId());
-        undelete(layer.isSelected(), cbType.getType(), tfId.getOsmId());
+        List<Long> ids=new ArrayList<Long>();
+        ids.add((long)tfId.getOsmId());
+        undelete(layer.isSelected(), cbType.getType(), ids, 0);
       }
     }      
@@ -126,5 +130,5 @@
      * Download the given primitive.
      */
-    public void undelete(boolean newLayer, final OsmPrimitiveType type, final long id) {
+    public void undelete(boolean newLayer, final OsmPrimitiveType type, final List<Long> ids, final long parent) {
         OsmDataLayer layer = Main.main.getEditLayer();
         if ((layer == null) || newLayer) {
@@ -136,5 +140,9 @@
         
         HistoryLoadTask task  = new HistoryLoadTask();
-        task.add (id, type);
+        for (long id: ids)
+        {
+          task.add (id, type);
+        }
+
         
         
@@ -143,26 +151,61 @@
         Runnable r = new Runnable() {
             public void run() {
+              List<Node> nodes=new ArrayList<Node>();
+              for (long id: ids)
+              {
+
                 History h = HistoryDataSet.getInstance().getHistory(id, type);
                 
                 OsmPrimitive primitive;
-                HistoryOsmPrimitive hPrimitive=h.getLatest();
+                HistoryOsmPrimitive hPrimitive1;
+                HistoryOsmPrimitive hPrimitive2;
                 
                 if (type.equals(OsmPrimitiveType.NODE))
                 {
-                  HistoryNode hNode = (HistoryNode) hPrimitive;
-                  
-                  Node node = new Node(id, (int) hNode.getVersion());
+                  // We get all info from the latest version
+                  hPrimitive1=h.getLatest();
+                  hPrimitive2=hPrimitive1;
+                  
+                  Node node = new Node(id, (int) hPrimitive1.getVersion());
+
+                  HistoryNode hNode = (HistoryNode) hPrimitive1;
                   node.setCoor(hNode.getCoords());
                   
                   primitive=node;
+                  if (parent>0)
+                  {
+                    nodes.add(node);
+                  }
+                }
+                else if (type.equals(OsmPrimitiveType.WAY))
+                {
+                  // We get version and user from the latest version, nodes and tags from n-1 version
+                  hPrimitive1 = h.getLatest();
+                  hPrimitive2 = h.getByVersion(h.getNumVersions()-1);
+
+                  
+                  
+                  Way way = new Way(id, (int) hPrimitive1.getVersion());
+                  
+                  HistoryWay hWay = (HistoryWay) hPrimitive2;
+                  //System.out.println(tr("Primitive {0} version {1}: {2} nodes", hPrimitive2.getId(), hPrimitive2.getVersion(), hWay.getNumNodes()));
+                  List<Long> nodeIds = hWay.getNodes();
+                  undelete(false, OsmPrimitiveType.NODE, nodeIds, id);
+                  
+                  primitive=way;
+                  
                 }
                 else
-                { primitive=new Node();}
-                
-                primitive.setKeys(hPrimitive.getTags());
-                
-                User user = User.createOsmUser(hPrimitive.getUid(), hPrimitive.getUser());
+                { 
+                    primitive=new Node();
+                    hPrimitive1=h.getLatest();
+                    hPrimitive2=h.getLatest();
+                }
+
+                User user = User.createOsmUser(hPrimitive1.getUid(), hPrimitive1.getUser());
                 
                 primitive.setUser(user);
+                
+                primitive.setKeys(hPrimitive2.getTags());
                 
                 primitive.setModified(true);
@@ -170,4 +213,11 @@
                 datas.addPrimitive(primitive);                
                 //HistoryBrowserDialogManager.getInstance().show(h);
+              }
+              if ((parent>0) && (type.equals(OsmPrimitiveType.NODE)))
+              {
+                Way parentWay=(Way)datas.getPrimitiveById(parent, OsmPrimitiveType.WAY);
+                
+                parentWay.setNodes(nodes);
+              }
             }
         };
