diff --git a/src/acpi/aml/namespace.rs b/src/acpi/aml/namespace.rs
index 871639868a94768f2fd6631caf6e156ce7d02f5d..fef3b20cf3a239f90d5f22ef30875ec395729b23 100644
--- a/src/acpi/aml/namespace.rs
+++ b/src/acpi/aml/namespace.rs
@@ -4,7 +4,7 @@ use alloc::string::ToString;
 use alloc::vec::Vec;
 use alloc::collections::BTreeMap;
 
-use core::fmt::{Debug, Formatter, Error};
+use core::fmt::Debug;
 use core::str::FromStr;
 
 use super::termlist::parse_term_list;
diff --git a/src/acpi/dmar/mod.rs b/src/acpi/dmar/mod.rs
index 1e18a52273e9e8384b47cde9341bc15b3786b151..4e5c36366d381c925bd38864fca46e4050dfceba 100644
--- a/src/acpi/dmar/mod.rs
+++ b/src/acpi/dmar/mod.rs
@@ -39,12 +39,12 @@ impl Dmar {
                     DmarEntry::Drhd(dmar_drhd) => {
                         let drhd = dmar_drhd.get(active_table);
 
-                        println!("VER: {:X}", drhd.version);
-                        println!("CAP: {:X}", drhd.cap);
-                        println!("EXT_CAP: {:X}", drhd.ext_cap);
-                        println!("GCMD: {:X}", drhd.gl_cmd);
-                        println!("GSTS: {:X}", drhd.gl_sts);
-                        println!("RT: {:X}", drhd.root_table);
+                        println!("VER: {:X}", {drhd.version});
+                        println!("CAP: {:X}", {drhd.cap});
+                        println!("EXT_CAP: {:X}", {drhd.ext_cap});
+                        println!("GCMD: {:X}", {drhd.gl_cmd});
+                        println!("GSTS: {:X}", {drhd.gl_sts});
+                        println!("RT: {:X}", {drhd.root_table});
                     },
                     _ => ()
                 }
@@ -77,11 +77,9 @@ impl Dmar {
     }
 }
 
-///
-
 /// DMAR DMA Remapping Hardware Unit Definition
 // TODO: Implement iterator on DmarDrhd scope
-#[derive(Debug)]
+#[derive(Clone, Copy, Debug)]
 #[repr(packed)]
 pub struct DmarDrhd {
     kind: u16,
@@ -102,7 +100,7 @@ impl DmarDrhd {
 
 /// DMAR Reserved Memory Region Reporting
 // TODO: Implement iterator on DmarRmrr scope
-#[derive(Debug)]
+#[derive(Clone, Copy, Debug)]
 #[repr(packed)]
 pub struct DmarRmrr {
     kind: u16,
@@ -115,7 +113,7 @@ pub struct DmarRmrr {
 
 /// DMAR Root Port ATS Capability Reporting
 // TODO: Implement iterator on DmarAtsr scope
-#[derive(Debug)]
+#[derive(Clone, Copy, Debug)]
 #[repr(packed)]
 pub struct DmarAtsr {
     kind: u16,
@@ -126,7 +124,7 @@ pub struct DmarAtsr {
 }
 
 /// DMAR Remapping Hardware Static Affinity
-#[derive(Debug)]
+#[derive(Clone, Copy, Debug)]
 #[repr(packed)]
 pub struct DmarRhsa {
     kind: u16,
@@ -138,7 +136,7 @@ pub struct DmarRhsa {
 
 /// DMAR ACPI Name-space Device Declaration
 // TODO: Implement iterator on DmarAndd object name
-#[derive(Debug)]
+#[derive(Clone, Copy, Debug)]
 #[repr(packed)]
 pub struct DmarAndd {
     kind: u16,
diff --git a/src/acpi/fadt.rs b/src/acpi/fadt.rs
index 31dcea27deb73ef32c3fad45de7415a1fbbd2a9d..4ee13e929e5293e2f915459f19af5793daddd7b5 100644
--- a/src/acpi/fadt.rs
+++ b/src/acpi/fadt.rs
@@ -6,7 +6,7 @@ use super::{ACPI_TABLE, SDT_POINTERS, get_sdt, find_sdt, get_sdt_signature, load
 use crate::paging::ActivePageTable;
 
 #[repr(packed)]
-#[derive(Debug)]
+#[derive(Clone, Copy, Debug)]
 pub struct Fadt {
     pub header: Sdt,
     pub firmware_ctrl: u32,
@@ -108,7 +108,7 @@ impl Fadt {
         };
 
         if let Some(fadt) = fadt {
-            println!("  FACP: {:X}", fadt.dsdt);
+            println!("  FACP: {:X}", {fadt.dsdt});
 
             let dsdt_sdt = get_sdt(fadt.dsdt as usize, active_table);
 
diff --git a/src/acpi/hpet.rs b/src/acpi/hpet.rs
index 906a7b8a43d67d9c23def848f9e33c21b9c150fe..405afa5f4dfb1ed2b26725e22226d0261972c346 100644
--- a/src/acpi/hpet.rs
+++ b/src/acpi/hpet.rs
@@ -20,7 +20,7 @@ pub struct GenericAddressStructure {
 }
 
 #[repr(packed)]
-#[derive(Debug)]
+#[derive(Clone, Copy, Debug)]
 pub struct Hpet {
     pub header: Sdt,
 
diff --git a/src/acpi/madt.rs b/src/acpi/madt.rs
index 677435895edfc8d91a319a0caac727f1d72f6eee..61396b7bc07c29b0fa287c733ae045f1fd47b45a 100644
--- a/src/acpi/madt.rs
+++ b/src/acpi/madt.rs
@@ -169,10 +169,8 @@ impl Madt {
     }
 }
 
-///
-
 /// MADT Local APIC
-#[derive(Debug)]
+#[derive(Clone, Copy, Debug)]
 #[repr(packed)]
 pub struct MadtLocalApic {
     /// Processor ID
@@ -184,7 +182,7 @@ pub struct MadtLocalApic {
 }
 
 /// MADT I/O APIC
-#[derive(Debug)]
+#[derive(Clone, Copy, Debug)]
 #[repr(packed)]
 pub struct MadtIoApic {
     /// I/O APIC ID
@@ -198,7 +196,7 @@ pub struct MadtIoApic {
 }
 
 /// MADT Interrupt Source Override
-#[derive(Debug)]
+#[derive(Clone, Copy, Debug)]
 #[repr(packed)]
 pub struct MadtIntSrcOverride {
     /// Bus Source
diff --git a/src/acpi/mod.rs b/src/acpi/mod.rs
index 5f507b22b5d796eb554b15eaa7b88c3fecefdbb9..4764aa43791474a5b0060b8cc849e50da0bf5f17 100644
--- a/src/acpi/mod.rs
+++ b/src/acpi/mod.rs
@@ -135,7 +135,7 @@ pub unsafe fn init(active_table: &mut ActivePageTable, already_supplied_rsdps: O
         }
         println!(":");
 
-        let rxsdt: Box<Rxsdt + Send + Sync> = if let Some(rsdt) = Rsdt::new(rxsdt) {
+        let rxsdt: Box<dyn Rxsdt + Send + Sync> = if let Some(rsdt) = Rsdt::new(rxsdt) {
             Box::new(rsdt)
         } else if let Some(xsdt) = Xsdt::new(rxsdt) {
             Box::new(xsdt)
diff --git a/src/acpi/rsdt.rs b/src/acpi/rsdt.rs
index 5cf9460377353338a76fc497de5ebdc24462dff1..c2eb8c9e7daccd1d2b196190367a3f26ae9f854f 100644
--- a/src/acpi/rsdt.rs
+++ b/src/acpi/rsdt.rs
@@ -18,7 +18,7 @@ impl Rsdt {
 }
 
 impl Rxsdt for Rsdt {
-    fn iter(&self) -> Box<Iterator<Item = usize>> {
+    fn iter(&self) -> Box<dyn Iterator<Item = usize>> {
         Box::new(RsdtIter {
             sdt: self.0,
             i: 0
diff --git a/src/acpi/rxsdt.rs b/src/acpi/rxsdt.rs
index 0d91c580eff466493cf1431d56abfa8c2bcf92e9..db238806713e73a156c961d67bbf600cf828ec40 100644
--- a/src/acpi/rxsdt.rs
+++ b/src/acpi/rxsdt.rs
@@ -6,7 +6,7 @@ use super::sdt::Sdt;
 use super::get_sdt;
 
 pub trait Rxsdt {
-    fn iter(&self) -> Box<Iterator<Item = usize>>;
+    fn iter(&self) -> Box<dyn Iterator<Item = usize>>;
 
     fn map_all(&self, active_table: &mut ActivePageTable) {
         for sdt in self.iter() {
diff --git a/src/acpi/xsdt.rs b/src/acpi/xsdt.rs
index aea267d4c7af9d610fbce29e0e4dbae2bb905110..9f0d3633bdb918701c108e4e3225023385a07556 100644
--- a/src/acpi/xsdt.rs
+++ b/src/acpi/xsdt.rs
@@ -18,7 +18,7 @@ impl Xsdt {
 }
 
 impl Rxsdt for Xsdt {
-    fn iter(&self) -> Box<Iterator<Item = usize>> {
+    fn iter(&self) -> Box<dyn Iterator<Item = usize>> {
         Box::new(XsdtIter {
             sdt: self.0,
             i: 0
diff --git a/src/arch/x86_64/device/ioapic.rs b/src/arch/x86_64/device/ioapic.rs
index 99f299e98ae5e25d4d5fc0659327bcd77b843f55..1465ff7e746954f08e3c24202d19d05b665923eb 100644
--- a/src/arch/x86_64/device/ioapic.rs
+++ b/src/arch/x86_64/device/ioapic.rs
@@ -9,7 +9,6 @@ use crate::acpi::madt::{self, Madt, MadtEntry, MadtIoApic, MadtIntSrcOverride};
 use crate::arch::interrupt::irq;
 use crate::memory::Frame;
 use crate::paging::{ActivePageTable, entry::EntryFlags, Page, PhysicalAddress, VirtualAddress};
-use crate::syscall::io::Mmio;
 
 use super::pic;
 
@@ -243,7 +242,7 @@ pub unsafe fn handle_ioapic(active_table: &mut ActivePageTable, madt_ioapic: &'s
     result.flush(active_table);
 
     let ioapic_registers = page.start_address().get() as *const u32;
-    let mut ioapic = IoApic::new(ioapic_registers, madt_ioapic.gsi_base);
+    let ioapic = IoApic::new(ioapic_registers, madt_ioapic.gsi_base);
 
     assert_eq!(ioapic.regs.lock().id(), madt_ioapic.id, "mismatched ACPI MADT I/O APIC ID, and the ID reported by the I/O APIC");
 
@@ -283,7 +282,7 @@ pub unsafe fn handle_src_override(src_override: &'static MadtIntSrcOverride) {
 }
 
 pub unsafe fn init(active_table: &mut ActivePageTable) {
-    let mut bsp_apic_id = x86::cpuid::CpuId::new().get_feature_info().unwrap().initial_local_apic_id(); // TODO
+    let bsp_apic_id = x86::cpuid::CpuId::new().get_feature_info().unwrap().initial_local_apic_id(); // TODO
 
     // search the madt for all IOAPICs.
     #[cfg(feature = "acpi")]
diff --git a/src/arch/x86_64/device/mod.rs b/src/arch/x86_64/device/mod.rs
index 0c3f4dec6ab5c99e9d1d21f6db070355be51bdae..9460f65c7d00a91198b1f452675601a4535d3222 100644
--- a/src/arch/x86_64/device/mod.rs
+++ b/src/arch/x86_64/device/mod.rs
@@ -14,7 +14,7 @@ pub unsafe fn init(active_table: &mut ActivePageTable) {
     pic::init();
     local_apic::init(active_table);
 }
-pub unsafe fn init_after_acpi(active_table: &mut ActivePageTable)  {
+pub unsafe fn init_after_acpi(_active_table: &mut ActivePageTable)  {
     // this will disable the IOAPIC if needed.
     //ioapic::init(active_table);
 }
diff --git a/src/arch/x86_64/interrupt/irq.rs b/src/arch/x86_64/interrupt/irq.rs
index d604e0d6c3bdc265c21ce6af2e4cac48ae08f1e0..a01196f80ffb8e5ac219c04958a48724bd16b0be 100644
--- a/src/arch/x86_64/interrupt/irq.rs
+++ b/src/arch/x86_64/interrupt/irq.rs
@@ -18,7 +18,7 @@ pub static PIT_TICKS: AtomicUsize = AtomicUsize::new(0);
 // reading the status register is not done atomically with reading the data. This is not possible
 // from userspace, so we do this minimal part of the PS2 driver in the kernel.
 #[inline(always)]
-unsafe fn ps2_interrupt(index: usize) {
+unsafe fn ps2_interrupt(_index: usize) {
     use crate::scheme::serio::serio_input;
 
     let data: u8;
diff --git a/src/arch/x86_64/start.rs b/src/arch/x86_64/start.rs
index 8438079abcdda82e56367e9a09eca57d0ef2da47..ab7fc39629f4a7b2f69a4a2d92adcb227a4104b7 100644
--- a/src/arch/x86_64/start.rs
+++ b/src/arch/x86_64/start.rs
@@ -3,7 +3,7 @@
 /// It must create the IDT with the correct entries, those entries are
 /// defined in other files inside of the `arch` module
 
-use core::{mem, slice};
+use core::slice;
 use core::sync::atomic::{AtomicBool, AtomicUsize, Ordering};
 
 use crate::allocator;
diff --git a/src/scheme/acpi.rs b/src/scheme/acpi.rs
index 12eb2d78bf6c4e2f9068aff06d5fabc974c55698..9ab6de1f5f739be3f96c910e7df9e3cc0a0ab383 100644
--- a/src/scheme/acpi.rs
+++ b/src/scheme/acpi.rs
@@ -1,4 +1,4 @@
-use core::convert::{TryFrom, TryInto};
+use core::convert::TryInto;
 use core::fmt::Write;
 use core::str;
 use core::sync::atomic::{self, AtomicUsize};
@@ -239,7 +239,7 @@ impl Scheme for AcpiScheme {
                 }
                 Handle::Tables(0)
             } else {
-                if (flags & O_DIRECTORY != 0 && flags & O_STAT == 0) {
+                if flags & O_DIRECTORY != 0 && flags & O_STAT == 0 {
                     return Err(Error::new(ENOTDIR));
                 }
                 if flags & O_ACCMODE == O_WRONLY || flags & O_ACCMODE == O_RDWR {
@@ -448,7 +448,7 @@ impl Scheme for AcpiScheme {
             }
         }
     }
-    fn write(&self, id: usize, buf: &[u8]) -> Result<usize> {
+    fn write(&self, _id: usize, _buf: &[u8]) -> Result<usize> {
         Err(Error::new(EBADF))
     }
 }
diff --git a/src/scheme/irq.rs b/src/scheme/irq.rs
index 0c3a844016eae732591c1b9bed0e6c4866ac6d54..66e0ee05762897af79cafc9b2f05eb3f3deefd6c 100644
--- a/src/scheme/irq.rs
+++ b/src/scheme/irq.rs
@@ -155,7 +155,7 @@ impl Scheme for IrqScheme {
             use core::fmt::Write;
 
             for cpu_id in &self.cpus {
-                writeln!(bytes, "cpu-{:02x}", cpu_id);
+                writeln!(bytes, "cpu-{:02x}", cpu_id).unwrap();
             }
 
             if bsp_apic_id().is_some() {
@@ -186,7 +186,7 @@ impl Scheme for IrqScheme {
                         if Some(u32::from(cpu_id)) == bsp_apic_id() && irq < BASE_IRQ_COUNT {
                             continue;
                         }
-                        writeln!(data, "{}", irq);
+                        writeln!(data, "{}", irq).unwrap();
                     }
 
                     Handle::Avail(cpu_id, data.into_bytes(), AtomicUsize::new(0))
diff --git a/src/scheme/serio.rs b/src/scheme/serio.rs
index b19f97a56808af3cd4c1c1e6bfd920ae6539c2f3..f5b79ede089aec4cbc5069307c16be18872141be 100644
--- a/src/scheme/serio.rs
+++ b/src/scheme/serio.rs
@@ -66,9 +66,9 @@ impl Scheme for SerioScheme {
         }
 
         let index = str::from_utf8(path)
-            .map_err(|err| Error::new(ENOENT))?
+            .or(Err(Error::new(ENOENT)))?
             .parse::<usize>()
-            .map_err(|err| Error::new(ENOENT))?;
+            .or(Err(Error::new(ENOENT)))?;
         if index >= INPUT.len() {
             return Err(Error::new(ENOENT));
         }
diff --git a/src/syscall/process.rs b/src/syscall/process.rs
index 086e82d6522ca58a55dfc76c224604034788fe4b..19209764dab13c1cfcf0bbae160da6c6015d3df7 100644
--- a/src/syscall/process.rs
+++ b/src/syscall/process.rs
@@ -81,7 +81,7 @@ pub fn clone(flags: CloneFlags, stack_base: usize) -> Result<ContextId> {
         let ens;
         let umask;
         let sigmask;
-        let mut cpu_id_opt = None;
+        let cpu_id_opt = None;
         let arch;
         let vfork;
         let mut kfx_opt = None;