diff --git a/src/state.rs b/src/state.rs
index 19609f507a097587cdbe9eb450885f63f39bb399..bc6504b194f0515e0a7c79a9c1ceafc344a8e5c0 100644
--- a/src/state.rs
+++ b/src/state.rs
@@ -1,5 +1,12 @@
 #[repr(packed)]
-pub struct BeesBlock {
+pub struct BeesState {
+    pub name: BeesName,
+    pub info: BeesInfo,
+    pub core: BeesCore,
+}
+
+#[repr(packed)]
+pub struct BeesBlockHeader {
     pub magic: u32,
     pub size: u32,
 }
@@ -16,9 +23,22 @@ pub struct BeesFooter {
     pub magic: u32,
 }
 
+#[repr(packed)]
+pub struct BeesName {
+    pub header: BeesBlockHeader,
+    pub name: String,
+}
+
+#[repr(packed)]
+pub struct BeesInfo {
+    pub header: BeesBlockHeader,
+    pub title: [u8; 16],
+    pub checksum: [u8; 2],
+}
+
 #[repr(packed)]
 pub struct BeesCore {
-    pub header: BeesBlock,
+    pub header: BeesBlockHeader,
 
     pub major: u16,
     pub minor: u16,
@@ -38,7 +58,7 @@ pub struct BeesCore {
     pub execution_mode: u8,
     _padding: u8,
 
-    pub io_registers: [u8; 0x80],
+    pub io_registers: [u8; 128],
 
     pub ram: BeesBuffer,
     pub vram: BeesBuffer,
@@ -48,3 +68,31 @@ pub struct BeesCore {
     pub background_palettes: BeesBuffer,
     pub object_palettes: BeesBuffer,
 }
+
+trait Serialize {
+    fn store(&self, buffer: &mut Vec<u8>);
+    fn load(&self, data: &[u8]);
+}
+
+impl Serialize for BeesState {
+    fn store(&self, buffer: &mut Vec<u8>) {
+        self.info.store(buffer);
+    }
+
+    fn load(&self, data: &[u8]) {
+        todo!()
+    }
+}
+
+impl Serialize for BeesName {
+    fn store(&self, buffer: &mut Vec<u8>) {
+    }
+
+    fn load(&self, data: &[u8]) {}
+}
+
+impl Serialize for BeesInfo {
+    fn store(&self, buffer: &mut Vec<u8>) {}
+
+    fn load(&self, data: &[u8]) {}
+}