diff --git a/SabreTools.Serialization/Models/BZip2/Block.cs b/SabreTools.Serialization/Models/BZip2/Block.cs
new file mode 100644
index 00000000..d527576e
--- /dev/null
+++ b/SabreTools.Serialization/Models/BZip2/Block.cs
@@ -0,0 +1,12 @@
+namespace SabreTools.Data.Models.BZip2
+{
+ public class Block
+ {
+ ///
+ /// Block header
+ ///
+ public BlockHeader? Header { get; set; }
+
+ // TODO: Implement remaining structures
+ }
+}
diff --git a/SabreTools.Serialization/Models/BZip2/BlockHeader.cs b/SabreTools.Serialization/Models/BZip2/BlockHeader.cs
new file mode 100644
index 00000000..04a41087
--- /dev/null
+++ b/SabreTools.Serialization/Models/BZip2/BlockHeader.cs
@@ -0,0 +1,37 @@
+namespace SabreTools.Data.Models.BZip2
+{
+ public class BlockHeader
+ {
+ ///
+ /// A 48-bit integer value 31 41 59 26 53 59, which
+ /// is the binary-coded decimal representation of
+ /// pi. It is used to differentiate the block
+ /// from the footer.
+ ///
+ /// This may not be byte-aligned
+ public byte[]? Magic { get; set; }
+
+ ///
+ /// The CRC-32 checksum of the uncompressed data contained
+ /// in . It is the same checksum
+ /// used in GZip, but is slightly different due to the
+ /// bit-packing differences.
+ ///
+ public uint Crc32 { get; set; }
+
+ ///
+ /// Should be 0. Previous versions of BZip2 allowed
+ /// the input data to be randomized to avoid
+ /// pathological strings from causing the runtime
+ /// to be exponential.
+ ///
+ /// Actually a 1-bit value
+ public byte Randomized { get; set; }
+
+ ///
+ /// Contains the origin pointer used in the BWT stage
+ ///
+ /// Actually a 24-bit value
+ public uint OrigPtr { get; set; }
+ }
+}
diff --git a/SabreTools.Serialization/Models/BZip2/BlockTrees.cs b/SabreTools.Serialization/Models/BZip2/BlockTrees.cs
new file mode 100644
index 00000000..9d735a06
--- /dev/null
+++ b/SabreTools.Serialization/Models/BZip2/BlockTrees.cs
@@ -0,0 +1,26 @@
+namespace SabreTools.Data.Models.BZip2
+{
+ public class BlockTrees
+ {
+ // TODO: Implement SymMap
+
+ ///
+ /// Indicates the number of Huffman trees used in
+ /// the HUFF stage. It must between 2 and 6.
+ ///
+ /// Actually a 3-bit value
+ public byte NumTrees { get; set; }
+
+ ///
+ /// Indicates the number of selectors used in the
+ /// HUFF stage. There must be at least 1 selector
+ /// defined.
+ ///
+ /// Actually a 15-bit value
+ public ushort NumSels { get; set; }
+
+ // TODO: Implement Selectors
+
+ // TODO: Implement Trees
+ }
+}
\ No newline at end of file
diff --git a/SabreTools.Serialization/Models/BZip2/Constants.cs b/SabreTools.Serialization/Models/BZip2/Constants.cs
index 298d8fd1..ed505c82 100644
--- a/SabreTools.Serialization/Models/BZip2/Constants.cs
+++ b/SabreTools.Serialization/Models/BZip2/Constants.cs
@@ -6,4 +6,4 @@ namespace SabreTools.Data.Models.BZip2
public const string SignatureString = "BZh";
}
-}
\ No newline at end of file
+}