diff --git a/src/url.c b/src/url.c
index daf66f3..cd7332f 100644
--- a/src/url.c
+++ b/src/url.c
@@ -1394,6 +1394,103 @@ UWC,  C,  C,  C,   C,  C,  C,  C,   /* NUL SOH STX ETX  EOT ENQ ACK BEL */
    If ESCAPED is true, the path element is considered to be
    URL-escaped and will be unescaped prior to inspection.  */
 
+#ifdef WINDOWS
+
+void
+append_uri_pathel (const char *b, const char *e, bool escaped,
+                   struct growable *dest)
+{
+  const char *p;
+
+  const char *p2;
+
+  wchar_t *w_string;
+  char *char_buffer;
+  int char_size;
+
+  int wchar_count;
+  int buffer_size;
+  int i;
+  int quoted, outlen;
+  int mask;
+
+ 
+  if (opt.restrict_files_os == restrict_unix)
+    mask = filechr_not_unix;
+  else
+    mask = filechr_not_windows;
+  if (opt.restrict_files_ctrl)
+    mask |= filechr_control;
+  if (escaped)
+    {
+      char *unescaped;
+      BOUNDED_TO_ALLOCA (b, e, unescaped);
+      url_unescape (unescaped);
+      b = unescaped;
+      e = unescaped + strlen (unescaped);
+    }
+
+  if (e - b == 2 && b[0] == '.' && b[1] == '.')
+    {
+      b = "%2E%2E";
+      e = b + 6;
+    }
+  char_buffer=alloca(sizeof(wchar_t));
+  wchar_count=MultiByteToWideChar(CP_UTF8, 0, b, e-b, w_string, 0);
+  buffer_size=sizeof(wchar_t) * (wchar_count);
+  w_string=alloca(buffer_size);
+  MultiByteToWideChar(CP_UTF8, 0, b, e-b, w_string, buffer_size);
+
+  quoted = 0;
+  for (i = 0; i < wchar_count; i++)
+   {
+     if ( WideCharToMultiByte(65001,0,w_string+i,1,char_buffer,0,NULL,NULL) == 1)
+     {
+       WideCharToMultiByte(65001,0,w_string+i,1,char_buffer,1,NULL,NULL);
+       if (FILE_CHAR_TEST (char_buffer[0], mask))
+         ++quoted;
+     }
+   }
+  outlen = (e - b) + (2 * quoted);
+  GROW (dest, outlen);
+
+  if (!quoted)
+    {
+      memcpy (TAIL (dest), b, outlen);
+    }
+  else
+    {
+      char *q = TAIL (dest);
+      char_size=0;
+      p2=char_buffer;
+      w_string--;
+      for (p = b; p < e; p++)
+        {
+          if (p2-char_buffer>=char_size) {
+            w_string++;
+            char_size = WideCharToMultiByte(65001,0,w_string,1,char_buffer,0,NULL,NULL);
+            WideCharToMultiByte(65001,0,w_string,1,char_buffer,char_size,NULL,NULL);
+            p2=char_buffer;
+          } 
+          if (!(char_size == 1 && FILE_CHAR_TEST (*p2, mask)))
+            *q++ = *p2;
+          else
+            {
+              unsigned char ch = *p2;
+              *q++ = '%';
+              *q++ = XNUM_TO_DIGIT (ch >> 4);
+              *q++ = XNUM_TO_DIGIT (ch & 0xf);
+            }
+          p2++;
+        }
+      assert (q - TAIL (dest) == outlen);
+    }
+
+  TAIL_INCR (dest, outlen);              
+  append_null (dest);
+}
+#else
+
 static void
 append_uri_pathel (const char *b, const char *e, bool escaped,
                    struct growable *dest)
@@ -1501,7 +1598,7 @@ append_uri_pathel (const char *b, const char *e, bool escaped,
   TAIL_INCR (dest, outlen);
   append_null (dest);
 }
-
+#endif
 /* Append to DEST the directory structure that corresponds the
    directory part of URL's path.  For example, if the URL is
    http://server/dir1/dir2/file, this appends "/dir1/dir2".
@@ -2363,4 +2460,3 @@ test_are_urls_equal()
 /*
  * vim: et ts=2 sw=2
  */
-
