diff --git a/Lidgren.Network/NetIncomingMessage.Stream.cs b/Lidgren.Network/NetIncomingMessage.Stream.cs
new file mode 100644
index 0000000..caec916
--- /dev/null
+++ b/Lidgren.Network/NetIncomingMessage.Stream.cs
@@ -0,0 +1,63 @@
+using System;
+using System.IO;
+
+namespace Lidgren.Network
+{
+ public partial class NetIncomingMessage : Stream
+ {
+ public override bool CanRead { get { return true; } }
+ public override bool CanSeek { get { return true; } }
+ public override bool CanWrite { get { return false; } }
+
+ public override void Flush()
+ {
+ // no op
+ }
+
+ ///
+ /// Gets the length in bytes
+ ///
+ public override long Length
+ {
+ get { return LengthBytes; }
+ }
+
+ public override int Read(byte[] buffer, int offset, int count)
+ {
+ // limit amount to remaining
+ int remainingBytes = NetUtility.BytesToHoldBits(m_bitLength - m_readPosition);
+ if (count > remainingBytes)
+ count = remainingBytes;
+ if (count < 1)
+ return 0;
+
+ ReadBytes(buffer, offset, count);
+ return count;
+ }
+
+ ///
+ /// Sets the position in the stream, in bytes
+ ///
+ public override long Seek(long offset, SeekOrigin origin)
+ {
+ switch (origin)
+ {
+ case SeekOrigin.Begin:
+ Position = (offset * 8);
+ break;
+ case SeekOrigin.Current:
+ Position = Position + (offset * 8);
+ break;
+ case SeekOrigin.End:
+ Position = (LengthBytes - offset) * 8;
+ break;
+ }
+ throw new NotImplementedException("Bad SeekOrigin");
+ }
+
+ public override void SetLength(long value)
+ {
+ throw new NetException("It's not possible to set the length of the NetIncomingMessage");
+ }
+ }
+}
diff --git a/Lidgren.Network/NetOutgoingMessage.Stream.cs b/Lidgren.Network/NetOutgoingMessage.Stream.cs
new file mode 100644
index 0000000..d7fc94b
--- /dev/null
+++ b/Lidgren.Network/NetOutgoingMessage.Stream.cs
@@ -0,0 +1,52 @@
+using System;
+using System.IO;
+
+namespace Lidgren.Network
+{
+ public partial class NetOutgoingMessage : Stream
+ {
+ public override bool CanRead { get { return false; } }
+ public override bool CanSeek { get { return false; } }
+ public override bool CanWrite { get { return true; } }
+
+ public override void Flush()
+ {
+ // no op
+ }
+
+ ///
+ /// Gets the length of the stream, in bytes
+ ///
+ public override long Length
+ {
+ get { return (long)LengthBytes; }
+ }
+
+ public override long Position
+ {
+ get
+ {
+ throw new NetException("Position in bytes is not relevant since the bit count can vary");
+ }
+ set
+ {
+ throw new NetException("It's not possible to seek in this message");
+ }
+ }
+
+ public override int Read(byte[] buffer, int offset, int count)
+ {
+ throw new NetException("It's not possible to read from this message");
+ }
+
+ public override long Seek(long offset, SeekOrigin origin)
+ {
+ throw new NetException("It's not possible to seek in this message");
+ }
+
+ public override void SetLength(long value)
+ {
+ throw new NetException("It's not possible to set the length of this message");
+ }
+ }
+}