Index: applications/editors/josm/plugins/undelete/.checkstyle
===================================================================
--- applications/editors/josm/plugins/undelete/.checkstyle	(revision 32552)
+++ applications/editors/josm/plugins/undelete/.checkstyle	(revision 32552)
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<fileset-config file-format-version="1.2.0" simple-config="true" sync-formatter="false">
+  <local-check-config name="JOSM" location="/JOSM/tools/checkstyle/josm_checks.xml" type="project" description="">
+    <additional-data name="protect-config-file" value="false"/>
+  </local-check-config>
+  <fileset name="all" enabled="true" check-config-name="JOSM" local="true">
+    <file-match-pattern match-pattern="." include-pattern="true"/>
+  </fileset>
+  <filter name="DerivedFiles" enabled="true"/>
+  <filter name="FilesFromPackage" enabled="true">
+    <filter-data value="src/com"/>
+    <filter-data value="src/gnu"/>
+    <filter-data value="src/javax"/>
+    <filter-data value="src/oauth"/>
+    <filter-data value="src/org/apache"/>
+    <filter-data value="src/org/glassfish"/>
+    <filter-data value="src/org/jdesktop"/>
+    <filter-data value="src/org/openstreetmap/gui"/>
+    <filter-data value="src/org/openstreetmap/josm/gui/mappaint/mapcss/parsergen"/>
+    <filter-data value="src/org/w3"/>
+    <filter-data value="data"/>
+    <filter-data value="images"/>
+    <filter-data value="styles"/>
+    <filter-data value="resources"/>
+    <filter-data value="scripts"/>
+  </filter>
+</fileset-config>
Index: applications/editors/josm/plugins/undelete/.project
===================================================================
--- applications/editors/josm/plugins/undelete/.project	(revision 32551)
+++ applications/editors/josm/plugins/undelete/.project	(revision 32552)
@@ -16,7 +16,13 @@
 			</arguments>
 		</buildCommand>
+		<buildCommand>
+			<name>net.sf.eclipsecs.core.CheckstyleBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
 	</buildSpec>
 	<natures>
 		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>net.sf.eclipsecs.core.CheckstyleNature</nature>
 	</natures>
 </projectDescription>
Index: applications/editors/josm/plugins/undelete/.settings/org.eclipse.jdt.ui.prefs
===================================================================
--- applications/editors/josm/plugins/undelete/.settings/org.eclipse.jdt.ui.prefs	(revision 32552)
+++ applications/editors/josm/plugins/undelete/.settings/org.eclipse.jdt.ui.prefs	(revision 32552)
@@ -0,0 +1,60 @@
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_missing_override_annotations_interface_methods=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_functional_interfaces=false
+sp_cleanup.convert_to_enhanced_for_loop=false
+sp_cleanup.correct_indentation=false
+sp_cleanup.format_source_code=false
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.insert_inferred_type_arguments=false
+sp_cleanup.make_local_variable_final=true
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=false
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_redundant_type_arguments=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=false
+sp_cleanup.remove_unused_imports=true
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_anonymous_class_creation=false
+sp_cleanup.use_blocks=false
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_lambda=true
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+sp_cleanup.use_type_arguments=false
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 32551)
+++ applications/editors/josm/plugins/undelete/src/org/openstreetmap/josm/plugins/undelete/Undelete.java	(revision 32552)
@@ -1,3 +1,3 @@
-// License: GPL. See LICENSE file for details.
+// License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.plugins.undelete;
 
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 32551)
+++ applications/editors/josm/plugins/undelete/src/org/openstreetmap/josm/plugins/undelete/UndeleteAction.java	(revision 32552)
@@ -1,3 +1,3 @@
-// License: GPL. See LICENSE file for details.
+// License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.plugins.undelete;
 
@@ -40,6 +40,162 @@
 public class UndeleteAction extends JosmAction {
 
+    private final class Worker implements Runnable {
+        private final OsmPrimitive parent;
+
+        private final OsmDataLayer layer;
+
+        private final List<PrimitiveId> ids;
+
+        private Worker(OsmPrimitive parent, OsmDataLayer layer, List<PrimitiveId> ids) {
+            this.parent = parent;
+            this.layer = layer;
+            this.ids = ids;
+        }
+
+        @Override
+        public void run() {
+            List<Node> nodes = new ArrayList<>();
+            for (PrimitiveId pid : ids) {
+                OsmPrimitive primitive = layer.data.getPrimitiveById(pid);
+                if (primitive == null) {
+                    try {
+                        final Long id = pid.getUniqueId();
+                        final OsmPrimitiveType type = pid.getType();
+
+                        History h = HistoryDataSet.getInstance().getHistory(id, type);
+
+                        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);
+                            download.run();
+
+                            primitive = layer.data.getPrimitiveById(id, type);
+                        } 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;
+                                if (hNode != null) {
+                                    node.setCoor(hNode.getCoords());
+                                }
+
+                                primitive = 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<>();
+                                if (hWay != null) {
+                                    for (Long i : hWay.getNodes()) {
+                                        nodeIds.add(new SimplePrimitiveId(i, OsmPrimitiveType.NODE));
+                                    }
+                                }
+                                undelete(false, nodeIds, way);
+
+                                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;
+
+                                if (hRel != null) {
+                                    List<RelationMember> members = new ArrayList<>(hRel.getNumMembers());
+                                    for (RelationMemberData m : hRel.getMembers()) {
+                                        OsmPrimitive p = layer.data.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;
+                                            }
+                                            layer.data.addPrimitive(p);
+                                        }
+                                        members.add(new RelationMember(m.getRole(), p));
+                                    }
+
+                                    rel.setMembers(members);
+                                }
+
+                                primitive = rel;
+                            }
+
+                            if (hPrimitive2 != null) {
+                                primitive.setChangesetId((int) hPrimitive1.getChangesetId());
+                                primitive.setTimestamp(hPrimitive1.getTimestamp());
+                                primitive.setUser(hPrimitive1.getUser());
+                                primitive.setVisible(hPrimitive1.isVisible());
+                                primitive.setKeys(hPrimitive2.getTags());
+                                primitive.setModified(true);
+
+                                layer.data.addPrimitive(primitive);
+                            } else {
+                              final String msg = OsmPrimitiveType.NODE.equals(type)
+                                  ? tr("Unable to undelete node {0}. Object has likely been redacted", id)
+                                  : OsmPrimitiveType.WAY.equals(type)
+                                  ? tr("Unable to undelete way {0}. Object has likely been redacted", id)
+                                  : OsmPrimitiveType.RELATION.equals(type)
+                                  ? tr("Unable to undelete relation {0}. Object has likely been redacted", id)
+                                  : null;
+                                GuiHelper.runInEDT(new Runnable() {
+                                    @Override
+                                    public void run() {
+                                        new Notification(msg).setIcon(JOptionPane.WARNING_MESSAGE).show();
+                                    }
+                                });
+                                Main.warn(msg);
+                            }
+                        }
+                    } catch (Exception t) {
+                        Main.error(t);
+                    }
+                }
+                if (parent != null && primitive instanceof Node) {
+                    nodes.add((Node) primitive);
+                }
+            }
+            if (parent instanceof Way && !nodes.isEmpty()) {
+                ((Way) parent).setNodes(nodes);
+                Main.map.repaint();
+            }
+            GuiHelper.runInEDT(new Runnable() {
+                @Override
+                public void run() {
+                    AutoScaleAction.zoomTo(layer.data.allNonDeletedPrimitives());
+                }
+            });
+        }
+    }
+
     public UndeleteAction() {
-        super(tr("Undelete object..."), "undelete", tr("Undelete object by id"), 
+        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);
     }
@@ -54,12 +210,12 @@
         undelete(dialog.isNewLayerSelected(), dialog.getOsmIds(), null);
     }
-    
+
     /**
      * // TODO: undelete relation members if necessary
      */
     public void undelete(boolean newLayer, final List<PrimitiveId> ids, final OsmPrimitive parent) {
-        
-        Main.info("Undeleting "+ids+(parent==null?"":" with parent "+parent));
-        
+
+        Main.info("Undeleting "+ids+(parent == null ? "" : " with parent "+parent));
+
         OsmDataLayer tmpLayer = Main.getLayerManager().getEditLayer();
         if ((tmpLayer == null) || newLayer) {
@@ -76,149 +232,5 @@
 
         Main.worker.execute(task);
-
-        Runnable r = new Runnable() {
-            @Override
-            public void run() {
-                List<Node> nodes = new ArrayList<>();
-                for (PrimitiveId pid : ids) {
-                    OsmPrimitive primitive = layer.data.getPrimitiveById(pid);
-                    if (primitive == null) { 
-                        try {
-                            final Long id = pid.getUniqueId();
-                            final OsmPrimitiveType type = pid.getType();
-
-                            History h = HistoryDataSet.getInstance().getHistory(id, type);
-
-                            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);
-                                download.run();
-        
-                                primitive = layer.data.getPrimitiveById(id, type);
-                            } 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;
-                                    if (hNode != null) {
-                                    	node.setCoor(hNode.getCoords());
-                                    }
-        
-                                    primitive = 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<>();
-                                    if (hWay != null) {
-	                                    for (Long i : hWay.getNodes()) {
-	                                        nodeIds.add(new SimplePrimitiveId(i, OsmPrimitiveType.NODE));
-	                                    }
-                                    }
-                                    undelete(false, nodeIds, way);
-        
-                                    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;
-        
-                                    if (hRel != null) {
-	                                    List<RelationMember> members = new ArrayList<>(hRel.getNumMembers());
-	                                    for (RelationMemberData m : hRel.getMembers()) {
-	                                        OsmPrimitive p = layer.data.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;
-	                                            }
-	                                            layer.data.addPrimitive(p);
-	                                        }
-	                                        members.add(new RelationMember(m.getRole(), p));
-	                                    }
-	        
-	                                    rel.setMembers(members);
-                                    }
-        
-                                    primitive = rel;
-                                }
-        
-                                if (hPrimitive2 != null) {
-                                    primitive.setChangesetId((int) hPrimitive1.getChangesetId());
-                                    primitive.setTimestamp(hPrimitive1.getTimestamp());
-                                    primitive.setUser(hPrimitive1.getUser());
-                                    primitive.setVisible(hPrimitive1.isVisible());
-                                    primitive.setKeys(hPrimitive2.getTags());
-                                    primitive.setModified(true);
-            
-                                    layer.data.addPrimitive(primitive);
-                                } else {
-                                  final String msg = OsmPrimitiveType.NODE.equals(type)
-                                      ? tr("Unable to undelete node {0}. Object has likely been redacted", id)
-                                      : OsmPrimitiveType.WAY.equals(type)
-                                      ? tr("Unable to undelete way {0}. Object has likely been redacted", id)
-                                      : OsmPrimitiveType.RELATION.equals(type)
-                                      ? tr("Unable to undelete relation {0}. Object has likely been redacted", id)
-                                      : null;
-                                	GuiHelper.runInEDT(new Runnable() {
-										@Override
-										public void run() {
-		                                	new Notification(msg).setIcon(JOptionPane.WARNING_MESSAGE).show();
-										}
-									});
-                                	Main.warn(msg);
-                                }
-                            }
-                        } catch (Exception t) {
-                            Main.error(t);
-                        }
-                    }
-                    if (parent != null && primitive instanceof Node) {
-                        nodes.add((Node) primitive);
-                    }
-                }
-                if (parent instanceof Way && !nodes.isEmpty()) {
-                    ((Way) parent).setNodes(nodes);
-                    Main.map.repaint();
-                }
-            	GuiHelper.runInEDT(new Runnable() {
-					@Override
-					public void run() {
-						AutoScaleAction.zoomTo(layer.data.allNonDeletedPrimitives());
-					}
-				});
-            }
-        };
-        Main.worker.submit(r);
+        Main.worker.submit(new Worker(parent, layer, ids));
     }
 }
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 32551)
+++ applications/editors/josm/plugins/undelete/src/org/openstreetmap/josm/plugins/undelete/UndeleteDialog.java	(revision 32552)
@@ -1,3 +1,3 @@
-// License: GPL. See LICENSE file for details.
+// License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.plugins.undelete;
 
@@ -24,8 +24,8 @@
     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();
@@ -35,5 +35,5 @@
         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''"));
@@ -52,17 +52,17 @@
         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") });
+        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();
