diff --git a/src/ICSharpCode.SharpZipLib/SharpZipBaseException.cs b/src/ICSharpCode.SharpZipLib/Core/Exceptions/SharpZipBaseException.cs
similarity index 100%
rename from src/ICSharpCode.SharpZipLib/SharpZipBaseException.cs
rename to src/ICSharpCode.SharpZipLib/Core/Exceptions/SharpZipBaseException.cs
diff --git a/src/ICSharpCode.SharpZipLib/Core/Exceptions/StreamDecodingException.cs b/src/ICSharpCode.SharpZipLib/Core/Exceptions/StreamDecodingException.cs
new file mode 100644
index 000000000..4882a9f4d
--- /dev/null
+++ b/src/ICSharpCode.SharpZipLib/Core/Exceptions/StreamDecodingException.cs
@@ -0,0 +1,35 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace ICSharpCode.SharpZipLib
+{
+ ///
+ /// Indicates that an error occured during decoding of a input stream due to corrupt
+ /// data or (unintentional) library incompability.
+ ///
+ public class StreamDecodingException: SharpZipBaseException
+ {
+ private const string GenericMessage = "Input stream could not be decoded";
+
+ ///
+ /// Initializes a new instance of the StreamDecodingException with a generic message
+ ///
+ public StreamDecodingException() : base(GenericMessage) { }
+
+ ///
+ /// Initializes a new instance of the StreamDecodingException class with a specified error message.
+ ///
+ /// A message describing the exception.
+ public StreamDecodingException(string message) : base(message) { }
+
+
+ ///
+ /// Initializes a new instance of the StreamDecodingException class with a specified
+ /// error message and a reference to the inner exception that is the cause of this exception.
+ ///
+ /// A message describing the exception.
+ /// The inner exception
+ public StreamDecodingException(string message, Exception innerException) : base(message, innerException) { }
+ }
+}
diff --git a/src/ICSharpCode.SharpZipLib/Core/Exceptions/StreamUnsupportedException.cs b/src/ICSharpCode.SharpZipLib/Core/Exceptions/StreamUnsupportedException.cs
new file mode 100644
index 000000000..ff8579c4d
--- /dev/null
+++ b/src/ICSharpCode.SharpZipLib/Core/Exceptions/StreamUnsupportedException.cs
@@ -0,0 +1,33 @@
+using System;
+
+namespace ICSharpCode.SharpZipLib
+{
+ ///
+ /// Indicates that the input stream could not decoded due to known library incompability or missing features
+ ///
+ public class StreamUnsupportedException : StreamDecodingException
+ {
+ private const string GenericMessage = "Input stream is in a unsupported format";
+
+ ///
+ /// Initializes a new instance of the StreamUnsupportedException with a generic message
+ ///
+ public StreamUnsupportedException() : base(GenericMessage) { }
+
+ ///
+ /// Initializes a new instance of the StreamUnsupportedException class with a specified error message.
+ ///
+ /// A message describing the exception.
+ public StreamUnsupportedException(string message) : base(message) { }
+
+
+ ///
+ /// Initializes a new instance of the StreamUnsupportedException class with a specified
+ /// error message and a reference to the inner exception that is the cause of this exception.
+ ///
+ /// A message describing the exception.
+ /// The inner exception
+ public StreamUnsupportedException(string message, Exception innerException) : base(message, innerException) { }
+
+ }
+}
diff --git a/src/ICSharpCode.SharpZipLib/Core/Exceptions/UnexpectedEndOfStreamException.cs b/src/ICSharpCode.SharpZipLib/Core/Exceptions/UnexpectedEndOfStreamException.cs
new file mode 100644
index 000000000..975d6f796
--- /dev/null
+++ b/src/ICSharpCode.SharpZipLib/Core/Exceptions/UnexpectedEndOfStreamException.cs
@@ -0,0 +1,33 @@
+using System;
+
+namespace ICSharpCode.SharpZipLib
+{
+ ///
+ /// Indicates that the input stream could not decoded due to the stream ending before enough data had been provided
+ ///
+ public class UnexpectedEndOfStreamException : StreamDecodingException
+ {
+ private const string GenericMessage = "Input stream ended unexpectedly";
+
+ ///
+ /// Initializes a new instance of the UnexpectedEndOfStreamException with a generic message
+ ///
+ public UnexpectedEndOfStreamException() : base(GenericMessage) { }
+
+ ///
+ /// Initializes a new instance of the UnexpectedEndOfStreamException class with a specified error message.
+ ///
+ /// A message describing the exception.
+ public UnexpectedEndOfStreamException(string message) : base(message) { }
+
+
+ ///
+ /// Initializes a new instance of the UnexpectedEndOfStreamException class with a specified
+ /// error message and a reference to the inner exception that is the cause of this exception.
+ ///
+ /// A message describing the exception.
+ /// The inner exception
+ public UnexpectedEndOfStreamException(string message, Exception innerException) : base(message, innerException) { }
+
+ }
+}
diff --git a/src/ICSharpCode.SharpZipLib/Core/Exceptions/ValueOutOfRangeException.cs b/src/ICSharpCode.SharpZipLib/Core/Exceptions/ValueOutOfRangeException.cs
new file mode 100644
index 000000000..47a3aaea5
--- /dev/null
+++ b/src/ICSharpCode.SharpZipLib/Core/Exceptions/ValueOutOfRangeException.cs
@@ -0,0 +1,45 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace ICSharpCode.SharpZipLib
+{
+
+ ///
+ /// Indicates that a value was outside of the expected range when decoding an input stream
+ ///
+ public class ValueOutOfRangeException : StreamDecodingException
+ {
+ ///
+ /// Initializes a new instance of the ValueOutOfRangeException class naming the the causing variable
+ ///
+ /// Name of the variable, use: nameof()
+ public ValueOutOfRangeException(string nameOfValue )
+ : base($"{nameOfValue} out of range") { }
+
+ ///
+ /// Initializes a new instance of the ValueOutOfRangeException class naming the the causing variable,
+ /// it's current value and expected range.
+ ///
+ /// Name of the variable, use: nameof()
+ /// The invalid value
+ /// Expected maximum value
+ /// Expected minimum value
+ public ValueOutOfRangeException(string nameOfValue, long value, long maxValue, long minValue = 0)
+ : this(nameOfValue, value.ToString(), maxValue.ToString(), minValue.ToString()) { }
+
+ ///
+ /// Initializes a new instance of the ValueOutOfRangeException class naming the the causing variable,
+ /// it's current value and expected range.
+ ///
+ /// Name of the variable, use: nameof()
+ /// The invalid value
+ /// Expected maximum value
+ /// Expected minimum value
+ public ValueOutOfRangeException(string nameOfValue, string value, string maxValue, string minValue = "0") :
+ base($"{nameOfValue} out of range: {value}, should be {minValue}..{maxValue}") { }
+
+ private ValueOutOfRangeException() { }
+ private ValueOutOfRangeException(string message, Exception innerException) : base(message, innerException) {}
+ }
+}