diff --git a/lib/modules/Tools.pmod/Standalone.pmod/httpserver.pike b/lib/modules/Tools.pmod/Standalone.pmod/httpserver.pike
index a50c05af0cc470fdac3f5164066d1b245ea417a9..b37a9d74ec54aa47df6915fff9165e56459b85be 100644
--- a/lib/modules/Tools.pmod/Standalone.pmod/httpserver.pike
+++ b/lib/modules/Tools.pmod/Standalone.pmod/httpserver.pike
@@ -59,13 +59,13 @@ string dirlist( string dir )
         if( t == "application/octet-stream" )
             t = "<span style='color:darkgrey'>unknown</span>";
 
-	fn = Parser.encode_html_entities(fn);
         res += 
             sprintf("<tr class='%s'><td><a href='%s%s'>%s%[2]s</a></td>"
 		    "<td align='right'>%s</td>"
 		    "<td align='right'>%s</td></tr>\n", 
                     (i&1?"odd":"even"),
-                    fn, s->isdir?"/":"", fn, t,
+                    Protocols.HTTP.uri_encode(fn), s->isdir?"/":"", 
+		    Parser.encode_html_entities(fn), t,
                     s->isdir?"":String.int2size(s->size));
     }
     return res+"</table></body></html>\n";
@@ -82,6 +82,7 @@ string file_not_found(string fname)
 void handle_request(Protocols.HTTP.Server.Request request)
 {
     string file = "."+combine_path("/",request->not_query);
+    file = Protocols.HTTP.uri_decode(file);
     Stdio.Stat s = file_stat( file );
     if( !s )
 	request->response_and_finish( (["data":