diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/internal/DelegatingInputStream.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/internal/DelegatingInputStream.java
new file mode 100644
index 0000000..f083ba3
--- /dev/null
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/internal/DelegatingInputStream.java
@@ -0,0 +1,75 @@
+/*
+ *     Licensed to the Apache Software Foundation (ASF) under one or more
+ *     contributor license agreements.  See the NOTICE file distributed with
+ *     this work for additional information regarding copyright ownership.
+ *     The ASF licenses this file to You under the Apache License, Version 2.0
+ *     (the "License"); you may not use this file except in compliance with
+ *     the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *     Unless required by applicable law or agreed to in writing, software
+ *     distributed under the License is distributed on an "AS IS" BASIS,
+ *     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *     See the License for the specific language governing permissions and
+ *     limitations under the License.
+ */
+package org.apache.johnzon.mapper.internal;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Objects;
+
+public class DelegatingInputStream extends InputStream {
+
+    private final InputStream inputStream;
+
+    public DelegatingInputStream(InputStream inputStream) {
+        this.inputStream = Objects.requireNonNull(inputStream, "delegate inputStream must not be null");
+    }
+
+    @Override
+    public void close() throws IOException {
+        inputStream.close();
+    }
+
+    @Override
+    public int read(final byte[] b) throws IOException {
+        return inputStream.read(b);
+    }
+
+    @Override
+    public int read(final byte[] b, final int off, final int len) throws IOException {
+        return inputStream.read(b, off, len);
+    }
+
+    @Override
+    public long skip(final long n) throws IOException {
+        return inputStream.skip(n);
+    }
+
+    @Override
+    public int available() throws IOException {
+        return inputStream.available();
+    }
+
+    @Override
+    public void mark(final int readlimit) {
+        inputStream.mark(readlimit);
+    }
+
+    @Override
+    public void reset() throws IOException {
+        inputStream.reset();
+    }
+
+    @Override
+    public boolean markSupported() {
+        return inputStream.markSupported();
+    }
+
+    @Override
+    public int read() throws IOException {
+        return inputStream.read();
+    }
+}
\ No newline at end of file
diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/internal/DelegatingOutputStream.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/internal/DelegatingOutputStream.java
new file mode 100644
index 0000000..cf5c168
--- /dev/null
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/internal/DelegatingOutputStream.java
@@ -0,0 +1,55 @@
+/*
+ *     Licensed to the Apache Software Foundation (ASF) under one or more
+ *     contributor license agreements.  See the NOTICE file distributed with
+ *     this work for additional information regarding copyright ownership.
+ *     The ASF licenses this file to You under the Apache License, Version 2.0
+ *     (the "License"); you may not use this file except in compliance with
+ *     the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *     Unless required by applicable law or agreed to in writing, software
+ *     distributed under the License is distributed on an "AS IS" BASIS,
+ *     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *     See the License for the specific language governing permissions and
+ *     limitations under the License.
+ */
+package org.apache.johnzon.mapper.internal;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.Objects;
+
+public class DelegatingOutputStream extends OutputStream {
+
+    private final OutputStream outputStream;
+
+    public DelegatingOutputStream(OutputStream outputStream) {
+        this.outputStream = Objects.requireNonNull(outputStream, "delegate outputStream must not be null");
+    }
+
+    @Override
+    public void close() throws IOException {
+        outputStream.close();
+    }
+
+    @Override
+    public void write(final int b) throws IOException {
+        outputStream.write(b);
+    }
+
+    @Override
+    public void write(final byte[] b) throws IOException {
+        outputStream.write(b);
+    }
+
+    @Override
+    public void write(final byte[] b, final int off, final int len) throws IOException {
+        outputStream.write(b, off, len);
+    }
+
+    @Override
+    public void flush() throws IOException {
+        outputStream.flush();
+    }
+}
\ No newline at end of file
diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/internal/DelegatingReader.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/internal/DelegatingReader.java
new file mode 100644
index 0000000..617e525
--- /dev/null
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/internal/DelegatingReader.java
@@ -0,0 +1,81 @@
+/*
+ *     Licensed to the Apache Software Foundation (ASF) under one or more
+ *     contributor license agreements.  See the NOTICE file distributed with
+ *     this work for additional information regarding copyright ownership.
+ *     The ASF licenses this file to You under the Apache License, Version 2.0
+ *     (the "License"); you may not use this file except in compliance with
+ *     the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *     Unless required by applicable law or agreed to in writing, software
+ *     distributed under the License is distributed on an "AS IS" BASIS,
+ *     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *     See the License for the specific language governing permissions and
+ *     limitations under the License.
+ */
+package org.apache.johnzon.mapper.internal;
+
+import java.io.IOException;
+import java.io.Reader;
+import java.nio.CharBuffer;
+import java.util.Objects;
+
+public class DelegatingReader extends Reader {
+
+    private final Reader reader;
+
+    public DelegatingReader(Reader reader) {
+        this.reader = Objects.requireNonNull(reader, "delegate reader must not be null");
+    }
+
+    @Override
+    public void close() throws IOException {
+        reader.close();
+    }
+
+    @Override
+    public int read(final CharBuffer target) throws IOException {
+        return reader.read(target);
+    }
+
+    @Override
+    public int read() throws IOException {
+        return reader.read();
+    }
+
+    @Override
+    public int read(final char[] cbuf) throws IOException {
+        return reader.read(cbuf);
+    }
+
+    @Override
+    public int read(final char[] cbuf, final int off, final int len) throws IOException {
+        return reader.read(cbuf, off, len);
+    }
+
+    @Override
+    public long skip(final long n) throws IOException {
+        return reader.skip(n);
+    }
+
+    @Override
+    public boolean ready() throws IOException {
+        return reader.ready();
+    }
+
+    @Override
+    public boolean markSupported() {
+        return reader.markSupported();
+    }
+
+    @Override
+    public void mark(final int readAheadLimit) throws IOException {
+        reader.mark(readAheadLimit);
+    }
+
+    @Override
+    public void reset() throws IOException {
+        reader.reset();
+    }
+}
\ No newline at end of file
diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/internal/DelegatingWriter.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/internal/DelegatingWriter.java
new file mode 100644
index 0000000..0de1fc2
--- /dev/null
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/internal/DelegatingWriter.java
@@ -0,0 +1,79 @@
+/*
+ *     Licensed to the Apache Software Foundation (ASF) under one or more
+ *     contributor license agreements.  See the NOTICE file distributed with
+ *     this work for additional information regarding copyright ownership.
+ *     The ASF licenses this file to You under the Apache License, Version 2.0
+ *     (the "License"); you may not use this file except in compliance with
+ *     the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *     Unless required by applicable law or agreed to in writing, software
+ *     distributed under the License is distributed on an "AS IS" BASIS,
+ *     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *     See the License for the specific language governing permissions and
+ *     limitations under the License.
+ */
+package org.apache.johnzon.mapper.internal;
+
+import java.io.IOException;
+import java.io.Writer;
+import java.util.Objects;
+
+public class DelegatingWriter extends Writer {
+    private final Writer writer;
+
+    public DelegatingWriter(Writer writer) {
+        this.writer = Objects.requireNonNull(writer, "delegate writer must not be null");
+    }
+
+    @Override
+    public void write(final int c) throws IOException {
+        writer.write(c);
+    }
+
+    @Override
+    public void write(final char[] cbuf) throws IOException {
+        writer.write(cbuf);
+    }
+
+    @Override
+    public void write(final char[] cbuf, final int off, final int len) throws IOException {
+        writer.write(cbuf, off, len);
+    }
+
+    @Override
+    public void write(final String str) throws IOException {
+        writer.write(str);
+    }
+
+    @Override
+    public void write(final String str, final int off, final int len) throws IOException {
+        writer.write(str, off, len);
+    }
+
+    @Override
+    public Writer append(final CharSequence csq) throws IOException {
+        return writer.append(csq);
+    }
+
+    @Override
+    public Writer append(final CharSequence csq, final int start, final int end) throws IOException {
+        return writer.append(csq, start, end);
+    }
+
+    @Override
+    public Writer append(final char c) throws IOException {
+        return writer.append(c);
+    }
+
+    @Override
+    public void flush() throws IOException {
+        writer.flush();
+    }
+
+    @Override
+    public void close() throws IOException {
+        writer.close();
+    }
+}
\ No newline at end of file
diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/internal/Streams.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/internal/Streams.java
index 8fb273c..e4bc8d5 100644
--- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/internal/Streams.java
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/internal/Streams.java
@@ -21,195 +21,44 @@
 import java.io.OutputStream;
 import java.io.Reader;
 import java.io.Writer;
-import java.nio.CharBuffer;
 
 public final class Streams {
     private Streams() {
         // no-op
     }
 
-    public static Writer noClose(final Writer from) {
-        return new Writer() {
-            @Override
-            public void write(final int c) throws IOException {
-                from.write(c);
-            }
-
-            @Override
-            public void write(final char[] cbuf) throws IOException {
-                from.write(cbuf);
-            }
-
-            @Override
-            public void write(final char[] cbuf, final int off, final int len) throws IOException {
-                from.write(cbuf, off, len);
-            }
-
-            @Override
-            public void write(final String str) throws IOException {
-                from.write(str);
-            }
-
-            @Override
-            public void write(final String str, final int off, final int len) throws IOException {
-                from.write(str, off, len);
-            }
-
-            @Override
-            public Writer append(final CharSequence csq) throws IOException {
-                return from.append(csq);
-            }
-
-            @Override
-            public Writer append(final CharSequence csq, final int start, final int end) throws IOException {
-                return from.append(csq, start, end);
-            }
-
-            @Override
-            public Writer append(final char c) throws IOException {
-                return from.append(c);
-            }
-
-            @Override
-            public void flush() throws IOException {
-                from.flush();
-            }
-
+    public static Writer noClose(final Writer writer) {
+        return new DelegatingWriter(writer) {
             @Override
             public void close() throws IOException {
-                from.flush();
+                flush();
             }
         };
     }
 
-    public static Reader noClose(final Reader from) {
-        return new Reader() {
+    public static Reader noClose(final Reader reader) {
+        return new DelegatingReader(reader) {
             @Override
             public void close() throws IOException {
                 // no-op
             }
-
-            @Override
-            public int read(final CharBuffer target) throws IOException {
-                return from.read(target);
-            }
-
-            @Override
-            public int read() throws IOException {
-                return from.read();
-            }
-
-            @Override
-            public int read(final char[] cbuf) throws IOException {
-                return from.read(cbuf);
-            }
-
-            @Override
-            public int read(final char[] cbuf, final int off, final int len) throws IOException {
-                return from.read(cbuf, off, len);
-            }
-
-            @Override
-            public long skip(final long n) throws IOException {
-                return from.skip(n);
-            }
-
-            @Override
-            public boolean ready() throws IOException {
-                return from.ready();
-            }
-
-            @Override
-            public boolean markSupported() {
-                return from.markSupported();
-            }
-
-            @Override
-            public void mark(final int readAheadLimit) throws IOException {
-                from.mark(readAheadLimit);
-            }
-
-            @Override
-            public void reset() throws IOException {
-                from.reset();
-            }
         };
     }
-    public static OutputStream noClose(final OutputStream from) {
-        return new OutputStream() {
+    public static OutputStream noClose(final OutputStream outputStream) {
+        return new DelegatingOutputStream(outputStream) {
             @Override
             public void close() throws IOException {
-                from.flush();
-            }
-
-            @Override
-            public void write(final int b) throws IOException {
-                from.write(b);
-            }
-
-            @Override
-            public void write(final byte[] b) throws IOException {
-                from.write(b);
-            }
-
-            @Override
-            public void write(final byte[] b, final int off, final int len) throws IOException {
-                from.write(b, off, len);
-            }
-
-            @Override
-            public void flush() throws IOException {
-                from.flush();
+                flush();
             }
         };
     }
 
-    public static InputStream noClose(final InputStream from) {
-        return new InputStream() {
+    public static InputStream noClose(final InputStream inputStream) {
+        return new DelegatingInputStream(inputStream) {
             @Override
             public void close() throws IOException {
                 // no-op
             }
-
-            @Override
-            public int read(final byte[] b) throws IOException {
-                return from.read(b);
-            }
-
-            @Override
-            public int read(final byte[] b, final int off, final int len) throws IOException {
-                return from.read(b, off, len);
-            }
-
-            @Override
-            public long skip(final long n) throws IOException {
-                return from.skip(n);
-            }
-
-            @Override
-            public int available() throws IOException {
-                return from.available();
-            }
-
-            @Override
-            public void mark(final int readlimit) {
-                from.mark(readlimit);
-            }
-
-            @Override
-            public void reset() throws IOException {
-                from.reset();
-            }
-
-            @Override
-            public boolean markSupported() {
-                return from.markSupported();
-            }
-
-            @Override
-            public int read() throws IOException {
-                return from.read();
-            }
         };
     }
 }
