diff -Nuar old-src/jcifs/smb/Handler.java src/jcifs/smb/Handler.java
--- old-src/jcifs/smb/Handler.java  2006-12-09 00:31:24.000000000 -0500
+++ src/jcifs/smb/Handler.java  2006-12-13 06:44:50.813474600 -0500
@@ -23,50 +23,12 @@
 import java.net.URLStreamHandler;
 import java.io.IOException;
 import java.io.UnsupportedEncodingException;
-
 import java.io.PrintStream;
 
 public class Handler extends URLStreamHandler {
 
     static final URLStreamHandler SMB_HANDLER = new Handler();
 
-    static String unescape( String str ) throws NumberFormatException, UnsupportedEncodingException {
-        char ch;
-        int i, j, state, len;
-        char[] out;
-        byte[] b = new byte[1];
-
-        if( str == null ) {
-            return null;
-        }
-
-        len = str.length();
-        out = new char[len];
-        state = 0;
-        for( i = j = 0; i < len; i++ ) {
-            switch( state ) {
-                case 0:
-                    ch = str.charAt( i );
-                    if( ch == '%' ) {
-                        state = 1;
-                    } else {
-                        out[j++] = ch;
-                    }
-                    break;
-                case 1:
-                    /* Get ASCII hex value and convert to platform dependant
-                     * encoding like EBCDIC perhaps
-                     */
-                    b[0] = (byte)(Integer.parseInt( str.substring( i, i + 2 ), 16 ) & 0xFF);
-                    out[j++] = (new String( b, 0, 1, "ASCII" )).charAt( 0 );
-                    i++;
-                    state = 0;
-            }
-        }
-
-        return new String( out, 0, j );
-    }
-
     protected int getDefaultPort() {
         return SmbConstants.DEFAULT_PORT;
     }
@@ -75,7 +37,7 @@
     }
     protected void parseURL( URL u, String spec, int start, int limit ) {
         String host = u.getHost();
-        String userinfo, path, ref;
+        String path, ref;
         int port;
 
         if( spec.equals( "smb://" )) {
@@ -87,13 +49,8 @@
             limit += 2;
         }
         super.parseURL( u, spec, start, limit );
-        userinfo = u.getUserInfo();
         path = u.getPath();
         ref = u.getRef();
-        try {
-            userinfo = unescape( userinfo );
-        } catch( UnsupportedEncodingException uee ) {
-        }
         if (ref != null) {
             path += '#' + ref;
         }
@@ -102,7 +59,7 @@
             port = getDefaultPort();
         }
         setURL( u, "smb", u.getHost(), port,
-                    u.getAuthority(), userinfo,
+                    u.getAuthority(), u.getUserInfo(),
                     path, u.getQuery(), null );
     }
 }
diff -Nuar old-src/jcifs/smb/NtlmPasswordAuthentication.java src/jcifs/smb/NtlmPasswordAuthentication.java
--- old-src/jcifs/smb/NtlmPasswordAuthentication.java   2006-12-09 00:31:24.000000000 -0500
+++ src/jcifs/smb/NtlmPasswordAuthentication.java   2006-12-13 06:45:36.884587400 -0500
@@ -186,6 +186,10 @@
         domain = username = password = null;
 
         if( userInfo != null ) {
+            try {
+                userInfo = unescape( userInfo );
+            } catch( UnsupportedEncodingException uee ) {
+            }
             int i, u, end;
             char c;
 
@@ -440,5 +444,43 @@
     public String toString() {
         return getName();
     }
+
+    static String unescape( String str ) throws NumberFormatException, UnsupportedEncodingException {
+        char ch;
+        int i, j, state, len;
+        char[] out;
+        byte[] b = new byte[1];
+
+        if( str == null ) {
+            return null;
+        }
+
+        len = str.length();
+        out = new char[len];
+        state = 0;
+        for( i = j = 0; i < len; i++ ) {
+            switch( state ) {
+                case 0:
+                    ch = str.charAt( i );
+                    if( ch == '%' ) {
+                        state = 1;
+                    } else {
+                        out[j++] = ch;
+                    }
+                    break;
+                case 1:
+                    /* Get ASCII hex value and convert to platform dependant
+                     * encoding like EBCDIC perhaps
+                     */
+                    b[0] = (byte)(Integer.parseInt( str.substring( i, i + 2 ), 16 ) & 0xFF);
+                    out[j++] = (new String( b, 0, 1, "ASCII" )).charAt( 0 );
+                    i++;
+                    state = 0;
+            }
+        }
+
+        return new String( out, 0, j );
+    }
+
 }
 
