Index: trunk/src/org/openstreetmap/josm/Main.java
===================================================================
--- trunk/src/org/openstreetmap/josm/Main.java	(revision 2273)
+++ trunk/src/org/openstreetmap/josm/Main.java	(revision 2274)
@@ -47,4 +47,5 @@
 import org.openstreetmap.josm.gui.dialogs.LayerListDialog;
 import org.openstreetmap.josm.gui.download.DownloadDialog.DownloadTask;
+import org.openstreetmap.josm.gui.help.HelpBrowserProxy;
 import org.openstreetmap.josm.gui.io.SaveLayersDialog;
 import org.openstreetmap.josm.gui.layer.Layer;
@@ -374,4 +375,14 @@
     }
 
+    /**
+     * Run any cleanup operation before exit
+     * 
+     */
+    public static  void cleanupBeforeExit() {
+        // try to close and exit the help browser running in another process
+        //
+        HelpBrowserProxy.getInstance().exit();
+    }
+
     public static boolean saveUnsavedModifications() {
         if (map == null) return true;
@@ -393,4 +404,5 @@
             }
         }
+
         return true;
     }
Index: trunk/src/org/openstreetmap/josm/actions/ExitAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/ExitAction.java	(revision 2273)
+++ trunk/src/org/openstreetmap/josm/actions/ExitAction.java	(revision 2274)
@@ -27,4 +27,5 @@
         if (Main.saveUnsavedModifications()) {
             Main.saveGuiGeometry();
+            Main.cleanupBeforeExit();
             System.exit(0);
         }
Index: trunk/src/org/openstreetmap/josm/actions/HelpAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/HelpAction.java	(revision 2273)
+++ trunk/src/org/openstreetmap/josm/actions/HelpAction.java	(revision 2274)
@@ -16,5 +16,5 @@
 
 import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.gui.help.HelpBrowser;
+import org.openstreetmap.josm.gui.help.HelpBrowserProxy;
 import org.openstreetmap.josm.gui.help.Helpful;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -27,5 +27,4 @@
 public class HelpAction extends AbstractAction {
 
-    private HelpBrowser helpBrowser;
 
     private String pathhelp = Main.pref.get("help.pathhelp", "Help/");
@@ -34,5 +33,4 @@
     public HelpAction() {
         super(tr("Help"), ImageProvider.get("help"));
-        this.helpBrowser = new HelpBrowser();
     }
 
@@ -43,6 +41,10 @@
                 Component c = SwingUtilities.getRoot((Component)e.getSource());
                 Point mouse = c.getMousePosition();
-                c = SwingUtilities.getDeepestComponentAt(c, mouse.x, mouse.y);
-                topic = contextSensitiveHelp(c);
+                if (mouse != null) {
+                    c = SwingUtilities.getDeepestComponentAt(c, mouse.x, mouse.y);
+                    topic = contextSensitiveHelp(c);
+                } else {
+                    topic = null;
+                }
             } else {
                 Point mouse = Main.parent.getMousePosition();
@@ -50,12 +52,10 @@
             }
             if (topic == null) {
-                helpBrowser.setVisible(false);
-                helpBrowser.setUrlForHelpTopic("Help");
+                HelpBrowserProxy.getInstance().setUrlForHelpTopic("Help");
             } else {
                 help(topic);
             }
         } else {
-            helpBrowser.setVisible(false);
-            helpBrowser.setUrlForHelpTopic("Help");
+            HelpBrowserProxy.getInstance().setUrlForHelpTopic("Help");
         }
     }
@@ -95,6 +95,5 @@
      */
     public void help(String topic) {
-        helpBrowser.setVisible(false);
-        helpBrowser.setUrlForHelpTopic(pathhelp + topic);
+        HelpBrowserProxy.getInstance().setUrlForHelpTopic(pathhelp + topic);
     }
 }
Index: trunk/src/org/openstreetmap/josm/actions/HistoryInfoAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/HistoryInfoAction.java	(revision 2273)
+++ trunk/src/org/openstreetmap/josm/actions/HistoryInfoAction.java	(revision 2274)
@@ -13,8 +13,8 @@
 
     public HistoryInfoAction() {
-        super(tr("History of Element"), "about",
+        super(tr("Object history"), "about",
                 tr("Display history information about OSM ways, nodes, or relations."),
                 Shortcut.registerShortcut("core:history",
-                        tr("History of Element"), KeyEvent.VK_H, Shortcut.GROUP_HOTKEY), true);
+                        tr("Object history"), KeyEvent.VK_H, Shortcut.GROUP_HOTKEY), true);
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/MainApplication.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MainApplication.java	(revision 2273)
+++ trunk/src/org/openstreetmap/josm/gui/MainApplication.java	(revision 2274)
@@ -50,4 +50,5 @@
                     return;
                 Main.saveGuiGeometry();
+                Main.cleanupBeforeExit();
                 System.exit(0);
             }
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/ConflictResolutionDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/ConflictResolutionDialog.java	(revision 2273)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/ConflictResolutionDialog.java	(revision 2274)
@@ -28,4 +28,6 @@
 import org.openstreetmap.josm.gui.conflict.pair.ConflictResolver;
 import org.openstreetmap.josm.gui.conflict.pair.properties.OperationCancelledException;
+import org.openstreetmap.josm.gui.help.HelpBrowser;
+import org.openstreetmap.josm.gui.help.HelpBrowserProxy;
 import org.openstreetmap.josm.gui.help.HelpBuilder;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -127,4 +129,8 @@
         pnl.add(btn);
 
+        btn = new JButton(new HelpAction());
+        btn.setName("button.help");
+        pnl.add(btn);
+
         pnl.setBorder(BorderFactory.createLoweredBevelBorder());
         return pnl;
@@ -171,4 +177,20 @@
         public void actionPerformed(ActionEvent arg0) {
             setVisible(false);
+        }
+    }
+
+    /**
+     * Action for canceling conflict resolution
+     */
+    class HelpAction extends AbstractAction {
+        public HelpAction() {
+            putValue(Action.SHORT_DESCRIPTION, tr("Show help information"));
+            putValue(Action.NAME, tr("Help"));
+            putValue(Action.SMALL_ICON, ImageProvider.get("help"));
+            setEnabled(true);
+        }
+
+        public void actionPerformed(ActionEvent arg0) {
+            HelpBrowserProxy.getInstance().setUrlForHelpTopic("/Help/Dialog/ConflictDialog");
         }
     }
Index: trunk/src/org/openstreetmap/josm/gui/help/HelpApplication.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/help/HelpApplication.java	(revision 2274)
+++ trunk/src/org/openstreetmap/josm/gui/help/HelpApplication.java	(revision 2274)
@@ -0,0 +1,87 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.help;
+
+import java.awt.Dimension;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.Toolkit;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.gui.MainApplication;
+import org.openstreetmap.josm.tools.I18n;
+
+/**
+ * The JOSM help browser wrapped in its own application. It is listening to commands
+ * on standard in.
+ * 
+ */
+public class HelpApplication {
+    private HelpBrowser browser;
+    private HelpBrowserCommandProcessor commandProcessor;
+
+    protected void setGeometry(HelpBrowser browser) {
+        Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
+        d.width = Math.min(800, d.width -50);
+        Rectangle bounds = new Rectangle(
+                new Point(
+                        Toolkit.getDefaultToolkit().getScreenSize().width - d.width,
+                        0
+                ),
+                d
+        );
+        browser.setBounds(bounds);
+    }
+
+    public void start() {
+        browser = new HelpBrowser();
+        setGeometry(browser);
+        commandProcessor = new HelpBrowserCommandProcessor(browser);
+        new Thread(commandProcessor).start();
+    }
+
+
+    static public void main(String argArray[]) {
+        I18n.init();
+        // initialize the plaform hook, and
+        Main.determinePlatformHook();
+        // call the really early hook before we anything else
+        Main.platform.preStartupHook();
+
+        // construct argument table
+        List<String> argList = Arrays.asList(argArray);
+        final Map<String, Collection<String>> args = new HashMap<String, Collection<String>>();
+        for (String arg : argArray) {
+            if (!arg.startsWith("--")) {
+                arg = "--download="+arg;
+            }
+            int i = arg.indexOf('=');
+            String key = i == -1 ? arg.substring(2) : arg.substring(2,i);
+            String value = i == -1 ? "" : arg.substring(i+1);
+            Collection<String> v = args.get(key);
+            if (v == null) {
+                v = new LinkedList<String>();
+            }
+            v.add(value);
+            args.put(key, v);
+        }
+
+        Main.pref.init(false /* don't reset preferences */);
+
+        // Check if passed as parameter
+        if (args.containsKey("language")) {
+            I18n.set((String)(args.get("language").toArray()[0]));
+        } else {
+            I18n.set(Main.pref.get("language", null));
+        }
+
+        MainApplication.preConstructorInit(args);
+
+        new HelpApplication().start();
+    }
+}
Index: trunk/src/org/openstreetmap/josm/gui/help/HelpBrowser.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/help/HelpBrowser.java	(revision 2273)
+++ trunk/src/org/openstreetmap/josm/gui/help/HelpBrowser.java	(revision 2274)
@@ -10,7 +10,12 @@
 import java.awt.event.WindowAdapter;
 import java.awt.event.WindowEvent;
+import java.io.BufferedReader;
 import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.Observable;
+import java.util.Observer;
 
 import javax.swing.AbstractAction;
+import javax.swing.JButton;
 import javax.swing.JComponent;
 import javax.swing.JEditorPane;
@@ -19,10 +24,13 @@
 import javax.swing.JPanel;
 import javax.swing.JScrollPane;
+import javax.swing.JSeparator;
+import javax.swing.JToolBar;
 import javax.swing.KeyStroke;
 import javax.swing.event.HyperlinkEvent;
 import javax.swing.event.HyperlinkListener;
+import javax.swing.text.html.HTMLEditorKit;
+import javax.swing.text.html.StyleSheet;
 
 import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.gui.SideButton;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.LanguageInfo;
@@ -33,5 +41,35 @@
 public class HelpBrowser extends JFrame {
 
+    private static HelpBrowser instance;
+
+    /**
+     * Replies the unique instance of the help browser
+     * 
+     * @return the unique instance of the help browser
+     */
+    static public HelpBrowser getInstance() {
+        if (instance == null) {
+            instance = new HelpBrowser();
+        }
+        return instance;
+    }
+
+    /**
+     * Launches the internal help browser and directs it to the help page for
+     * <code>helpTopic</code>.
+     * 
+     * @param helpTopic the help topic
+     */
+    static public void launchBrowser(String helpTopic) {
+        HelpBrowser browser = getInstance();
+        browser.setUrlForHelpTopic(helpTopic);
+        browser.setVisible(true);
+        browser.toFront();
+    }
+
+    /** the help browser */
     private JEditorPane help;
+    /** the help browser history */
+    private HelpBrowserHistory history;
 
     /** the currently displayed URL */
@@ -43,7 +81,50 @@
     private WikiReader reader = new WikiReader(baseurl);
 
+    /**
+     * Builds the style sheet used in the internal help browser
+     * 
+     * @return the style sheet
+     */
+    protected StyleSheet buildStyleSheet() {
+        StyleSheet ss = new StyleSheet();
+        BufferedReader reader = new BufferedReader(
+                new InputStreamReader(
+                        getClass().getResourceAsStream("help-browser.css")
+                )
+        );
+        StringBuffer css = new StringBuffer();
+        try {
+            String line = null;
+            while ((line = reader.readLine()) != null) {
+                css.append(line);
+                css.append("\n");
+            }
+            reader.close();
+        } catch(Exception e) {
+            System.err.println(tr("Failed to read CSS file ''help-browser.css''. Exception is: {0}", e.toString()));
+            e.printStackTrace();
+            return ss;
+        }
+        ss.addRule(css.toString());
+        return ss;
+    }
+
+    protected JToolBar buildToolBar() {
+        JToolBar tb = new JToolBar();
+        tb.add(new JButton(new HomeAction()));
+        tb.add(new JButton(new BackAction(history)));
+        tb.add(new JButton(new ForwardAction(history)));
+        tb.add(new JButton(new ReloadAction()));
+        tb.add(new JSeparator());
+        tb.add(new JButton(new OpenInBrowserAction()));
+        tb.add(new JButton(new EditAction()));
+        return tb;
+    }
 
     protected void build() {
         help = new JEditorPane();
+        HTMLEditorKit kit = new HTMLEditorKit();
+        kit.setStyleSheet(buildStyleSheet());
+        help.setEditorKit(kit);
         help.setEditable(false);
         help.addHyperlinkListener(new HyperlinkListener(){
@@ -56,4 +137,5 @@
                     OpenBrowser.displayUrl(e.getURL().toString());
                 } else {
+                    url = e.getURL().toString();
                     setUrl(e.getURL().toString());
                 }
@@ -62,15 +144,11 @@
         help.setContentType("text/html");
 
+
+        history = new HelpBrowserHistory(this);
+
         JPanel p = new JPanel(new BorderLayout());
         setContentPane(p);
 
         p.add(new JScrollPane(help), BorderLayout.CENTER);
-
-        JPanel buttons = new JPanel();
-        p.add(buttons, BorderLayout.SOUTH);
-
-        buttons.add(new SideButton(new OpenInBrowserAction()));
-        buttons.add(new SideButton(new EditAction()));
-        buttons.add(new SideButton(new ReloadAction()));
 
         addWindowListener(new WindowAdapter(){
@@ -80,4 +158,5 @@
         });
 
+        p.add(buildToolBar(), BorderLayout.NORTH);
         help.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "Close");
         help.getActionMap().put("Close", new AbstractAction(){
@@ -94,25 +173,9 @@
     }
 
-    @Override
-    public void setVisible(boolean visible) {
-        if (visible) {
-            new WindowGeometry(
-                    getClass().getName() + ".geometry",
-                    WindowGeometry.centerInWindow(
-                            Main.parent,
-                            new Dimension(800,600)
-                    )
-            ).applySafe(this);
-        } else if (!visible && isShowing()){
-            new WindowGeometry(this).remember(getClass().getName() + ".geometry");
-        }
-        super.setVisible(visible);
-    }
-
     public String getUrl() {
         return url;
     }
 
-    public void setUrl(String url) {
+    protected void loadUrl(String url) {
         String langurl = url;
         if(url.startsWith(baseurl+pathbase)){
@@ -134,4 +197,8 @@
             help.setText(tr("Error while loading page {0}",url));
         }
+    }
+
+    public void setUrl(String url) {
+        loadUrl(url);
         if (!isVisible()) {
             setVisible(true);
@@ -140,4 +207,5 @@
             toFront();
         }
+        history.setCurrentUrl(url);
     }
 
@@ -172,7 +240,7 @@
     class OpenInBrowserAction extends AbstractAction {
         public OpenInBrowserAction() {
-            putValue(NAME, tr("Open in Browser"));
+            //putValue(NAME, tr("Open in Browser"));
             putValue(SHORT_DESCRIPTION, tr("Open the current help page in an external browser"));
-            // provide icon
+            putValue(SMALL_ICON, ImageProvider.get("help", "internet"));
         }
 
@@ -184,5 +252,5 @@
     class EditAction extends AbstractAction {
         public EditAction() {
-            putValue(NAME, tr("Edit"));
+            // putValue(NAME, tr("Edit"));
             putValue(SHORT_DESCRIPTION, tr("Edit the current help page"));
             putValue(SMALL_ICON,ImageProvider.get("dialogs", "edit"));
@@ -205,5 +273,5 @@
     class ReloadAction extends AbstractAction {
         public ReloadAction() {
-            putValue(NAME, tr("Reload"));
+            //putValue(NAME, tr("Reload"));
             putValue(SHORT_DESCRIPTION, tr("Reload the current help page"));
             putValue(SMALL_ICON, ImageProvider.get("dialogs", "refresh"));
@@ -214,3 +282,54 @@
         }
     }
+
+    class BackAction extends AbstractAction implements Observer {
+        private HelpBrowserHistory history;
+        public BackAction(HelpBrowserHistory history) {
+            this.history = history;
+            history.addObserver(this);
+            //putValue(NAME, tr("Back"));
+            putValue(SHORT_DESCRIPTION, tr("Go to the previous page"));
+            putValue(SMALL_ICON, ImageProvider.get("help", "previous"));
+            setEnabled(history.canGoBack());
+        }
+
+        public void actionPerformed(ActionEvent e) {
+            history.back();
+        }
+        public void update(Observable o, Object arg) {
+            System.out.println("BackAction: canGoBoack=" + history.canGoBack() );
+            setEnabled(history.canGoBack());
+        }
+    }
+
+    class ForwardAction extends AbstractAction implements Observer {
+        private HelpBrowserHistory history;
+        public ForwardAction(HelpBrowserHistory history) {
+            this.history = history;
+            history.addObserver(this);
+            //putValue(NAME, tr("Forward"));
+            putValue(SHORT_DESCRIPTION, tr("Go to the next page"));
+            putValue(SMALL_ICON, ImageProvider.get("help", "next"));
+            setEnabled(history.canGoForward());
+        }
+
+        public void actionPerformed(ActionEvent e) {
+            history.forward();
+        }
+        public void update(Observable o, Object arg) {
+            setEnabled(history.canGoForward());
+        }
+    }
+
+    class HomeAction extends AbstractAction  {
+        public HomeAction() {
+            //putValue(NAME, tr("Home"));
+            putValue(SHORT_DESCRIPTION, tr("Go to the JOSM help home page"));
+            putValue(SMALL_ICON, ImageProvider.get("help", "home"));
+        }
+
+        public void actionPerformed(ActionEvent e) {
+            setUrlForHelpTopic("Help");
+        }
+    }
 }
Index: trunk/src/org/openstreetmap/josm/gui/help/HelpBrowserCommandProcessor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/help/HelpBrowserCommandProcessor.java	(revision 2274)
+++ trunk/src/org/openstreetmap/josm/gui/help/HelpBrowserCommandProcessor.java	(revision 2274)
@@ -0,0 +1,82 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.help;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+import javax.swing.SwingUtilities;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+/**
+ * Listens to commands on an input stream and delegates them to the help browser.
+ * 
+ *
+ */
+public class HelpBrowserCommandProcessor implements Runnable {
+
+    /** the controlled help browser*/
+    private HelpBrowser browser;
+
+    /**
+     * 
+     * @param browser the controlled help browser
+     */
+    public HelpBrowserCommandProcessor(HelpBrowser browser) {
+        this.browser = browser;
+    }
+
+    /**
+     * Show the help page for help topic <code>helpTopic</code>.
+     * 
+     * @param helpTopics the help topic
+     */
+    protected void setUrlForHelpTopics(final String helpTopics) {
+        Runnable r = new Runnable() {
+            public void run() {
+                browser.setUrlForHelpTopic(helpTopics);
+                browser.setVisible(true);
+                browser.toFront();
+            }
+        };
+        SwingUtilities.invokeLater(r);
+    }
+
+    /**
+     * Exit the help browser
+     */
+    protected void exit() {
+        Runnable r = new Runnable() {
+            public void run() {
+                browser.setVisible(false);
+                System.exit(0);
+            }
+        };
+        SwingUtilities.invokeLater(r);
+    }
+
+    public void run() {
+        BufferedReader reader = new BufferedReader(
+                new InputStreamReader(
+                        System.in
+                )
+        );
+        while(true) {
+            String cmd = null;
+            try {
+                cmd = reader.readLine();
+            } catch(IOException e) {
+                System.out.println(tr("Failed to read command. Exiting help browser. Exception was:" + e.toString()));
+                System.exit(1);
+            }
+            if (cmd.startsWith("exit")) {
+                exit();
+            } else if (cmd.startsWith("setUrlForHelpTopics ")) {
+                String helpTopics = cmd.substring("setUrlForHelpTopics ".length());
+                setUrlForHelpTopics(helpTopics);
+            }
+        }
+    }
+}
+
Index: trunk/src/org/openstreetmap/josm/gui/help/HelpBrowserHistory.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/help/HelpBrowserHistory.java	(revision 2274)
+++ trunk/src/org/openstreetmap/josm/gui/help/HelpBrowserHistory.java	(revision 2274)
@@ -0,0 +1,66 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.help;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Observable;
+
+public class HelpBrowserHistory extends Observable {
+    private HelpBrowser browser;
+    private ArrayList<String> history;
+    private int historyPos = 0;
+
+    public HelpBrowserHistory(HelpBrowser brower) {
+        this.browser = brower;
+        history = new ArrayList<String>();
+    }
+
+    public void clear() {
+        history.clear();
+        historyPos = 0;
+        setChanged();
+        notifyObservers();
+    }
+
+    public boolean canGoBack() {
+        return historyPos > 0;
+    }
+
+    public boolean canGoForward() {
+        return historyPos + 1 < history.size();
+    }
+
+    public void back() {
+        historyPos--;
+        if (historyPos < 0) return;
+        String url = history.get(historyPos);
+        browser.loadUrl(url);
+        setChanged();
+        notifyObservers();
+    }
+
+    public void forward() {
+        historyPos++;
+        if (historyPos >= history.size()) return;
+        String url = history.get(historyPos);
+        browser.loadUrl(url);
+        setChanged();
+        notifyObservers();
+    }
+
+    public void setCurrentUrl(String url) {
+        if (historyPos == history.size() -1) {
+            // do nothing just append
+        } else if (historyPos ==0 && history.size() > 0) {
+            history = new ArrayList<String>(Collections.singletonList(history.get(0)));
+        } else if (historyPos < history.size() -1 && historyPos > 0) {
+            history = new ArrayList<String>(history.subList(0, historyPos));
+        } else {
+            history = new ArrayList<String>();
+        }
+        history.add(url);
+        historyPos = history.size()-1;
+        setChanged();
+        notifyObservers();
+    }
+}
Index: trunk/src/org/openstreetmap/josm/gui/help/HelpBrowserProxy.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/help/HelpBrowserProxy.java	(revision 2274)
+++ trunk/src/org/openstreetmap/josm/gui/help/HelpBrowserProxy.java	(revision 2274)
@@ -0,0 +1,99 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.help;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+
+/**
+ * This is the proxy class for the help browser running in its own process.
+ * 
+ *
+ */
+public class HelpBrowserProxy {
+
+    /** the unique instance of the proxy */
+    private static HelpBrowserProxy instance;
+
+    /**
+     * replies the unique instance of the proxy
+     * 
+     * @return the unique instance of the proxy
+     */
+    static public HelpBrowserProxy getInstance() {
+        if (instance == null) {
+            instance = new HelpBrowserProxy();
+        }
+        return instance;
+    }
+
+    /** the process running the help browser */
+    private Process helpBrowserProcess;
+    /** the print writer to the input stream of the help browser process */
+    private PrintWriter pw;
+
+    /**
+     * launches the help browser in its own process
+     * 
+     */
+    protected void launch() {
+        ArrayList<String> cmdLine = new ArrayList<String>();
+        String javaBin = null;
+        if (System.getProperty("os.name").toLowerCase().startsWith("windows")) {
+            javaBin = "javaw.exe";
+        } else {
+            javaBin = "javaw";
+        }
+        cmdLine.add(new File(new File(System.getProperty("java.home"), "bin"), javaBin).toString());
+        cmdLine.add("-classpath");
+        cmdLine.add(System.getProperty("java.class.path"));
+        cmdLine.add("org.openstreetmap.josm.gui.help.HelpApplication");
+        if (System.getProperty("josm.home") != null) {
+            cmdLine.add("-Djosm.home="+System.getProperty("josm.home"));
+        }
+        String[] cmds = new String[cmdLine.size()];
+        cmdLine.toArray(cmds);
+        try {
+            helpBrowserProcess = Runtime.getRuntime().exec(cmds);
+        } catch(IOException e) {
+            e.printStackTrace();
+        }
+        pw = new PrintWriter(
+                new OutputStreamWriter(
+                        helpBrowserProcess.getOutputStream()
+                )
+        );
+    }
+
+    /**
+     * Direct the help browser to the help page for help topic
+     * <code>helpTopic</code>
+     * 
+     * @param helpTopic the help topic
+     */
+    public void setUrlForHelpTopic(String helpTopic) {
+        if (helpBrowserProcess == null) {
+            launch();
+        }
+        if (helpBrowserProcess == null) {
+            System.err.println("Failed to launch browser");
+            return;
+        }
+        pw.println("setUrlForHelpTopics " + helpTopic);
+        pw.flush();
+    }
+
+    /**
+     * Exit the help browser
+     */
+    public void exit() {
+        if (helpBrowserProcess == null)
+            return;
+        pw.println("exit");
+        pw.flush();
+        pw.close();
+        helpBrowserProcess.destroy();
+    }
+}
Index: trunk/src/org/openstreetmap/josm/gui/help/help-browser.css
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/help/help-browser.css	(revision 2274)
+++ trunk/src/org/openstreetmap/josm/gui/help/help-browser.css	(revision 2274)
@@ -0,0 +1,20 @@
+@CHARSET "ISO-8859-1";
+/*
+ * This is the CSS file used in the internal help browser
+ */
+body {margin-left: 0.2cm; font-family: Arial, sans-serif; font-size:14pt; font-weight:normal}
+p {margin-top: 5px; margin-bottom: 5px;}
+h1 {font-family: Arial, sans-serif; font-size:24pt; font-weight:bold}
+h2 {margin-top: 14pt; font-family: Arial, sans-serif; font-size:20pt; font-weight:bold}
+h3 {margin-top: 14pt; font-family: Arial, sans-serif; font-size:16pt; font-weight:bold}
+h4 {margin-top: 14pt; font-family: Arial, sans-serif; font-size:14pt; font-weight:bold}
+a {font-family: Arial, sans-serif; font-size:14pt; font-weight:normal; text-decoration: underline; color: blue}
+ul {margin-left: 1cm; list-style-type: disc}
+ul ul {margin-left: 1cm; list-style-type: circle}
+ol {margin-left: 1cm;}
+strong {font-weight: bold}
+b {font-weight: bold}
+em {font-style: italic}
+i {font-style: italic}
+tt {font-family: Courier New}
+pre {font-family: Courier New}
Index: trunk/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java	(revision 2273)
+++ trunk/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java	(revision 2274)
@@ -21,6 +21,4 @@
 import java.awt.geom.Area;
 import java.awt.image.BufferedImage;
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
 import java.io.File;
 import java.util.ArrayList;
Index: trunk/src/org/openstreetmap/josm/tools/WikiReader.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/WikiReader.java	(revision 2273)
+++ trunk/src/org/openstreetmap/josm/tools/WikiReader.java	(revision 2274)
@@ -127,5 +127,8 @@
             }
             if (inside && !transl) {
-                b += line.replaceAll("<img src=\"/", "<img src=\"" + baseurl + "/").replaceAll("href=\"/",
+                // add a border="0" attribute to images, otherwise the internal help browser
+                // will render a thick  border around images inside an <a> element
+                //
+                b += line.replaceAll("<img src=\"/", "<img border=\"0\" src=\"" + baseurl + "/").replaceAll("href=\"/",
                         "href=\"" + baseurl + "/").replaceAll(" />", ">")
                         + "\n";
