diff --git a/src/ICSharpCode.SharpZipLib/Zip/ZipOutputStream.cs b/src/ICSharpCode.SharpZipLib/Zip/ZipOutputStream.cs
index 76e74023e..36349c886 100644
--- a/src/ICSharpCode.SharpZipLib/Zip/ZipOutputStream.cs
+++ b/src/ICSharpCode.SharpZipLib/Zip/ZipOutputStream.cs
@@ -328,7 +328,7 @@ public void PutNextPassthroughEntry(ZipEntry entry)
 
 			if(entry.CompressionMethod != CompressionMethod.Deflated)
 			{
-				throw new ZipException("Only Deflated entries are supported for passthrough");
+				throw new NotImplementedException("Only Deflated entries are supported for passthrough");
 			}
 
 			if(!string.IsNullOrEmpty(Password)) 
diff --git a/test/ICSharpCode.SharpZipLib.Tests/Zip/GeneralHandling.cs b/test/ICSharpCode.SharpZipLib.Tests/Zip/GeneralHandling.cs
index cce910789..e16a82967 100644
--- a/test/ICSharpCode.SharpZipLib.Tests/Zip/GeneralHandling.cs
+++ b/test/ICSharpCode.SharpZipLib.Tests/Zip/GeneralHandling.cs
@@ -386,43 +386,6 @@ public void StoredNonSeekableKnownSizeNoCrc()
 			Assert.IsTrue(ZipTesting.TestArchive(ms.ToArray()));
 		}
 
-		[Test]
-		[Category("Zip")]
-		public void StoredNonSeekablePrecompressed()
-		{
-			var data = Encoding.UTF8.GetBytes("Hello, world");
-
-			var crc = new Crc32();
-			crc.Update(data);
-
-			var compressedData = new MemoryStream();
-			using(var gz = new System.IO.Compression.DeflateStream(compressedData, System.IO.Compression.CompressionMode.Compress, true)) 
-			{
-				gz.Write(data, 0, data.Length);
-			}
-			compressedData.Position = 0;
-
-			MemoryStream ms = new MemoryStreamWithoutSeek();
-
-			using (ZipOutputStream outStream = new ZipOutputStream(ms))
-			{
-				outStream.IsStreamOwner = false;
-
-				var entry = new ZipEntry("dummyfile.tst");
-
-				entry.CompressionMethod = CompressionMethod.Deflated;
-				entry.Size = data.Length;
-				entry.Crc = (uint)crc.Value;
-				entry.CompressedSize = compressedData.Length;
-
-				outStream.PutNextPassthroughEntry(entry);
-
-				compressedData.CopyTo(outStream);
-			}
-
-			Assert.IsTrue(ZipTesting.TestArchive(ms.ToArray()));
-		}
-
 		[Test]
 		[Category("Zip")]
 		public void StoredNonSeekableKnownSizeNoCrcEncrypted()
diff --git a/test/ICSharpCode.SharpZipLib.Tests/Zip/PassthroughTests.cs b/test/ICSharpCode.SharpZipLib.Tests/Zip/PassthroughTests.cs
new file mode 100644
index 000000000..1a4b266f2
--- /dev/null
+++ b/test/ICSharpCode.SharpZipLib.Tests/Zip/PassthroughTests.cs
@@ -0,0 +1,140 @@
+﻿using System;
+using System.IO;
+using System.IO.Compression;
+using System.Text;
+using ICSharpCode.SharpZipLib.Checksum;
+using ICSharpCode.SharpZipLib.Tests.TestSupport;
+using ICSharpCode.SharpZipLib.Zip;
+using NUnit.Framework;
+
+namespace ICSharpCode.SharpZipLib.Tests.Zip
+{
+	[TestFixture]
+	public class PassthroughTests
+	{
+		[Test]
+		[Category("Zip")]
+		public void AddingValidPrecompressedEntryToZipOutputStream()
+		{
+			using var ms = new MemoryStream();
+
+			using (var outStream = new ZipOutputStream(ms){IsStreamOwner = false})
+			{
+				var (compressedData, crc, size) = CreateDeflatedData();
+				var entry = new ZipEntry("dummyfile.tst")
+				{
+					CompressionMethod = CompressionMethod.Deflated,
+					Size = size,
+					Crc = (uint)crc.Value,
+					CompressedSize = compressedData.Length,
+				};
+
+				outStream.PutNextPassthroughEntry(entry);
+
+				compressedData.CopyTo(outStream);
+			}
+
+			Assert.IsTrue(ZipTesting.TestArchive(ms.ToArray()));
+		}
+
+		private static (MemoryStream, Crc32, int) CreateDeflatedData()
+		{
+			var data = Encoding.UTF8.GetBytes("Hello, world");
+
+			var crc = new Crc32();
+			crc.Update(data);
+
+			var compressedData = new MemoryStream();
+			using(var gz = new DeflateStream(compressedData, CompressionMode.Compress, leaveOpen: true)) 
+			{
+				gz.Write(data, 0, data.Length);
+			}
+			compressedData.Position = 0;
+
+			return (compressedData, crc, data.Length);
+		}
+
+		[Test]
+		[Category("Zip")]
+		public void AddingPrecompressedEntryToZipOutputStreamWithInvalidSize()
+		{
+			using var outStream = new ZipOutputStream(new MemoryStream());
+			var (compressedData, crc, size) = CreateDeflatedData();
+			outStream.Password = "mockpassword";
+			var entry = new ZipEntry("dummyfile.tst")
+			{
+				CompressionMethod = CompressionMethod.Stored,
+				Crc = (uint)crc.Value,
+				CompressedSize = compressedData.Length,
+			};
+			
+			Assert.Throws<ZipException>(() =>
+			{
+				outStream.PutNextPassthroughEntry(entry);
+			});
+		}
+		
+		
+		[Test]
+		[Category("Zip")]
+		public void AddingPrecompressedEntryToZipOutputStreamWithInvalidCompressedSize()
+		{
+			using var outStream = new ZipOutputStream(new MemoryStream());
+			var (compressedData, crc, size) = CreateDeflatedData();
+			outStream.Password = "mockpassword";
+			var entry = new ZipEntry("dummyfile.tst")
+			{
+				CompressionMethod = CompressionMethod.Stored,
+				Size = size,
+				Crc = (uint)crc.Value,
+			};
+			
+			Assert.Throws<ZipException>(() =>
+			{
+				outStream.PutNextPassthroughEntry(entry);
+			});
+		}
+
+		[Test]
+		[Category("Zip")]
+		public void AddingPrecompressedEntryToZipOutputStreamWithNonSupportedMethod()
+		{
+			using var outStream = new ZipOutputStream(new MemoryStream());
+			var (compressedData, crc, size) = CreateDeflatedData();
+			outStream.Password = "mockpassword";
+			var entry = new ZipEntry("dummyfile.tst")
+			{
+				CompressionMethod = CompressionMethod.LZMA,
+				Size = size,
+				Crc = (uint)crc.Value,
+				CompressedSize = compressedData.Length,
+			};
+			
+			Assert.Throws<NotImplementedException>(() =>
+			{
+				outStream.PutNextPassthroughEntry(entry);
+			});
+		}
+
+		[Test]
+		[Category("Zip")]
+		public void AddingPrecompressedEntryToZipOutputStreamWithEncryption()
+		{
+			using var outStream = new ZipOutputStream(new MemoryStream());
+			var (compressedData, crc, size) = CreateDeflatedData();
+			outStream.Password = "mockpassword";
+			var entry = new ZipEntry("dummyfile.tst")
+			{
+				CompressionMethod = CompressionMethod.Deflated,
+				Size = size,
+				Crc = (uint)crc.Value,
+				CompressedSize = compressedData.Length,
+			};
+			
+			Assert.Throws<NotImplementedException>(() =>
+			{
+				outStream.PutNextPassthroughEntry(entry);
+			});
+		}
+	}
+}
