Index: trunk/src/org/openstreetmap/josm/actions/RestartAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/RestartAction.java	(revision 5857)
+++ trunk/src/org/openstreetmap/josm/actions/RestartAction.java	(revision 5857)
@@ -0,0 +1,141 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.actions;
+
+import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.KeyEvent;
+import java.io.File;
+import java.io.IOException;
+import java.lang.management.ManagementFactory;
+import java.util.List;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.gui.HelpAwareOptionPane.ButtonSpec;
+import org.openstreetmap.josm.tools.ImageProvider;
+import org.openstreetmap.josm.tools.Shortcut;
+
+/**
+ * Restarts JOSM as it was launched. Comes from "restart" plugin, originally written by Upliner.
+ * <br/><br/>
+ * Mechanisms have been improved based on #8561 discussions and <a href="http://lewisleo.blogspot.jp/2012/08/programmatically-restart-java.html">this article</a>.
+ * @since 5857
+ */
+public class RestartAction extends JosmAction {
+
+    /**
+     * Constructs a new {@code RestartAction}.
+     */
+    public RestartAction() {
+        super(tr("Restart"), "restart", tr("Restart the application."),
+                Shortcut.registerShortcut("file:restart", tr("File: {0}", tr("Restart")), KeyEvent.VK_J, Shortcut.ALT_CTRL_SHIFT), false);
+        putValue("help", ht("/Action/Restart"));
+        putValue("toolbar", "action/restart");
+        Main.toolbar.register(this);
+    }
+
+    public void actionPerformed(ActionEvent e) {
+        try {
+            restartJOSM();
+        } catch (IOException ex) {
+            ex.printStackTrace();
+        }
+    }
+    
+    /**
+     * Restarts the current Java application
+     * @throws IOException
+     */
+    public static void restartJOSM() throws IOException {
+        if (!Main.exitJosm(false)) return;
+        try {
+            // java binary
+            String java = System.getProperty("java.home") + "/bin/java";
+            // vm arguments
+            List<String> vmArguments = ManagementFactory.getRuntimeMXBean().getInputArguments();
+            StringBuffer vmArgsOneLine = new StringBuffer();
+            for (String arg : vmArguments) {
+                // if it's the agent argument : we ignore it otherwise the
+                // address of the old application and the new one will be in conflict
+                if (!arg.contains("-agentlib")) {
+                    vmArgsOneLine.append(arg);
+                    vmArgsOneLine.append(" ");
+                }
+            }
+            // init the command to execute, add the vm args
+            final StringBuffer cmd = new StringBuffer("\"" + java + "\" " + vmArgsOneLine);
+            // program main and program arguments (be careful a sun property. might not be supported by all JVM) 
+            String[] mainCommand = System.getProperty("sun.java.command").split(" ");
+            // program main is a jar
+            if (mainCommand[0].endsWith(".jar")) {
+                // if it's a jar, add -jar mainJar
+                cmd.append("-jar " + new File(mainCommand[0]).getPath());
+            } else {
+                // else it's a .class, add the classpath and mainClass
+                cmd.append("-cp \"" + System.getProperty("java.class.path") + "\" " + mainCommand[0]);
+            }
+            // finally add program arguments
+            for (String arg : Main.commandLineArgs) {
+                cmd.append(" ");
+                cmd.append(arg);
+            }
+            // execute the command in a shutdown hook, to be sure that all the
+            // resources have been disposed before restarting the application
+            Runtime.getRuntime().addShutdownHook(new Thread() {
+                @Override
+                public void run() {
+                    try {
+                        Runtime.getRuntime().exec(cmd.toString());
+                    } catch (IOException e) {
+                        e.printStackTrace();
+                    }
+                }
+            });
+            // exit
+            System.exit(0);
+        } catch (Exception e) {
+            // something went wrong
+            throw new IOException("Error while trying to restart the application", e);
+        }
+    }
+    
+    /**
+     * Returns a new {@code ButtonSpec} instance that performs this action.
+     * @return A new {@code ButtonSpec} instance that performs this action.
+     */
+    public static ButtonSpec getRestartButtonSpec() {
+        return new ButtonSpec(
+                tr("Restart"),
+                ImageProvider.get("restart"),
+                tr("Restart the application."),
+                ht("/Action/Restart")
+        );
+    }
+
+    /**
+     * Returns a new {@code ButtonSpec} instance that do not perform this action.
+     * @return A new {@code ButtonSpec} instance that do not perform this action.
+     */
+    public static ButtonSpec getCancelButtonSpec() {
+        return new ButtonSpec(
+                tr("Cancel"),
+                ImageProvider.get("cancel"),
+                tr("Click to restart later."),
+                null /* no specific help context */
+        );
+    }
+    
+    /**
+     * Returns default {@code ButtonSpec} instances for this action (Restart/Cancel).
+     * @return Default {@code ButtonSpec} instances for this action.
+     * @see #getRestartButtonSpec
+     * @see #getCancelButtonSpec
+     */
+    public static ButtonSpec[] getButtonSpecs() {
+        return new ButtonSpec[] {
+                getRestartButtonSpec(),
+                getCancelButtonSpec()
+        };
+    }
+}
Index: trunk/src/org/openstreetmap/josm/actions/ZoomToAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/ZoomToAction.java	(revision 5856)
+++ trunk/src/org/openstreetmap/josm/actions/ZoomToAction.java	(revision 5857)
@@ -1,2 +1,3 @@
+// License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.actions;
 
Index: trunk/src/org/openstreetmap/josm/gui/MainMenu.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MainMenu.java	(revision 5856)
+++ trunk/src/org/openstreetmap/josm/gui/MainMenu.java	(revision 5857)
@@ -68,4 +68,5 @@
 import org.openstreetmap.josm.actions.PurgeAction;
 import org.openstreetmap.josm.actions.RedoAction;
+import org.openstreetmap.josm.actions.RestartAction;
 import org.openstreetmap.josm.actions.ReverseWayAction;
 import org.openstreetmap.josm.actions.SaveAction;
@@ -138,4 +139,5 @@
     public final JosmAction upload = new UploadAction();
     public final JosmAction uploadSelection = new UploadSelectionAction();
+    public final JosmAction restart = new RestartAction();
     public final JosmAction exit = new ExitAction();
 
@@ -454,4 +456,5 @@
         add(fileMenu, closeChangesetAction, true);
         fileMenu.addSeparator();
+        add(fileMenu, restart);
         add(fileMenu, exit);
 
Index: trunk/src/org/openstreetmap/josm/gui/preferences/PreferenceTabbedPane.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/PreferenceTabbedPane.java	(revision 5856)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/PreferenceTabbedPane.java	(revision 5857)
@@ -29,5 +29,8 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.ExpertToggleAction;
+import org.openstreetmap.josm.actions.RestartAction;
 import org.openstreetmap.josm.actions.ExpertToggleAction.ExpertModeChangeListener;
+import org.openstreetmap.josm.gui.HelpAwareOptionPane;
+import org.openstreetmap.josm.gui.HelpAwareOptionPane.ButtonSpec;
 import org.openstreetmap.josm.gui.preferences.advanced.AdvancedPreference;
 import org.openstreetmap.josm.gui.preferences.display.ColorPreference;
@@ -285,4 +288,6 @@
                 if (requiresRestart) {
                     sb.append(tr("You have to restart JOSM for some settings to take effect."));
+                    sb.append("<br/><br/>");
+                    sb.append(tr("Would you like to restart now?"));
                 }
                 sb.append("</html>");
@@ -290,5 +295,19 @@
                 // display the message, if necessary
                 //
-                if ((task != null && !task.isCanceled()) || requiresRestart) {
+                if (requiresRestart) {
+                    final ButtonSpec [] options = RestartAction.getButtonSpecs();
+                    if (0 == HelpAwareOptionPane.showOptionDialog(
+                            Main.parent,
+                            sb.toString(),
+                            tr("Restart"),
+                            JOptionPane.INFORMATION_MESSAGE,
+                            null, /* no special icon */
+                            options,
+                            options[0],
+                            null /* no special help */
+                            )) {
+                        Main.main.menu.restart.actionPerformed(null);
+                    }
+                } else if (task != null && !task.isCanceled()) {
                     JOptionPane.showMessageDialog(
                             Main.parent,
Index: trunk/src/org/openstreetmap/josm/plugins/PluginHandler.java
===================================================================
--- trunk/src/org/openstreetmap/josm/plugins/PluginHandler.java	(revision 5856)
+++ trunk/src/org/openstreetmap/josm/plugins/PluginHandler.java	(revision 5857)
@@ -113,4 +113,5 @@
             new DeprecatedPlugin("epsg31287", tr("replaced by new {0} plugin", "proj4j")),
             new DeprecatedPlugin("licensechange", tr("no longer required")),
+            new DeprecatedPlugin("restart", IN_CORE)
         });
     }
