Index: /trunk/src/org/openstreetmap/josm/io/GpxReader.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/GpxReader.java	(revision 6079)
+++ /trunk/src/org/openstreetmap/josm/io/GpxReader.java	(revision 6080)
@@ -8,4 +8,5 @@
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.Reader;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -427,6 +428,7 @@
      */
     public GpxReader(InputStream source) throws IOException {
-        InputStream filtered = new InvalidXmlCharacterFilter(source);
-        this.inputSource = new InputSource(UTFInputStreamReader.create(filtered, "UTF-8"));
+        Reader utf8stream = UTFInputStreamReader.create(source, "UTF-8");
+        Reader filtered = new InvalidXmlCharacterFilter(utf8stream);
+        this.inputSource = new InputSource(filtered);
     }
 
Index: /trunk/src/org/openstreetmap/josm/io/InvalidXmlCharacterFilter.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/InvalidXmlCharacterFilter.java	(revision 6079)
+++ /trunk/src/org/openstreetmap/josm/io/InvalidXmlCharacterFilter.java	(revision 6080)
@@ -2,7 +2,6 @@
 package org.openstreetmap.josm.io;
 
-import java.io.FilterInputStream;
 import java.io.IOException;
-import java.io.InputStream;
+import java.io.Reader;
 
 import org.openstreetmap.josm.Main;
@@ -19,5 +18,7 @@
  * by space (0x20).
  */
-public class InvalidXmlCharacterFilter extends FilterInputStream {
+public class InvalidXmlCharacterFilter extends Reader {
+
+    private Reader reader;
 
     public static boolean firstWarning = true;
@@ -35,16 +36,11 @@
     }
 
-    public InvalidXmlCharacterFilter(InputStream in) {
-        super(in);
+    public InvalidXmlCharacterFilter(Reader reader) {
+        this.reader = reader;
     }
 
     @Override
-    public int read() throws IOException {
-        return filter((byte)super.read());
-    }
-
-    @Override
-    public int read(byte[] b, int off, int len) throws IOException {
-        int n = super.read(b, off, len);
+    public int read(char[] b, int off, int len) throws IOException {
+        int n = reader.read(b, off, len);
         if (n == -1) {
             return -1;
@@ -56,5 +52,10 @@
     }
 
-    private byte filter(byte in) {
+    @Override
+    public void close() throws IOException {
+        reader.close();
+    }
+
+    private char filter(char in) {
         if (in < 0x20 && in >= 0 && INVALID_CHARS[in]) {
             if (firstWarning) {
