Index: applications/editors/josm/plugins/geochat/src/geochat/ChatPaneManager.java
===================================================================
--- applications/editors/josm/plugins/geochat/src/geochat/ChatPaneManager.java	(revision 29581)
+++ applications/editors/josm/plugins/geochat/src/geochat/ChatPaneManager.java	(revision 29582)
@@ -133,5 +133,8 @@
         chatPane.setEditable(false);
         Font font = chatPane.getFont();
-        chatPane.setFont(font.deriveFont(font.getSize2D() - 2));
+        float size = -1.0f; // Main.pref.getInteger("geochat.fontsize", -1); <- we don't need this
+        if( size < 8 )
+            size += font.getSize2D();
+        chatPane.setFont(font.deriveFont(size));
 //        DefaultCaret caret = (DefaultCaret)chatPane.getCaret(); // does not work
 //        caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
Index: applications/editors/josm/plugins/geochat/src/geochat/ChatServerConnection.java
===================================================================
--- applications/editors/josm/plugins/geochat/src/geochat/ChatServerConnection.java	(revision 29581)
+++ applications/editors/josm/plugins/geochat/src/geochat/ChatServerConnection.java	(revision 29582)
@@ -65,13 +65,48 @@
      */
     public void checkLogin() {
+        autoLogin(null);
+    }
+
+    /**
+     * Test that userId is still active, if not, tries to login with given user name.
+     * Does not autologin, if userName is null, obviously.
+     */
+    public void autoLogin( final String userName ) {
         final int uid = Main.pref.getInteger("geochat.lastuid", 0);
-        if( uid <= 0 ) return;
-        String query = "whoami&uid=" + uid;
-        JsonQueryUtil.queryAsync(query, new JsonQueryCallback() {
-            public void processJson( JSONObject json ) {
-                if( json != null && json.has("name") )
-                    login(uid, json.getString("name"));
-            }
-        });
+        if( uid <= 0 ) {
+            if( userName != null && userName.length() > 1 )
+                login(userName);
+        } else {
+            String query = "whoami&uid=" + uid;
+            JsonQueryUtil.queryAsync(query, new JsonQueryCallback() {
+                public void processJson( JSONObject json ) {
+                    if( json != null && json.has("name") )
+                        login(uid, json.getString("name"));
+                    else if( userName != null && userName.length() > 1 )
+                        login(userName);
+                }
+            });
+        }
+    }
+
+    /**
+     * Waits until {@link #getPosition()} is not null, then calls {@link #autoLogin(java.lang.String)}.
+     * If two seconds have passed, stops the waiting. Doesn't wait if userName is empty.
+     */
+    public void autoLoginWithDelay( final String userName ) {
+        if( userName == null || userName.length() == 0 ) {
+            checkLogin();
+            return;
+        }
+        new Thread(new Runnable() {
+            public void run() {
+                try {
+                    int cnt = 10;
+                    while( getPosition() == null && cnt-- > 0 )
+                        Thread.sleep(200);
+                } catch( InterruptedException e ) {}
+                autoLogin(userName);
+            }
+        }).start();
     }
 
Index: applications/editors/josm/plugins/geochat/src/geochat/GeoChatPanel.java
===================================================================
--- applications/editors/josm/plugins/geochat/src/geochat/GeoChatPanel.java	(revision 29581)
+++ applications/editors/josm/plugins/geochat/src/geochat/GeoChatPanel.java	(revision 29582)
@@ -3,5 +3,4 @@
 import java.awt.*;
 import java.awt.event.*;
-import java.awt.geom.Rectangle2D;
 import java.text.SimpleDateFormat;
 import java.util.*;
@@ -57,5 +56,6 @@
         };
 
-        loginPanel = createLoginPanel();
+        String defaultUserName = constructUserName();
+        loginPanel = createLoginPanel(defaultUserName);
 
         gcPanel = new JPanel(new BorderLayout());
@@ -67,16 +67,13 @@
         connection = ChatServerConnection.getInstance();
         connection.addListener(this);
-        connection.checkLogin();
-        updateTitleAlarm();
-    }
-
-    private JPanel createLoginPanel() {
-        final JTextField nameField = new JPanelTextField() {
-            @Override
-            protected void processEnter( String text ) {
-                connection.login(text);
-            }
-        };
-        String userName = Main.pref.get("geochat.username", JosmUserIdentityManager.getInstance().getUserName());
+        boolean autoLogin = Main.pref.get("geochat.username", null) == null ? false : Main.pref.getBoolean("geochat.autologin", true);
+        connection.autoLoginWithDelay(autoLogin ? defaultUserName : null);
+        updateTitleAlarm();
+    }
+
+    private String constructUserName() {
+        String userName = Main.pref.get("geochat.username", null); // so the default is null
+        if( userName == null )
+            userName = JosmUserIdentityManager.getInstance().getUserName();
         if( userName == null )
             userName = "";
@@ -84,5 +81,15 @@
             userName = userName.substring(0, userName.indexOf('@'));
         userName = userName.replace(' ', '_');
-        nameField.setText(userName);
+        return userName;
+    }
+
+    private JPanel createLoginPanel( String defaultUserName ) {
+        final JTextField nameField = new JPanelTextField() {
+            @Override
+            protected void processEnter( String text ) {
+                connection.login(text);
+            }
+        };
+        nameField.setText(defaultUserName);
 
         JButton loginButton = new JButton(tr("Login"));
@@ -94,7 +101,15 @@
         nameField.setPreferredSize(new Dimension(nameField.getPreferredSize().width, loginButton.getPreferredSize().height));
 
+        final JCheckBox autoLoginBox = new JCheckBox(tr("Enable autologin"), Main.pref.getBoolean("geochat.autologin", true));
+        autoLoginBox.addActionListener(new ActionListener() {
+            public void actionPerformed( ActionEvent e ) {
+                Main.pref.put("geochat.autologin", autoLoginBox.isSelected());
+            }
+        });
+
         JPanel panel = new JPanel(new GridBagLayout());
         panel.add(nameField, GBC.std().fill(GridBagConstraints.HORIZONTAL).insets(15, 0, 5, 0));
-        panel.add(loginButton, GBC.std().fill(GridBagConstraints.NONE).insets(0, 0, 15, 0));
+        panel.add(loginButton, GBC.eol().fill(GridBagConstraints.NONE).insets(0, 0, 15, 0));
+        panel.add(autoLoginBox, GBC.std().insets(15, 0, 15, 0));
         return panel;
     }
@@ -143,24 +158,24 @@
     public void paint( Graphics2D g, MapView mv, Bounds bbox ) {
         Graphics2D g2d = (Graphics2D)g.create();
-        g2d.setColor(Color.yellow);
-        g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.3f));
-
-        int zoom = ChatServerConnection.getCurrentZoom();
-        int radius = Math.max(zoom, 1) * 10;
-        if( zoom < 14 )
-            radius /= 2;
-
-        Font font = g2d.getFont().deriveFont(Font.BOLD, Math.max(zoom * 2, 8));
+        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+        Composite ac04 = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.4f);
+        Composite ac10 = g2d.getComposite();
+
+        Font font = g2d.getFont().deriveFont(Font.BOLD, g2d.getFont().getSize2D() + 2.0f);
         g2d.setFont(font);
         FontMetrics fm = g2d.getFontMetrics();
 
         for( String user : users.keySet() ) {
+            int stringWidth = fm.stringWidth(user);
+            int radius = stringWidth / 2 + 10;
             Point p = mv.getPoint(users.get(user));
-            g2d.setColor(Color.yellow);
+
+            g2d.setComposite(ac04);
+            g2d.setColor(Color.white);
             g2d.fillOval(p.x - radius, p.y - radius, radius * 2 + 1, radius * 2 + 1);
 
+            g2d.setComposite(ac10);
             g2d.setColor(Color.black);
-            Rectangle2D rect = fm.getStringBounds(user, g2d);
-            g2d.drawString(user, p.x - Math.round(rect.getWidth() / 2), p.y);
+            g2d.drawString(user, p.x - stringWidth / 2, p.y + fm.getDescent());
         }
     }
Index: applications/editors/josm/plugins/geochat/src/geochat/JPanelTextField.java
===================================================================
--- applications/editors/josm/plugins/geochat/src/geochat/JPanelTextField.java	(revision 29581)
+++ applications/editors/josm/plugins/geochat/src/geochat/JPanelTextField.java	(revision 29582)
@@ -4,5 +4,5 @@
 import java.awt.event.KeyEvent;
 import java.util.*;
-import javax.swing.JTextField;
+import org.openstreetmap.josm.gui.widgets.JosmTextField;
 import javax.swing.KeyStroke;
 import org.openstreetmap.josm.Main;
@@ -14,5 +14,5 @@
  * @author zverik
  */
-public class JPanelTextField extends JTextField {
+public class JPanelTextField extends JosmTextField {
 
     public JPanelTextField() {
