diff --git a/src/acpi/hpet.rs b/src/acpi/hpet.rs
new file mode 100644
index 0000000000000000000000000000000000000000..9f76caa6e7679f137d92a8fedf90d52af7e90e9d
--- /dev/null
+++ b/src/acpi/hpet.rs
@@ -0,0 +1,39 @@
+use core::{mem, ptr};
+
+use super::sdt::Sdt;
+
+#[repr(packed)]
+#[derive(Clone, Copy, Debug, Default)]
+pub struct GenericAddressStructure {
+    address_space: u8,
+    bit_width: u8,
+    bit_offset: u8,
+    access_size: u8,
+    address: u64,
+}
+
+#[repr(packed)]
+#[derive(Debug)]
+pub struct Hpet {
+    pub header: Sdt,
+
+    pub hw_rev_id: u8,
+    pub comparator_descriptor: u8,
+    pub pci_vendor_id: u16,
+
+    pub base_address: GenericAddressStructure,
+
+    pub hpet_number: u8,
+    pub min_periodic_clk_tick: u16,
+    pub oem_attribute: u8
+}
+
+impl Hpet {
+    pub fn new(sdt: &'static Sdt) -> Option<Hpet> {
+        if &sdt.signature == b"HPET" && sdt.length as usize >= mem::size_of::<Hpet>() {
+            Some(unsafe { ptr::read((sdt as *const Sdt) as *const Hpet) })
+        } else {
+            None
+        }
+    }
+}
diff --git a/src/acpi/mod.rs b/src/acpi/mod.rs
index 98d9ba9e66f5917a12503517e344bd9eb6551adf..7a564afe465e6b26b0642dade61ae521ea33271c 100644
--- a/src/acpi/mod.rs
+++ b/src/acpi/mod.rs
@@ -18,9 +18,11 @@ use self::madt::{Madt, MadtEntry};
 use self::rsdt::Rsdt;
 use self::sdt::Sdt;
 use self::xsdt::Xsdt;
+use self::hpet::Hpet;
 
 use self::aml::{is_aml_table, parse_aml_table, AmlNamespace, AmlError};
 
+mod hpet;
 mod dmar;
 mod fadt;
 mod madt;
@@ -195,6 +197,8 @@ fn parse_sdt(sdt: &'static Sdt, active_table: &mut ActivePageTable) {
                 _ => ()
             }
         }
+    } else if let Some(hpet) = Hpet::new(sdt) {
+        println!(": {:#?}", hpet);
     } else if is_aml_table(sdt) {
         ACPI_TABLE.lock().namespace = match parse_aml_table(sdt) {
             Ok(res) => {