Index: /applications/editors/josm/plugins/undelete/.classpath
===================================================================
--- /applications/editors/josm/plugins/undelete/.classpath	(revision 29473)
+++ /applications/editors/josm/plugins/undelete/.classpath	(revision 29474)
@@ -2,5 +2,5 @@
 <classpath>
 	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
 	<classpathentry combineaccessrules="false" kind="src" path="/JOSM"/>
 	<classpathentry kind="output" path="bin"/>
Index: /applications/editors/josm/plugins/undelete/.settings/org.eclipse.jdt.core.prefs
===================================================================
--- /applications/editors/josm/plugins/undelete/.settings/org.eclipse.jdt.core.prefs	(revision 29474)
+++ /applications/editors/josm/plugins/undelete/.settings/org.eclipse.jdt.core.prefs	(revision 29474)
@@ -0,0 +1,95 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
+org.eclipse.jdt.core.compiler.problem.nullReference=warning
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.6
Index: /applications/editors/josm/plugins/undelete/build.xml
===================================================================
--- /applications/editors/josm/plugins/undelete/build.xml	(revision 29473)
+++ /applications/editors/josm/plugins/undelete/build.xml	(revision 29474)
@@ -1,33 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!--
-** This is a template build file for a JOSM  plugin.
-**
-** Maintaining versions
-** ====================
-** see README.template
-**
-** Usage
-** =====
-** To build it run
-**
-**    > ant  dist
-**
-** To install the generated plugin locally (in you default plugin directory) run
-**
-**    > ant  install
-**
-** The generated plugin jar is not automatically available in JOSMs plugin configuration
-** dialog. You have to check it in first.
-**
-** Use the ant target 'publish' to check in the plugin and make it available to other
-** JOSM users:
-**    set the properties commit.message and plugin.main.version
-** and run
-**    > ant  publish
-**
-**
--->
 <project name="undelete" default="dist" basedir=".">
-
     <!-- enter the SVN commit message -->
     <property name="commit.message" value="adapt to core changes (backwards compatible)"/>
@@ -35,49 +6,12 @@
     <property name="plugin.main.version" value="5211"/>
 
-    <!--
-    **********************************************************
-    ** include targets that all plugins have in common
-    **********************************************************
-    -->
+    <property name="plugin.author" value="Nakor"/>
+    <property name="plugin.class" value="org.openstreetmap.josm.plugins.undelete.Undelete"/>
+    <property name="plugin.description" value="Allows undeleting object from OSM database"/>
+    <property name="plugin.icon" value="images/undelete.png"/>
+    <property name="plugin.link" value="http://wiki.openstreetmap.org/wiki/JOSM/Plugins/Undelete"/>
+
+    <!-- ** include targets that all plugins have in common ** -->
     <import file="../build-common.xml"/>
 
-    <!--
-    **********************************************************
-    ** dist - creates the plugin jar
-    **********************************************************
-    -->
-    <target name="dist" depends="compile,revision">
-        <echo message="creating ${plugin.jar.name} ... "/>
-        <copy todir="${plugin.build.dir}/images">
-            <fileset dir="images"/>
-        </copy>
-        <copy todir="${plugin.build.dir}/data">
-            <fileset dir="data"/>
-        </copy>
-        <copy todir="${plugin.build.dir}">
-            <fileset dir=".">
-                <include name="README"/>
-                <include name="LICENSE"/>
-            </fileset>
-        </copy>
-        <jar destfile="${plugin.jar}" basedir="${plugin.build.dir}">
-        <!--
-        ************************************************
-        ** configure these properties. Most of them will be copied to the plugins
-        ** manifest file. Property values will also show up in the list available
-        ** plugins: http://josm.openstreetmap.de/wiki/Plugins.
-        **
-        ************************************************
-        -->
-            <manifest>
-                <attribute name="Author" value="Nakor"/>
-                <attribute name="Plugin-Class" value="org.openstreetmap.josm.plugins.undelete.Undelete"/>
-                <attribute name="Plugin-Date" value="${version.entry.commit.date}"/>
-                <attribute name="Plugin-Description" value="Allows undeleting object from OSM database"/>
-                <attribute name="Plugin-Link" value="http://wiki.openstreetmap.org/wiki/JOSM/Plugins/Undelete"/>
-                <attribute name="Plugin-Mainversion" value="${plugin.main.version}"/>
-                <attribute name="Plugin-Version" value="${version.entry.commit.revision}"/>
-            </manifest>
-        </jar>
-    </target>
 </project>
Index: plications/editors/josm/plugins/undelete/src/org/openstreetmap/josm/plugins/undelete/DownloadPrimitiveTask.java
===================================================================
--- /applications/editors/josm/plugins/undelete/src/org/openstreetmap/josm/plugins/undelete/DownloadPrimitiveTask.java	(revision 29473)
+++ 	(revision )
@@ -1,108 +1,0 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.plugins.undelete;
-
-import static org.openstreetmap.josm.tools.CheckParameterUtil.ensureParameterNotNull;
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.io.IOException;
-import java.lang.reflect.InvocationTargetException;
-
-import javax.swing.SwingUtilities;
-
-import org.openstreetmap.josm.actions.AutoScaleAction;
-import org.openstreetmap.josm.data.osm.DataSet;
-import org.openstreetmap.josm.data.osm.PrimitiveId;
-import org.openstreetmap.josm.gui.ExceptionDialogUtil;
-import org.openstreetmap.josm.gui.PleaseWaitRunnable;
-import org.openstreetmap.josm.gui.layer.OsmDataLayer;
-import org.openstreetmap.josm.gui.progress.ProgressMonitor;
-import org.openstreetmap.josm.io.OsmServerObjectReader;
-import org.openstreetmap.josm.io.OsmTransferException;
-import org.xml.sax.SAXException;
-
-/**
- * The asynchronous task for updating a collection of objects using multi fetch.
- *
- */
-//TODO This should be probably easily replacable by org.openstreetmap.josm.gui.io.DownloadPrimitivesTask
-public class DownloadPrimitiveTask extends PleaseWaitRunnable {
-    private DataSet ds;
-    private boolean canceled;
-    private Exception lastException;
-    private PrimitiveId primitiveId;
-    private OsmDataLayer layer;
-    private OsmServerObjectReader reader;
-
-    /**
-     * Creates the  task
-     *
-     * @param layer the layer in which primitives are updated. Must not be null.
-     * @param toUpdate a collection of primitives to update from the server. Set to
-     * the empty collection if null.
-     * @throws IllegalArgumentException thrown if layer is null.
-     */
-    public DownloadPrimitiveTask(PrimitiveId id, OsmDataLayer layer) {
-        super(tr("Download object"), false /* don't ignore exception */);
-        ensureParameterNotNull(layer, "layer");
-        this.layer = layer;
-        this.primitiveId = id;
-    }
-
-    @Override
-    protected void cancel() {
-        canceled = true;
-        synchronized(this) {
-            if (reader != null) {
-                reader.cancel();
-            }
-        }
-    }
-
-    @Override
-    protected void finish() {
-        if (canceled)
-            return;
-        if (lastException != null) {
-            ExceptionDialogUtil.explainException(lastException);
-            return;
-        }
-        Runnable r = new Runnable() {
-            public void run() {
-                layer.mergeFrom(ds);
-                layer.onPostDownloadFromServer();
-                AutoScaleAction.zoomTo(ds.allPrimitives());
-            }
-        };
-
-        if (SwingUtilities.isEventDispatchThread()) {
-            r.run();
-        } else {
-            try {
-                SwingUtilities.invokeAndWait(r);
-            } catch(InterruptedException e) {
-                e.printStackTrace();
-            } catch(InvocationTargetException e) {
-                e.printStackTrace();
-            }
-        }
-    }
-
-    @Override
-    protected void realRun() throws SAXException, IOException, OsmTransferException {
-        this.ds = new DataSet();
-        try {
-            synchronized(this) {
-                if (canceled) return;
-                reader = new OsmServerObjectReader(primitiveId, true);
-            }
-            ds = reader.parseOsm(progressMonitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false));
-            synchronized(this) {
-                reader = null;
-            }
-        } catch(Exception e) {
-            if (canceled)
-                return;
-            lastException = e;
-        }
-    }
-}
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 29473)
+++ /applications/editors/josm/plugins/undelete/src/org/openstreetmap/josm/plugins/undelete/Undelete.java	(revision 29474)
@@ -1,273 +1,15 @@
 // License: GPL. See LICENSE file for details.
-// Derived from DownloadPrimitiveAction by Matthias Julius
-
 package org.openstreetmap.josm.plugins.undelete;
 
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.awt.GridBagConstraints;
-import java.awt.GridBagLayout;
-import java.awt.event.ActionEvent;
-import java.awt.event.KeyEvent;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.swing.JCheckBox;
-import javax.swing.JLabel;
-import javax.swing.JMenuItem;
-import javax.swing.JPanel;
-import javax.swing.KeyStroke;
-
 import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.actions.JosmAction;
-import org.openstreetmap.josm.data.osm.DataSet;
-import org.openstreetmap.josm.data.osm.Node;
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
-import org.openstreetmap.josm.data.osm.PrimitiveId;
-import org.openstreetmap.josm.data.osm.Relation;
-import org.openstreetmap.josm.data.osm.RelationMember;
-import org.openstreetmap.josm.data.osm.RelationMemberData;
-import org.openstreetmap.josm.data.osm.SimplePrimitiveId;
-import org.openstreetmap.josm.data.osm.User;
-import org.openstreetmap.josm.data.osm.Way;
-import org.openstreetmap.josm.data.osm.history.History;
-import org.openstreetmap.josm.data.osm.history.HistoryDataSet;
-import org.openstreetmap.josm.data.osm.history.HistoryNode;
-import org.openstreetmap.josm.data.osm.history.HistoryOsmPrimitive;
-import org.openstreetmap.josm.data.osm.history.HistoryRelation;
-import org.openstreetmap.josm.data.osm.history.HistoryWay;
-import org.openstreetmap.josm.gui.ExtendedDialog;
 import org.openstreetmap.josm.gui.MainMenu;
-import org.openstreetmap.josm.gui.history.HistoryLoadTask;
-import org.openstreetmap.josm.gui.layer.OsmDataLayer;
-import org.openstreetmap.josm.gui.widgets.OsmIdTextField;
-import org.openstreetmap.josm.gui.widgets.OsmPrimitiveTypesComboBox;
 import org.openstreetmap.josm.plugins.Plugin;
 import org.openstreetmap.josm.plugins.PluginInformation;
-import org.openstreetmap.josm.tools.Shortcut;
-
-/**
- *  // TODO: undelete relation members if necessary
- */
 
 public class Undelete extends Plugin {
-    JMenuItem Undelete;
 
     public Undelete(PluginInformation info) {
         super(info);
-        Undelete = MainMenu.addAfter(Main.main.menu.fileMenu, new UndeleteAction(), false, Main.main.menu.updateModified);
-
-    }
-
-
-    private class UndeleteAction extends JosmAction {
-        /**
-         *
-         */
-        private static final long serialVersionUID = 1L;
-        public UndeleteAction() {
-        super(tr("Undelete object..."), "undelete", tr("Undelete object by id"), Shortcut.registerShortcut("tools:undelete", tr("File: {0}", tr("Undelete object...")),
-        KeyEvent.VK_U, Shortcut.ALT_SHIFT), true);
-      }
-
-      @Override
-	public void actionPerformed(ActionEvent e) {
-        JCheckBox layer = new JCheckBox(tr("Separate Layer"));
-        layer.setToolTipText(tr("Select if the data should be added into a new layer"));
-        layer.setSelected(Main.pref.getBoolean("undelete.newlayer"));
-        JPanel all = new JPanel(new GridBagLayout());
-        GridBagConstraints gc = new GridBagConstraints();
-        gc.fill = GridBagConstraints.HORIZONTAL;
-        gc.anchor = GridBagConstraints.FIRST_LINE_START;
-        gc.gridy = 0;
-        gc.weightx = 0;
-        all.add(new JLabel(tr("Object ID:")), gc);
-        OsmIdTextField tfId = new OsmIdTextField();
-        tfId.setText(Main.pref.get("undelete.osmid"));
-        tfId.setToolTipText(tr("Enter the type and ID of the objects that should be undeleted, e.g., ''n1 w2''"));
-        // forward the enter key stroke to the undelete button
-        tfId.getKeymap().removeKeyStrokeBinding(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0, false));
-        gc.weightx = 1;
-        all.add(tfId, gc);
-        gc.gridy++;
-        gc.fill = GridBagConstraints.BOTH;
-        gc.weighty = 1.0;
-        gc.weightx = 0;
-        gc.gridy++;
-        all.add(layer, gc);
-        ExtendedDialog dialog = new ExtendedDialog(Main.parent,
-                tr("Undelete Object"),
-                new String[] {tr("Undelete object"), tr("Cancel")}
-        );
-        dialog.setContent(all, false);
-        dialog.setButtonIcons(new String[] {"undelete.png", "cancel.png"});
-        dialog.setToolTipTexts(new String[] {
-                tr("Start undeleting"),
-                tr("Close dialog and cancel")
-        });
-        dialog.setDefaultButton(1);
-        //dialog.configureContextsensitiveHelp("/Action/DownloadObject", true /* show help button */);
-        dialog.showDialog();
-        if (dialog.getValue() != 1) return;
-        Main.pref.put("undelete.newlayer", layer.isSelected());
-        Main.pref.put("undelete.osmid", tfId.getText());
-        undelete(layer.isSelected(), tfId.getIds(), 0);
-      }
-    }
-
-    /**
-     * Download the given primitive.
-     */
-    public void undelete(boolean newLayer, final List<PrimitiveId> ids, final long parent) {
-        OsmDataLayer tmpLayer = Main.main.getEditLayer();
-        if ((tmpLayer == null) || newLayer) {
-            tmpLayer = new OsmDataLayer(new DataSet(), OsmDataLayer.createNewName(), null);
-            Main.main.addLayer(tmpLayer);
-        }
-
-        final DataSet datas = tmpLayer.data;
-        final OsmDataLayer layer=tmpLayer;
-
-        HistoryLoadTask task  = new HistoryLoadTask();
-        for (PrimitiveId id: ids) {
-            task.add(id);
-        }
-
-
-
-        Main.worker.execute(task);
-
-        Runnable r = new Runnable() {
-            @Override
-            public void run() {
-              List<Node> nodes=new ArrayList<Node>();
-              for (PrimitiveId pid: ids)
-              {
-
-                final Long id = pid.getUniqueId();
-                final OsmPrimitiveType type = pid.getType();
-
-                History h = HistoryDataSet.getInstance().getHistory(id, type);
-
-                OsmPrimitive primitive;
-                HistoryOsmPrimitive hPrimitive1=h.getLatest();
-                HistoryOsmPrimitive hPrimitive2;
-
-                boolean visible=hPrimitive1.isVisible();
-
-                if (visible)
-                {
-                  // If the object is not deleted we get the real object
-                  DownloadPrimitiveTask download=new DownloadPrimitiveTask(pid, layer);
-                  System.out.println(tr("Will get {0}", pid));
-                  download.run();
-
-
-                  System.out.println(tr("Looking for {0}", pid));
-                  primitive=datas.getPrimitiveById(id, type);
-                  System.out.println(tr("Found {0}", String.valueOf(primitive.getId())));
-                  if (parent>0 && type.equals(OsmPrimitiveType.NODE))
-                  {
-                      nodes.add((Node)primitive);
-                  }
-                }
-                else
-                {
-                  if (type.equals(OsmPrimitiveType.NODE))
-                  {
-                    // We get version and user from the latest version, coordinates and tags from n-1 version
-                    hPrimitive2=h.getByVersion(h.getNumVersions()-1);
-
-                    Node node = new Node(id, (int) hPrimitive1.getVersion());
-
-                    HistoryNode hNode = (HistoryNode) hPrimitive2;
-                    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<PrimitiveId> nodeIds = new ArrayList<PrimitiveId>();
-                    for (Long i: hWay.getNodes()) {
-                        nodeIds.add(new SimplePrimitiveId(i, OsmPrimitiveType.NODE));
-                    }
-                    undelete(false, nodeIds, id);
-
-                    primitive=way;
-
-                  }
-                  else
-                  {
-                      primitive=new Relation();
-                      hPrimitive1=h.getLatest();
-                      hPrimitive2=h.getByVersion(h.getNumVersions()-1);
-
-                      Relation rel = new Relation(id, (int) hPrimitive1.getVersion());
-
-                      HistoryRelation hRel = (HistoryRelation) hPrimitive2;
-
-                      List<RelationMember> members = new ArrayList<RelationMember>(hRel.getNumMembers());
-                      for (RelationMemberData m : hRel.getMembers()) {
-                        OsmPrimitive p = datas.getPrimitiveById(m.getMemberId(), m.getMemberType());
-                        if (p == null) {
-                            switch (m.getMemberType()) {
-                            case NODE: p = new Node(m.getMemberId()); break;
-                            case WAY: p = new Way(m.getMemberId()); break;
-                            case RELATION: p = new Relation(m.getMemberId()); break;
-                            }
-                            datas.addPrimitive(p);
-                        }
-                        members.add(new RelationMember(m.getRole(), p));
-                      }
-
-                      rel.setMembers(members);
-
-                      primitive=rel;
-                  }
-
-                  User user = hPrimitive1.getUser();
-
-                  primitive.setUser(user);
-
-                  primitive.setKeys(hPrimitive2.getTags());
-
-                  primitive.put("history", "retrieved using undelete JOSM plugin");
-
-                  primitive.setModified(true);
-
-                  datas.addPrimitive(primitive);
-                }
-
-
-                //HistoryBrowserDialogManager.getInstance().show(h);
-              }
-              if (parent>0 && !ids.isEmpty() && ids.iterator().next().getType().equals(OsmPrimitiveType.NODE))
-              {
-                Way parentWay=(Way)datas.getPrimitiveById(parent, OsmPrimitiveType.WAY);
-
-                parentWay.setNodes(nodes);
-              }
-            }
-        };
-        Main.worker.submit(r);
-
-        //if (downloadReferrers) {
-        //    Main.worker.submit(new DownloadReferrersTask(layer, id, type));
-        //}
+        MainMenu.addAfter(Main.main.menu.fileMenu, new UndeleteAction(), false, Main.main.menu.updateModified);
     }
 }
Index: /applications/editors/josm/plugins/undelete/src/org/openstreetmap/josm/plugins/undelete/UndeleteAction.java
===================================================================
--- /applications/editors/josm/plugins/undelete/src/org/openstreetmap/josm/plugins/undelete/UndeleteAction.java	(revision 29474)
+++ /applications/editors/josm/plugins/undelete/src/org/openstreetmap/josm/plugins/undelete/UndeleteAction.java	(revision 29474)
@@ -0,0 +1,193 @@
+// License: GPL. See LICENSE file for details.
+package org.openstreetmap.josm.plugins.undelete;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.KeyEvent;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.actions.JosmAction;
+import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
+import org.openstreetmap.josm.data.osm.PrimitiveId;
+import org.openstreetmap.josm.data.osm.Relation;
+import org.openstreetmap.josm.data.osm.RelationMember;
+import org.openstreetmap.josm.data.osm.RelationMemberData;
+import org.openstreetmap.josm.data.osm.SimplePrimitiveId;
+import org.openstreetmap.josm.data.osm.Way;
+import org.openstreetmap.josm.data.osm.history.History;
+import org.openstreetmap.josm.data.osm.history.HistoryDataSet;
+import org.openstreetmap.josm.data.osm.history.HistoryNode;
+import org.openstreetmap.josm.data.osm.history.HistoryOsmPrimitive;
+import org.openstreetmap.josm.data.osm.history.HistoryRelation;
+import org.openstreetmap.josm.data.osm.history.HistoryWay;
+import org.openstreetmap.josm.gui.history.HistoryLoadTask;
+import org.openstreetmap.josm.gui.io.DownloadPrimitivesTask;
+import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+import org.openstreetmap.josm.tools.Shortcut;
+
+public class UndeleteAction extends JosmAction {
+
+    public UndeleteAction() {
+        super(tr("Undelete object..."), "undelete", tr("Undelete object by id"), 
+                Shortcut.registerShortcut("tools:undelete", tr("File: {0}", tr("Undelete object...")), KeyEvent.VK_U, Shortcut.ALT_SHIFT), true);
+    }
+
+    @Override
+    public void actionPerformed(ActionEvent e) {
+        UndeleteDialog dialog = new UndeleteDialog(Main.parent);
+        if (dialog.showDialog().getValue() != 1)
+            return;
+        Main.pref.put("undelete.newlayer", dialog.isNewLayerSelected());
+        Main.pref.put("undelete.osmid", dialog.getOsmIdsString());
+        undelete(dialog.isNewLayerSelected(), dialog.getOsmIds(), 0);
+    }
+    
+    /**
+     * // TODO: undelete relation members if necessary
+     */
+    public void undelete(boolean newLayer, final List<PrimitiveId> ids, final long parent) {
+        OsmDataLayer tmpLayer = Main.main.getEditLayer();
+        if ((tmpLayer == null) || newLayer) {
+            tmpLayer = new OsmDataLayer(new DataSet(), OsmDataLayer.createNewName(), null);
+            Main.main.addLayer(tmpLayer);
+        }
+
+        final DataSet datas = tmpLayer.data;
+        final OsmDataLayer layer = tmpLayer;
+
+        HistoryLoadTask task = new HistoryLoadTask();
+        for (PrimitiveId id : ids) {
+            task.add(id);
+        }
+
+        Main.worker.execute(task);
+
+        Runnable r = new Runnable() {
+            @Override
+            public void run() {
+                List<Node> nodes = new ArrayList<Node>();
+                for (PrimitiveId pid : ids) {
+
+                    final Long id = pid.getUniqueId();
+                    final OsmPrimitiveType type = pid.getType();
+
+                    History h = HistoryDataSet.getInstance().getHistory(id, type);
+
+                    OsmPrimitive primitive;
+                    HistoryOsmPrimitive hPrimitive1 = h.getLatest();
+                    HistoryOsmPrimitive hPrimitive2;
+
+                    boolean visible = hPrimitive1.isVisible();
+
+                    if (visible) {
+                        // If the object is not deleted we get the real object
+                        DownloadPrimitivesTask download = new DownloadPrimitivesTask(layer, Collections.singletonList(pid), true);
+                        System.out.println(tr("Will get {0}", pid));
+                        download.run();
+
+                        System.out.println(tr("Looking for {0}", pid));
+                        primitive = datas.getPrimitiveById(id, type);
+                        System.out.println(tr("Found {0}", String.valueOf(primitive.getId())));
+                        if (parent > 0 && type.equals(OsmPrimitiveType.NODE)) {
+                            nodes.add((Node) primitive);
+                        }
+                    } else {
+                        if (type.equals(OsmPrimitiveType.NODE)) {
+                            // We get version and user from the latest version,
+                            // coordinates and tags from n-1 version
+                            hPrimitive2 = h.getByVersion(h.getNumVersions() - 1);
+
+                            Node node = new Node(id, (int) hPrimitive1.getVersion());
+
+                            HistoryNode hNode = (HistoryNode) hPrimitive2;
+                            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<PrimitiveId> nodeIds = new ArrayList<PrimitiveId>();
+                            for (Long i : hWay.getNodes()) {
+                                nodeIds.add(new SimplePrimitiveId(i, OsmPrimitiveType.NODE));
+                            }
+                            undelete(false, nodeIds, id);
+
+                            primitive = way;
+                        } else {
+                            primitive = new Relation();
+                            hPrimitive1 = h.getLatest();
+                            hPrimitive2 = h.getByVersion(h.getNumVersions() - 1);
+
+                            Relation rel = new Relation(id,(int) hPrimitive1.getVersion());
+
+                            HistoryRelation hRel = (HistoryRelation) hPrimitive2;
+
+                            List<RelationMember> members = new ArrayList<RelationMember>(hRel.getNumMembers());
+                            for (RelationMemberData m : hRel.getMembers()) {
+                                OsmPrimitive p = datas.getPrimitiveById(m.getMemberId(), m.getMemberType());
+                                if (p == null) {
+                                    switch (m.getMemberType()) {
+                                    case NODE:
+                                        p = new Node(m.getMemberId());
+                                        break;
+                                    case CLOSEDWAY:
+                                    case WAY:
+                                        p = new Way(m.getMemberId());
+                                        break;
+                                    case MULTIPOLYGON:
+                                    case RELATION:
+                                        p = new Relation(m.getMemberId());
+                                        break;
+                                    }
+                                    datas.addPrimitive(p);
+                                }
+                                members.add(new RelationMember(m.getRole(), p));
+                            }
+
+                            rel.setMembers(members);
+
+                            primitive = rel;
+                        }
+
+                        primitive.setUser(hPrimitive1.getUser());
+                        primitive.setKeys(hPrimitive2.getTags());
+                        primitive.put("history", "retrieved using undelete JOSM plugin");
+                        primitive.setModified(true);
+
+                        datas.addPrimitive(primitive);
+                    }
+
+                    // HistoryBrowserDialogManager.getInstance().show(h);
+                }
+                if (parent > 0 && !ids.isEmpty() && ids.iterator().next().getType().equals(OsmPrimitiveType.NODE)) {
+                    Way parentWay = (Way) datas.getPrimitiveById(parent, OsmPrimitiveType.WAY);
+                    parentWay.setNodes(nodes);
+                }
+            }
+        };
+        Main.worker.submit(r);
+
+        // if (downloadReferrers) {
+        // Main.worker.submit(new DownloadReferrersTask(layer, id, type));
+        // }
+    }
+}
Index: /applications/editors/josm/plugins/undelete/src/org/openstreetmap/josm/plugins/undelete/UndeleteDialog.java
===================================================================
--- /applications/editors/josm/plugins/undelete/src/org/openstreetmap/josm/plugins/undelete/UndeleteDialog.java	(revision 29474)
+++ /applications/editors/josm/plugins/undelete/src/org/openstreetmap/josm/plugins/undelete/UndeleteDialog.java	(revision 29474)
@@ -0,0 +1,70 @@
+// License: GPL. See LICENSE file for details.
+package org.openstreetmap.josm.plugins.undelete;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.Component;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.event.KeyEvent;
+import java.util.List;
+
+import javax.swing.JCheckBox;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.KeyStroke;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.osm.PrimitiveId;
+import org.openstreetmap.josm.gui.ExtendedDialog;
+import org.openstreetmap.josm.gui.widgets.OsmIdTextField;
+
+public class UndeleteDialog extends ExtendedDialog {
+
+    private final JCheckBox layer = new JCheckBox(tr("Separate Layer"));
+    private final OsmIdTextField tfId = new OsmIdTextField();
+    
+    public UndeleteDialog(Component parent) {
+        super(parent, tr("Undelete Object"), new String[] {tr("Undelete object"), tr("Cancel")});
+        
+        JPanel all = new JPanel(new GridBagLayout());
+        GridBagConstraints gc = new GridBagConstraints();
+        gc.fill = GridBagConstraints.HORIZONTAL;
+        gc.anchor = GridBagConstraints.FIRST_LINE_START;
+        gc.gridy = 0;
+        gc.weightx = 0;
+        all.add(new JLabel(tr("Object ID:")), gc);
+        
+        tfId.setText(Main.pref.get("undelete.osmid"));
+        tfId.setToolTipText(tr("Enter the type and ID of the objects that should be undeleted, e.g., ''n1 w2''"));
+        // forward the enter key stroke to the undelete button
+        tfId.getKeymap().removeKeyStrokeBinding(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0, false));
+        gc.weightx = 1;
+        all.add(tfId, gc);
+        gc.gridy++;
+        gc.fill = GridBagConstraints.BOTH;
+        gc.weighty = 1.0;
+        gc.weightx = 0;
+        gc.gridy++;
+
+        layer.setToolTipText(tr("Select if the data should be added into a new layer"));
+        layer.setSelected(Main.pref.getBoolean("undelete.newlayer"));
+        all.add(layer, gc);
+        setContent(all, false);
+        setButtonIcons(new String[] { "undelete.png", "cancel.png" });
+        setToolTipTexts(new String[] { tr("Start undeleting"), tr("Close dialog and cancel") });
+        setDefaultButton(1);
+    }
+    
+    public final boolean isNewLayerSelected() {
+        return layer.isSelected();
+    }
+    
+    public final String getOsmIdsString() {
+        return tfId.getText();
+    }
+    
+    public final List<PrimitiveId> getOsmIds() {
+        return tfId.getIds();
+    }
+}
