Index: src/org/openstreetmap/josm/tools/Base64.java
===================================================================
--- src/org/openstreetmap/josm/tools/Base64.java	(revision 645)
+++ src/org/openstreetmap/josm/tools/Base64.java	(working copy)
@@ -1,20 +1,47 @@
 // License: GPL. Copyright 2007 by Immanuel Scholz and others
 package org.openstreetmap.josm.tools;
 
+import java.nio.ByteBuffer;
+
 public class Base64 {
 
-	private static String enc = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+    private static String enc = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
 
-	public static String encode(String s) {
-		StringBuilder out = new StringBuilder();
-		for (int i = 0; i < (s.length()+2)/3; ++i) {
-			int l = Math.min(3, s.length()-i*3);
-			String buf = s.substring(i*3, i*3+l);
+    public static String encode(String s) {
+        StringBuilder out = new StringBuilder();
+        for (int i = 0; i < (s.length()+2)/3; ++i) {
+            int l = Math.min(3, s.length()-i*3);
+            String buf = s.substring(i*3, i*3+l);
             out.append(enc.charAt(buf.charAt(0)>>2));
-            out.append(enc.charAt((buf.charAt(0) & 0x03) << 4 | (l==1?0:(buf.charAt(1) & 0xf0) >> 4)));
+            out.append(enc.charAt(
+                                  (buf.charAt(0) & 0x03) << 4 |
+                                  (l==1?
+                                   0:
+                                   (buf.charAt(1) & 0xf0) >> 4)));
             out.append(l>1?enc.charAt((buf.charAt(1) & 0x0f) << 2 | (l==2?0:(buf.charAt(2) & 0xc0) >> 6)):'=');
             out.append(l>2?enc.charAt(buf.charAt(2) & 0x3f):'=');
-		}
-		return out.toString();
-	}
+        }
+        return out.toString();
+    }
+
+    public static String encode(ByteBuffer s) {
+        StringBuilder out = new StringBuilder();
+        // Read 3 bytes at a time.
+        for (int i = 0; i < (s.limit()+2)/3; ++i) {
+            int l = Math.min(3, s.limit()-i*3);
+            int byte0 = s.get() & 0xff;
+            int byte1 = l>1? s.get() & 0xff : 0;
+            int byte2 = l>2? s.get() & 0xff : 0;
+
+            out.append(enc.charAt(byte0>>2));
+            out.append(enc.charAt(
+                                  (byte0 & 0x03) << 4 |
+                                  (l==1?
+                                   0:
+                                   (byte1 & 0xf0) >> 4)));
+            out.append(l>1?enc.charAt((byte1 & 0x0f) << 2 | (l==2?0:(byte2 & 0xc0) >> 6)):'=');
+            out.append(l>2?enc.charAt(byte2 & 0x3f):'=');
+        }
+        return out.toString();
+    }
 }
Index: src/org/openstreetmap/josm/io/OsmConnection.java
===================================================================
--- src/org/openstreetmap/josm/io/OsmConnection.java	(revision 645)
+++ src/org/openstreetmap/josm/io/OsmConnection.java	(working copy)
@@ -8,6 +8,11 @@ import java.awt.GridBagLayout;
 import java.net.Authenticator;
 import java.net.HttpURLConnection;
 import java.net.PasswordAuthentication;
+import java.nio.ByteBuffer;
+import java.nio.CharBuffer;
+import java.nio.charset.Charset;
+import java.nio.charset.CharsetEncoder;
+import java.nio.charset.CharacterCodingException;
 
 import javax.swing.JCheckBox;
 import javax.swing.JLabel;
@@ -128,7 +133,10 @@ public class OsmConnection {
 		}
 	}
 
-	protected void addAuth(HttpURLConnection con) {
-        con.addRequestProperty("Authorization", "Basic "+Base64.encode(Main.pref.get("osm-server.username")+":"+Main.pref.get("osm-server.password")));
+	protected void addAuth(HttpURLConnection con) throws CharacterCodingException {
+            CharsetEncoder encoder = Charset.forName("UTF-8").newEncoder();
+            String auth = Main.pref.get("osm-server.username") + ":" + Main.pref.get("osm-server.password");
+            ByteBuffer bytes = encoder.encode(CharBuffer.wrap(auth));
+            con.addRequestProperty("Authorization", "Basic "+Base64.encode(bytes));
     }
 }
