diff --git a/Cargo.lock b/Cargo.lock
index efb0e69a1083de5e6dbbf5a02ad6f97adc121838..af923d33ab61e2b50ebc8f35c1ddf61b267706fe 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1,3 +1,11 @@
+[[package]]
+name = "aho-corasick"
+version = "0.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
 [[package]]
 name = "alloc_kernel"
 version = "0.1.0"
@@ -11,16 +19,76 @@ name = "bitflags"
 version = "0.7.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
+[[package]]
+name = "bitflags"
+version = "0.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
 [[package]]
 name = "bitflags"
 version = "1.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
+[[package]]
+name = "cargo_metadata"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "serde 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde_derive 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde_json 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "clippy"
+version = "0.0.177"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "cargo_metadata 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "clippy_lints 0.0.177 (registry+https://github.com/rust-lang/crates.io-index)",
+ "regex 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "clippy_lints"
+version = "0.0.177"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "if_chain 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "itertools 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
+ "lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "pulldown-cmark 0.0.15 (registry+https://github.com/rust-lang/crates.io-index)",
+ "quine-mc_cluskey 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
+ "regex-syntax 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "semver 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde_derive 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)",
+ "toml 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
+ "unicode-normalization 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
+ "url 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "dtoa"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "either"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
 [[package]]
 name = "gcc"
 version = "0.3.54"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
+[[package]]
+name = "getopts"
+version = "0.2.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
 [[package]]
 name = "goblin"
 version = "0.0.10"
@@ -30,12 +98,41 @@ dependencies = [
  "scroll 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
+[[package]]
+name = "idna"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
+ "unicode-normalization 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "if_chain"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "itertools"
+version = "0.6.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "either 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "itoa"
+version = "0.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
 [[package]]
 name = "kernel"
 version = "0.1.33"
 dependencies = [
  "alloc_kernel 0.1.0",
  "bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "clippy 0.0.177 (registry+https://github.com/rust-lang/crates.io-index)",
  "goblin 0.0.10 (registry+https://github.com/rust-lang/crates.io-index)",
  "raw-cpuid 3.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "redox_syscall 0.1.33",
@@ -43,6 +140,16 @@ dependencies = [
  "x86 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
+[[package]]
+name = "lazy_static"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "libc"
+version = "0.2.34"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
 [[package]]
 name = "linked_list_allocator"
 version = "0.4.1"
@@ -51,11 +158,53 @@ dependencies = [
  "spin 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
+[[package]]
+name = "matches"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "memchr"
+version = "2.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "libc 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "num-traits"
+version = "0.1.41"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "percent-encoding"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
 [[package]]
 name = "plain"
 version = "0.0.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
+[[package]]
+name = "pulldown-cmark"
+version = "0.0.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "bitflags 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "getopts 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "quine-mc_cluskey"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "quote"
+version = "0.3.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
 [[package]]
 name = "raw-cpuid"
 version = "2.0.2"
@@ -77,16 +226,162 @@ dependencies = [
 name = "redox_syscall"
 version = "0.1.33"
 
+[[package]]
+name = "regex"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "aho-corasick 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)",
+ "memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "regex-syntax 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "thread_local 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
+ "utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "regex-syntax"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
 [[package]]
 name = "scroll"
 version = "0.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
+[[package]]
+name = "semver"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "semver-parser"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "serde"
+version = "1.0.25"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "serde_derive"
+version = "1.0.25"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde_derive_internals 0.18.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "serde_derive_internals"
+version = "0.18.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)",
+ "synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "serde_json"
+version = "1.0.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "dtoa 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "itoa 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
 [[package]]
 name = "spin"
 version = "0.4.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
+[[package]]
+name = "syn"
+version = "0.11.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)",
+ "synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "synom"
+version = "0.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "thread_local"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "toml"
+version = "0.4.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "serde 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "unicode-bidi"
+version = "0.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "unicode-normalization"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "unicode-xid"
+version = "0.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "unreachable"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "url"
+version = "1.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "idna 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
+ "matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "utf8-ranges"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "void"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
 [[package]]
 name = "x86"
 version = "0.7.2"
@@ -96,14 +391,54 @@ dependencies = [
 ]
 
 [metadata]
+"checksum aho-corasick 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d6531d44de723825aa81398a6415283229725a00fa30713812ab9323faa82fc4"
 "checksum bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aad18937a628ec6abcd26d1489012cc0e18c21798210f491af69ded9b881106d"
+"checksum bitflags 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4efd02e230a02e18f92fc2735f44597385ed02ad8f831e7c1c1156ee5e1ab3a5"
 "checksum bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b3c30d3802dfb7281680d6285f2ccdaa8c2d8fee41f93805dba5c4cf50dc23cf"
+"checksum cargo_metadata 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "be1057b8462184f634c3a208ee35b0f935cfd94b694b26deadccd98732088d7b"
+"checksum clippy 0.0.177 (registry+https://github.com/rust-lang/crates.io-index)" = "131acb21874af5ec9a2ed5b3945edd9961b260735ba0d6879357a924a77be66b"
+"checksum clippy_lints 0.0.177 (registry+https://github.com/rust-lang/crates.io-index)" = "e5ad86d7ff55bf5461ed84388c445ecba69badb2805a5e4750bd57ee12a0f8a2"
+"checksum dtoa 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "09c3753c3db574d215cba4ea76018483895d7bff25a31b49ba45db21c48e50ab"
+"checksum either 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "740178ddf48b1a9e878e6d6509a1442a2d42fd2928aae8e7a6f8a36fb01981b3"
 "checksum gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)" = "5e33ec290da0d127825013597dbdfc28bee4964690c7ce1166cbc2a7bd08b1bb"
+"checksum getopts 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)" = "65922871abd2f101a2eb0eaebadc66668e54a87ad9c3dd82520b5f86ede5eff9"
 "checksum goblin 0.0.10 (registry+https://github.com/rust-lang/crates.io-index)" = "81af14056c25d33759862c5ae2035452acb1255bfb1b16db57819f183921e259"
+"checksum idna 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "014b298351066f1512874135335d62a789ffe78a9974f94b43ed5621951eaf7d"
+"checksum if_chain 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "61bb90bdd39e3af69b0172dfc6130f6cd6332bf040fbb9bdd4401d37adbd48b8"
+"checksum itertools 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d3f2be4da1690a039e9ae5fd575f706a63ad5a2120f161b1d653c9da3930dd21"
+"checksum itoa 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8324a32baf01e2ae060e9de58ed0bc2320c9a2833491ee36cd3b4c414de4db8c"
+"checksum lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c8f31047daa365f19be14b47c29df4f7c3b581832407daabe6ae77397619237d"
+"checksum libc 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)" = "36fbc8a8929c632868295d0178dd8f63fc423fd7537ad0738372bd010b3ac9b0"
 "checksum linked_list_allocator 0.4.1 (git+https://github.com/redox-os/linked-list-allocator.git)" = "<none>"
+"checksum matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "100aabe6b8ff4e4a7e32c1c13523379802df0772b82466207ac25b013f193376"
+"checksum memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "796fba70e76612589ed2ce7f45282f5af869e0fdd7cc6199fa1aa1f1d591ba9d"
+"checksum num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)" = "cacfcab5eb48250ee7d0c7896b51a2c5eec99c1feea5f32025635f5ae4b00070"
+"checksum percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831"
 "checksum plain 0.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "595830506990cbd6a1a08ed73bd9b40beb4692f38334885bf25a5daa654c6fae"
+"checksum pulldown-cmark 0.0.15 (registry+https://github.com/rust-lang/crates.io-index)" = "378e941dbd392c101f2cb88097fa4d7167bc421d4b88de3ff7dbee503bc3233b"
+"checksum quine-mc_cluskey 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "07589615d719a60c8dd8a4622e7946465dfef20d1a428f969e3443e7386d5f45"
+"checksum quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a"
 "checksum raw-cpuid 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "13b844e4049605ff38fed943f5c7b2c691fad68d9d5bf074d2720554c4e48246"
 "checksum raw-cpuid 3.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "779585861d55e586db9d6abe4352cd9466e09a3319342c417baf34b2740af74e"
+"checksum regex 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ac6ab4e9218ade5b423358bbd2567d1617418403c7a512603630181813316322"
+"checksum regex-syntax 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ad890a5eef7953f55427c50575c680c42841653abd2b028b68cd223d157f62db"
 "checksum scroll 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d916a75d18d4c559fa7312afe6f522fe5b63176e6591d02ed81017c22f8ea27"
+"checksum semver 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a3186ec9e65071a2095434b1f5bb24838d4e8e130f584c790f6033c79943537"
+"checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
+"checksum serde 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)" = "386122ba68c214599c44587e0c0b411e8d90894503a95425b4f9508e4317901f"
+"checksum serde_derive 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)" = "ec0bfa6c5784e7d110514448da0e1dbad41ea5514c3e68be755b23858b83a399"
+"checksum serde_derive_internals 0.18.1 (registry+https://github.com/rust-lang/crates.io-index)" = "730fe9f29fe8db69a601837f416e46cba07792031ed6b27557a43e49d62d89ae"
+"checksum serde_json 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7cf5b0b5b4bd22eeecb7e01ac2e1225c7ef5e4272b79ee28a8392a8c8489c839"
 "checksum spin 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "7e4deb3c2455c73779e6d3eebceae9599fc70957e54c69fe88f93aa48e62f432"
+"checksum syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d3b891b9015c88c576343b9b3e41c2c11a51c219ef067b264bd9c8aa9b441dad"
+"checksum synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a393066ed9010ebaed60b9eafa373d4b1baac186dd7e008555b0f702b51945b6"
+"checksum thread_local 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "279ef31c19ededf577bfd12dfae728040a21f635b06a24cd670ff510edd38963"
+"checksum toml 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "a7540f4ffc193e0d3c94121edb19b055670d369f77d5804db11ae053a45b6e7e"
+"checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5"
+"checksum unicode-normalization 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "51ccda9ef9efa3f7ef5d91e8f9b83bbe6955f9bf86aec89d5cce2c874625920f"
+"checksum unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f860d7d29cf02cb2f3f359fd35991af3d30bac52c57d265a3c461074cb4dc"
+"checksum unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56"
+"checksum url 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fa35e768d4daf1d85733418a49fb42e10d7f633e394fccab4ab7aba897053fe2"
+"checksum utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "662fab6525a98beff2921d7f61a39e7d59e0b425ebc7d0d9e66d316e55124122"
+"checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d"
 "checksum x86 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "127728f29f7cfb243a9264c80fc7e57bd1abb3ab015850b05736efda2abe5859"
diff --git a/Cargo.toml b/Cargo.toml
index 3cee8c964cb9ebe927c6a58d4d0090dac222bd6b..08191d48d5f7eb4b32e60e36ad58280421aef196 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -11,6 +11,7 @@ crate-type = ["staticlib"]
 [dependencies]
 alloc_kernel = { path = "alloc_kernel" }
 bitflags = "1"
+clippy = { version = "*", optional = true }
 spin = "0.4"
 raw-cpuid = "3.0"
 redox_syscall = { path = "syscall" }
diff --git a/clippy.sh b/clippy.sh
new file mode 100755
index 0000000000000000000000000000000000000000..f128f48279b51eb73ad4cb3573823d7e1367f3dc
--- /dev/null
+++ b/clippy.sh
@@ -0,0 +1,17 @@
+#!/usr/bin/env bash
+
+set -e
+
+export RUST_TARGET_PATH="${PWD}/targets"
+xargo rustc --lib --release \
+  --target x86_64-unknown-none \
+  --features clippy \
+  -- \
+  -C soft-float -C debuginfo=2 \
+  -W anonymous-parameters \
+  -W trivial-numeric-casts \
+  -W unused-extern-crates \
+  -W unused-import-braces \
+  -W unused-qualifications \
+  -W variant-size-differences \
+  -Z no-trans -Z extra-plugins=clippy
diff --git a/src/acpi/aml/dataobj.rs b/src/acpi/aml/dataobj.rs
index 10ffaf18a3581ef659ac3bd8e2a9faea147d294d..e0f262110d04f8113b014012d7a1d3aac545d678 100644
--- a/src/acpi/aml/dataobj.rs
+++ b/src/acpi/aml/dataobj.rs
@@ -15,7 +15,7 @@ pub fn parse_data_obj(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -35,7 +35,7 @@ pub fn parse_data_ref_obj(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -63,7 +63,7 @@ pub fn parse_arg_obj(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -82,7 +82,7 @@ pub fn parse_local_obj(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -101,7 +101,7 @@ fn parse_computational_data(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -172,14 +172,14 @@ fn parse_computational_data(data: &[u8],
         }),
         0x5B => if data[1] == 0x30 {
             Ok(AmlParseType {
-                val: AmlValue::IntegerConstant(20170630 as u64),
+                val: AmlValue::IntegerConstant(2017_0630 as u64),
                 len: 2 as usize
             })
         } else {
             Err(AmlError::AmlInvalidOpCode)
         },
         0xFF => Ok(AmlParseType {
-            val: AmlValue::IntegerConstant(0xFFFFFFFFFFFFFFFF),
+            val: AmlValue::IntegerConstant(0xFFFF_FFFF_FFFF_FFFF),
             len: 1 as usize
         }),
         _ => parse_def_buffer(data, ctx)
diff --git a/src/acpi/aml/namedobj.rs b/src/acpi/aml/namedobj.rs
index 49ae26ca7faa8676704239afc2f09fb7a214e8b9..f539d5d13452af0f268bc536fb65b0ba628d55de 100644
--- a/src/acpi/aml/namedobj.rs
+++ b/src/acpi/aml/namedobj.rs
@@ -83,7 +83,7 @@ pub fn parse_named_obj(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -119,7 +119,7 @@ fn parse_def_bank_field(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -174,7 +174,7 @@ fn parse_def_create_bit_field(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -204,7 +204,7 @@ fn parse_def_create_byte_field(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -234,7 +234,7 @@ fn parse_def_create_word_field(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -264,7 +264,7 @@ fn parse_def_create_dword_field(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -294,7 +294,7 @@ fn parse_def_create_qword_field(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -324,7 +324,7 @@ fn parse_def_create_field(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -355,7 +355,7 @@ fn parse_def_data_region(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -392,7 +392,7 @@ fn parse_def_event(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -415,7 +415,7 @@ fn parse_def_device(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -447,7 +447,7 @@ fn parse_def_op_region(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -496,7 +496,7 @@ fn parse_def_field(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -541,7 +541,7 @@ fn parse_def_index_field(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -593,7 +593,7 @@ fn parse_field_list(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -608,7 +608,7 @@ fn parse_field_list(data: &[u8],
             ExecutionState::EXECUTING => (),
             _ => return Ok(AmlParseType {
                 val: AmlValue::None,
-                len: 0 as usize
+                len: 0
             })
         }
 
@@ -631,7 +631,7 @@ fn parse_field_element(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -747,7 +747,7 @@ fn parse_connect_field(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -773,7 +773,7 @@ fn parse_def_method(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -809,7 +809,7 @@ fn parse_def_mutex(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -834,7 +834,7 @@ fn parse_def_power_res(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -871,7 +871,7 @@ fn parse_def_processor(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -911,7 +911,7 @@ fn parse_def_thermal_zone(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -942,7 +942,7 @@ fn parse_def_external(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
diff --git a/src/acpi/aml/namespacemodifier.rs b/src/acpi/aml/namespacemodifier.rs
index efdeff3f20ece1b62bd470a8b58fd836ec80a8a5..77fa1406b08bfbf5fe7b2801820621cb02049026 100644
--- a/src/acpi/aml/namespacemodifier.rs
+++ b/src/acpi/aml/namespacemodifier.rs
@@ -12,7 +12,7 @@ pub fn parse_namespace_modifier(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -32,7 +32,7 @@ fn parse_alias_op(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -58,7 +58,7 @@ fn parse_name_op(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -83,7 +83,7 @@ fn parse_scope_op(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
diff --git a/src/acpi/aml/namestring.rs b/src/acpi/aml/namestring.rs
index a8156f40a0ceed83f866831d27254471204b237b..ecc52daa9bea306871e225ded63c32dbef9ae08f 100644
--- a/src/acpi/aml/namestring.rs
+++ b/src/acpi/aml/namestring.rs
@@ -13,7 +13,7 @@ pub fn parse_name_string(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -57,7 +57,7 @@ pub fn parse_name_string(data: &[u8],
 
 fn parse_null_name(data: &[u8]) -> Result<(Vec<u8>, usize), AmlError> {
     parser_opcode!(data, 0x00);
-    Ok((vec!(), 1 as usize))
+    Ok((vec!(), 1 ))
 }
 
 pub fn parse_name_seg(data: &[u8]) -> Result<(Vec<u8>, usize), AmlError> {
@@ -86,7 +86,7 @@ pub fn parse_name_seg(data: &[u8]) -> Result<(Vec<u8>, usize), AmlError> {
         name_seg.pop();
     }
 
-    Ok((name_seg, 4 as usize))
+    Ok((name_seg, 4))
 }
 
 fn parse_dual_name_path(data: &[u8]) -> Result<(Vec<u8>, usize), AmlError> {
@@ -153,7 +153,7 @@ pub fn parse_super_name(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -173,7 +173,7 @@ fn parse_debug_obj(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -181,7 +181,7 @@ fn parse_debug_obj(data: &[u8],
 
     Ok(AmlParseType {
         val: AmlValue::DebugObject,
-        len: 2 as usize
+        len: 2
     })
 }
 
@@ -191,7 +191,7 @@ pub fn parse_simple_name(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -211,14 +211,14 @@ pub fn parse_target(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
     if data[0] == 0x00 {
         Ok(AmlParseType {
             val: AmlValue::None,
-            len: 1 as usize
+            len: 1
         })
     } else {
         parse_super_name(data, ctx)
diff --git a/src/acpi/aml/parser.rs b/src/acpi/aml/parser.rs
index 12ab3ae2dcf74321a5aed6beb89950809c52a8e9..c4a8f922acf2d7ad18d9f01ea13ca27989b5d3cf 100644
--- a/src/acpi/aml/parser.rs
+++ b/src/acpi/aml/parser.rs
@@ -383,7 +383,7 @@ impl AmlExecutionContext {
 
                 Ok(AmlValue::Package(p))
             },
-            _ => return Err(AmlError::AmlValueError)
+            _ => Err(AmlError::AmlValueError)
         }
     }
 
diff --git a/src/acpi/aml/pkglength.rs b/src/acpi/aml/pkglength.rs
index b3cd39a675384fb6833ed795fb0e3bc1c8f706c9..7b511f9b449259fcdd62b201150da1a782fc63df 100644
--- a/src/acpi/aml/pkglength.rs
+++ b/src/acpi/aml/pkglength.rs
@@ -21,5 +21,5 @@ pub fn parse_pkg_length(data: &[u8]) -> Result<(usize, usize), AmlError> {
         current_byte += 1;
     }
 
-    return Ok((pkg_len, count_bytes + 1));
+    Ok((pkg_len, count_bytes + 1))
 }
diff --git a/src/acpi/aml/termlist.rs b/src/acpi/aml/termlist.rs
index b67430ee69cccf59c7fe0b018cbc9cb67c35b5e5..cd8e1033abfb59b2520156d6d991678934628f8b 100644
--- a/src/acpi/aml/termlist.rs
+++ b/src/acpi/aml/termlist.rs
@@ -16,7 +16,7 @@ pub fn parse_term_list(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -48,7 +48,7 @@ pub fn parse_term_arg(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -69,7 +69,7 @@ pub fn parse_object_list(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -101,7 +101,7 @@ fn parse_object(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -120,7 +120,7 @@ pub fn parse_method_invocation(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -158,7 +158,7 @@ fn parse_term_obj(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
diff --git a/src/acpi/aml/type1opcode.rs b/src/acpi/aml/type1opcode.rs
index 1b90930c66d1d9362ad781ae3b932c629ff2135a..2204e9c81cc1d8389b4fa117e7ba58ed6e068e50 100644
--- a/src/acpi/aml/type1opcode.rs
+++ b/src/acpi/aml/type1opcode.rs
@@ -16,7 +16,7 @@ pub fn parse_type1_opcode(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -49,7 +49,7 @@ fn parse_def_break(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -68,7 +68,7 @@ fn parse_def_breakpoint(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -86,7 +86,7 @@ fn parse_def_continue(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -105,7 +105,7 @@ fn parse_def_noop(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -123,7 +123,7 @@ fn parse_def_fatal(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -142,7 +142,7 @@ fn parse_def_load(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -174,7 +174,7 @@ fn parse_def_notify(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -222,7 +222,7 @@ fn parse_def_release(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -243,7 +243,7 @@ fn parse_def_reset(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -266,7 +266,7 @@ fn parse_def_signal(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -286,7 +286,7 @@ fn parse_def_sleep(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -296,13 +296,13 @@ fn parse_def_sleep(data: &[u8],
     let timeout = time.val.get_as_integer()?;
 
     let (seconds, nanoseconds) = monotonic();
-    let starting_time_ns = nanoseconds + (seconds * 1000000000);
+    let starting_time_ns = nanoseconds + (seconds * 1_000_000_000);
 
     loop {
         let (seconds, nanoseconds) = monotonic();
-        let current_time_ns = nanoseconds + (seconds * 1000000000);
+        let current_time_ns = nanoseconds + (seconds * 1_000_000_000);
 
-        if current_time_ns - starting_time_ns > timeout as u64 * 1000000 {
+        if current_time_ns - starting_time_ns > timeout as u64 * 1_000_000 {
             break;
         }
     }
@@ -319,7 +319,7 @@ fn parse_def_stall(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -329,11 +329,11 @@ fn parse_def_stall(data: &[u8],
     let timeout = time.val.get_as_integer()?;
 
     let (seconds, nanoseconds) = monotonic();
-    let starting_time_ns = nanoseconds + (seconds * 1000000000);
+    let starting_time_ns = nanoseconds + (seconds * 1_000_000_000);
 
     loop {
         let (seconds, nanoseconds) = monotonic();
-        let current_time_ns = nanoseconds + (seconds * 1000000000);
+        let current_time_ns = nanoseconds + (seconds * 1_000_000_000);
 
         if current_time_ns - starting_time_ns > timeout as u64 * 1000 {
             break;
@@ -352,7 +352,7 @@ fn parse_def_unload(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -381,7 +381,7 @@ fn parse_def_if_else(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -414,7 +414,7 @@ fn parse_def_while(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -439,7 +439,7 @@ fn parse_def_while(data: &[u8],
             ExecutionState::CONTINUE => ctx.state = ExecutionState::EXECUTING,
             _ => return Ok(AmlParseType {
                 val: AmlValue::None,
-                len: 0 as usize
+                len: 0
             })
         }
     }
@@ -456,7 +456,7 @@ fn parse_def_return(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
diff --git a/src/acpi/aml/type2opcode.rs b/src/acpi/aml/type2opcode.rs
index 50d9324d4e19bbb90baae879010884408ad35310..9b4e7ef1429344e84591be30cd0678cdb45d6415 100644
--- a/src/acpi/aml/type2opcode.rs
+++ b/src/acpi/aml/type2opcode.rs
@@ -29,7 +29,7 @@ pub fn parse_type2_opcode(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -96,7 +96,7 @@ pub fn parse_type6_opcode(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -117,7 +117,7 @@ pub fn parse_def_object_type(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -139,7 +139,7 @@ pub fn parse_def_package(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -170,7 +170,7 @@ pub fn parse_def_var_package(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -204,7 +204,7 @@ fn parse_package_elements_list(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -238,7 +238,7 @@ pub fn parse_def_buffer(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -262,7 +262,7 @@ fn parse_def_ref_of(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -292,7 +292,7 @@ fn parse_def_deref_of(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -316,7 +316,7 @@ fn parse_def_acquire(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -326,7 +326,7 @@ fn parse_def_acquire(data: &[u8],
     let timeout = (data[2 + obj.len] as u16) + ((data[3 + obj.len] as u16) << 8);
 
     let (seconds, nanoseconds) = monotonic();
-    let starting_time_ns = nanoseconds + (seconds * 1000000000);
+    let starting_time_ns = nanoseconds + (seconds * 1_000_000_000);
 
     loop {
         match ctx.acquire_mutex(obj.val.clone()) {
@@ -340,9 +340,9 @@ fn parse_def_acquire(data: &[u8],
                 // TODO: Brief sleep here
             } else {
                 let (seconds, nanoseconds) = monotonic();
-                let current_time_ns = nanoseconds + (seconds * 1000000000);
+                let current_time_ns = nanoseconds + (seconds * 1_000_000_000);
 
-                if current_time_ns - starting_time_ns > timeout as u64 * 1000000 {
+                if current_time_ns - starting_time_ns > timeout as u64 * 1_000_000 {
                     return Ok(AmlParseType {
                         val: AmlValue::Integer(1),
                         len: 4 + obj.len
@@ -359,7 +359,7 @@ fn parse_def_increment(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -383,7 +383,7 @@ fn parse_def_index(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -408,7 +408,7 @@ fn parse_def_land(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -431,7 +431,7 @@ fn parse_def_lequal(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -454,7 +454,7 @@ fn parse_def_lgreater(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -477,7 +477,7 @@ fn parse_def_lless(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -500,7 +500,7 @@ fn parse_def_lnot(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -521,7 +521,7 @@ fn parse_def_lor(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -544,7 +544,7 @@ fn parse_def_to_hex_string(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -585,7 +585,7 @@ fn parse_def_to_buffer(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -609,7 +609,7 @@ fn parse_def_to_bcd(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -642,7 +642,7 @@ fn parse_def_to_decimal_string(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -682,7 +682,7 @@ fn parse_def_to_integer(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -707,7 +707,7 @@ fn parse_def_to_string(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -740,7 +740,7 @@ fn parse_def_subtract(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -766,7 +766,7 @@ fn parse_def_size_of(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -794,7 +794,7 @@ fn parse_def_store(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -817,7 +817,7 @@ fn parse_def_or(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -843,7 +843,7 @@ fn parse_def_shift_left(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -869,7 +869,7 @@ fn parse_def_shift_right(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -895,7 +895,7 @@ fn parse_def_add(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -921,7 +921,7 @@ fn parse_def_and(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -947,7 +947,7 @@ fn parse_def_xor(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -973,7 +973,7 @@ fn parse_def_concat_res(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -1025,7 +1025,7 @@ fn parse_def_wait(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -1037,7 +1037,7 @@ fn parse_def_wait(data: &[u8],
     let timeout = timeout_obj.val.get_as_integer()?;
 
     let (seconds, nanoseconds) = monotonic();
-    let starting_time_ns = nanoseconds + (seconds * 1000000000);
+    let starting_time_ns = nanoseconds + (seconds * 1_000_000_000);
 
     loop {
         match ctx.wait_for_event(obj.val.clone()) {
@@ -1051,9 +1051,9 @@ fn parse_def_wait(data: &[u8],
                 // TODO: Brief sleep here
             } else {
                 let (seconds, nanoseconds) = monotonic();
-                let current_time_ns = nanoseconds + (seconds * 1000000000);
+                let current_time_ns = nanoseconds + (seconds * 1_000_000_000);
 
-                if current_time_ns - starting_time_ns > timeout as u64 * 1000000 {
+                if current_time_ns - starting_time_ns > timeout as u64 * 1_000_000 {
                     return Ok(AmlParseType {
                         val: AmlValue::Integer(1),
                         len: 2 + obj.len + timeout_obj.len
@@ -1070,7 +1070,7 @@ fn parse_def_cond_ref_of(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -1107,7 +1107,7 @@ fn parse_def_copy_object(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -1132,7 +1132,7 @@ fn parse_def_concat(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -1200,7 +1200,7 @@ fn parse_def_decrement(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -1224,7 +1224,7 @@ fn parse_def_divide(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -1256,7 +1256,7 @@ fn parse_def_find_set_left_bit(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -1269,7 +1269,7 @@ fn parse_def_find_set_left_bit(data: &[u8],
     let mut test = operand.val.get_as_integer()?;
 
     while first_bit > 0{
-        if test & 0x8000000000000000 > 0 {
+        if test & 0x8000_0000_0000_0000 > 0 {
             break;
         }
 
@@ -1292,7 +1292,7 @@ fn parse_def_find_set_right_bit(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -1332,7 +1332,7 @@ fn parse_def_load_table(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -1385,7 +1385,7 @@ fn parse_def_match(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -1518,7 +1518,7 @@ fn parse_def_match(data: &[u8],
     }
 
     Ok(AmlParseType {
-        val: AmlValue::IntegerConstant(0xFFFFFFFFFFFFFFFF),
+        val: AmlValue::IntegerConstant(0xFFFF_FFFF_FFFF_FFFF),
         len: 3 + search_pkg.len + first_operand.len + second_operand.len + start_index.len
     })
 }
@@ -1529,7 +1529,7 @@ fn parse_def_from_bcd(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -1567,7 +1567,7 @@ fn parse_def_mid(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -1629,7 +1629,7 @@ fn parse_def_mod(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -1659,7 +1659,7 @@ fn parse_def_multiply(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -1686,7 +1686,7 @@ fn parse_def_nand(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -1712,7 +1712,7 @@ fn parse_def_nor(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -1738,7 +1738,7 @@ fn parse_def_not(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
@@ -1763,14 +1763,14 @@ fn parse_def_timer(data: &[u8],
         ExecutionState::EXECUTING => (),
         _ => return Ok(AmlParseType {
             val: AmlValue::None,
-            len: 0 as usize
+            len: 0
         })
     }
 
     parser_opcode_extended!(data, 0x33);
 
     let (seconds, nanoseconds) = monotonic();
-    let monotonic_ns = nanoseconds + (seconds * 1000000000);
+    let monotonic_ns = nanoseconds + (seconds * 1_000_000_000);
 
     Ok(AmlParseType {
         val: AmlValue::Integer(monotonic_ns),
diff --git a/src/acpi/rsdp.rs b/src/acpi/rsdp.rs
index 3e135c71055fe6594f688791f0d6669e7dce729e..1ec3550005764252f572c5f35b84d5355d993785 100644
--- a/src/acpi/rsdp.rs
+++ b/src/acpi/rsdp.rs
@@ -20,8 +20,8 @@ pub struct RSDP {
 impl RSDP {
     /// Search for the RSDP
     pub fn get_rsdp(active_table: &mut ActivePageTable) -> Option<RSDP> {
-        let start_addr = 0xE0000;
-        let end_addr = 0xFFFFF;
+        let start_addr = 0xE_0000;
+        let end_addr = 0xF_FFFF;
 
         // Map all of the ACPI RSDP space
         {
diff --git a/src/acpi/rxsdt.rs b/src/acpi/rxsdt.rs
index 9356b509ba6d327a1696c44d253a530118cffe31..d3cf354281457ea476e8fa3dcd3e437d68d322fd 100644
--- a/src/acpi/rxsdt.rs
+++ b/src/acpi/rxsdt.rs
@@ -23,6 +23,6 @@ pub trait Rxsdt {
             }
         }
 
-        return None;
+        None
     }
 }
diff --git a/src/arch/x86_64/device/hpet.rs b/src/arch/x86_64/device/hpet.rs
index 3490dee5b1697ededa3bc7fdbb3c4783b7ef06ba..662c17578a81c8731f17ac3e33d3dee836c71017 100644
--- a/src/arch/x86_64/device/hpet.rs
+++ b/src/arch/x86_64/device/hpet.rs
@@ -16,7 +16,7 @@ static T0_COMPARATOR_OFFSET: usize = 0x108;
 
 pub unsafe fn init(hpet: &mut Hpet) {
     let counter_clk_period_fs = hpet.base_address.read_u64(CAPABILITY_OFFSET) >> 32;
-    let desired_fs_period: u64 = 2250286 * 1000000;
+    let desired_fs_period: u64 = 2_250_286 * 1_000_000;
 
     let clk_periods_per_kernel_tick: u64 = desired_fs_period / counter_clk_period_fs;
 
diff --git a/src/arch/x86_64/device/local_apic.rs b/src/arch/x86_64/device/local_apic.rs
index 251e748d4df89f12fcfc523b030d4cbef933df23..0b5c175075ccd8fcd164c092aa5e24739c9c491a 100644
--- a/src/arch/x86_64/device/local_apic.rs
+++ b/src/arch/x86_64/device/local_apic.rs
@@ -27,7 +27,7 @@ pub struct LocalApic {
 
 impl LocalApic {
     unsafe fn init(&mut self, active_table: &mut ActivePageTable) {
-        self.address = (rdmsr(IA32_APIC_BASE) as usize & 0xFFFF0000) + ::KERNEL_OFFSET;
+        self.address = (rdmsr(IA32_APIC_BASE) as usize & 0xFFFF_0000) + ::KERNEL_OFFSET;
         self.x2 = CpuId::new().get_feature_info().unwrap().has_x2apic();
 
         if ! self.x2 {
diff --git a/src/arch/x86_64/device/rtc.rs b/src/arch/x86_64/device/rtc.rs
index 29ff7f7682741fd0141a6da145f8b28582e3be64..ea9e88dd644bc52d263982a55c642fe48a27a9d1 100644
--- a/src/arch/x86_64/device/rtc.rs
+++ b/src/arch/x86_64/device/rtc.rs
@@ -19,16 +19,16 @@ pub struct Rtc {
 impl Rtc {
     /// Create new empty RTC
     pub fn new() -> Self {
-        return Rtc {
+        Rtc {
             addr: Pio::<u8>::new(0x70),
             data: Pio::<u8>::new(0x71),
-        };
+        }
     }
 
     /// Read
     unsafe fn read(&mut self, reg: u8) -> u8 {
         self.addr.write(reg);
-        return self.data.read();
+        self.data.read()
     }
 
     /// Wait
@@ -66,7 +66,7 @@ impl Rtc {
             if let Some(century_reg) = century_register {
                 self.read(century_reg) as usize
             } else */ {
-                20 as usize
+                20
             };
             register_b = self.read(0xB);
         }
@@ -93,32 +93,30 @@ impl Rtc {
         year += century * 100;
 
         // Unix time from clock
-        let mut secs: u64 = (year as u64 - 1970) * 31536000;
+        let mut secs: u64 = (year as u64 - 1970) * 31_536_000;
 
         let mut leap_days = (year as u64 - 1972) / 4 + 1;
-        if year % 4 == 0 {
-            if month <= 2 {
-                leap_days -= 1;
-            }
+        if year % 4 == 0 && month <= 2 {
+            leap_days -= 1;
         }
-        secs += leap_days * 86400;
+        secs += leap_days * 86_400;
 
         match month {
-            2 => secs += 2678400,
-            3 => secs += 5097600,
-            4 => secs += 7776000,
-            5 => secs += 10368000,
-            6 => secs += 13046400,
-            7 => secs += 15638400,
-            8 => secs += 18316800,
-            9 => secs += 20995200,
-            10 => secs += 23587200,
-            11 => secs += 26265600,
-            12 => secs += 28857600,
+            2 => secs += 2_678_400,
+            3 => secs += 5_097_600,
+            4 => secs += 7_776_000,
+            5 => secs += 10_368_000,
+            6 => secs += 13_046_400,
+            7 => secs += 15_638_400,
+            8 => secs += 18_316_800,
+            9 => secs += 20_995_200,
+            10 => secs += 23_587_200,
+            11 => secs += 26_265_600,
+            12 => secs += 28_857_600,
             _ => (),
         }
 
-        secs += (day as u64 - 1) * 86400;
+        secs += (day as u64 - 1) * 86_400;
         secs += hour as u64 * 3600;
         secs += minute as u64 * 60;
         secs += second as u64;
diff --git a/src/arch/x86_64/interrupt/irq.rs b/src/arch/x86_64/interrupt/irq.rs
index b463fd35c2c4b8ddd208130119137fe90ab003b1..4031ed1e80cb98283f09d3ce3ef6594f3113db0d 100644
--- a/src/arch/x86_64/interrupt/irq.rs
+++ b/src/arch/x86_64/interrupt/irq.rs
@@ -46,13 +46,13 @@ interrupt!(pit, {
 
     // Saves CPU time by not sending IRQ event irq_trigger(0);
 
-    const PIT_RATE: u64 = 2250286;
+    const PIT_RATE: u64 = 2_250_286;
 
     {
         let mut offset = time::OFFSET.lock();
         let sum = offset.1 + PIT_RATE;
-        offset.1 = sum % 1000000000;
-        offset.0 += sum / 1000000000;
+        offset.1 = sum % 1_000_000_000;
+        offset.0 += sum / 1_000_000_000;
     }
 
     pic::MASTER.ack();
diff --git a/src/arch/x86_64/paging/entry.rs b/src/arch/x86_64/paging/entry.rs
index f031f62c022d79270846f72f4a247de692a673ce..056b25915dba9ca7b663e58abab3575df552efb3 100644
--- a/src/arch/x86_64/paging/entry.rs
+++ b/src/arch/x86_64/paging/entry.rs
@@ -10,7 +10,7 @@ pub struct Entry(u64);
 
 bitflags! {
     pub struct EntryFlags: u64 {
-        const PRESENT =         1 << 0;
+        const PRESENT =         1;
         const WRITABLE =        1 << 1;
         const USER_ACCESSIBLE = 1 << 2;
         const WRITE_THROUGH =   1 << 3;
@@ -39,7 +39,7 @@ impl Entry {
 
     /// Make the entry unused
     pub fn set_unused(&mut self) {
-        self.0 = self.0 & COUNTER_MASK;
+        self.0 &= COUNTER_MASK;
     }
 
     /// Get the address this page references
@@ -71,7 +71,7 @@ impl Entry {
         (self.0 & COUNTER_MASK) >> 52
     }
 
-    /// Set bits 52-61 in entry, used as counter for page table    
+    /// Set bits 52-61 in entry, used as counter for page table
     pub fn set_counter_bits(&mut self, count: u64) {
         self.0 = (self.0 & !COUNTER_MASK) | (count << 52);
     }
diff --git a/src/arch/x86_64/paging/mapper.rs b/src/arch/x86_64/paging/mapper.rs
index c2cc5923fd413dc5f8648105426ab8449d29c314..12acef653f0b6a01a7d6c412c7e0a291cefdb1a9 100644
--- a/src/arch/x86_64/paging/mapper.rs
+++ b/src/arch/x86_64/paging/mapper.rs
@@ -39,7 +39,7 @@ impl Drop for MapperFlush {
 }
 
 /// To allow for combining multiple flushes into one, we have a way of flushing
-/// the active table, which can consume MapperFlush structs
+/// the active table, which can consume `MapperFlush` structs
 #[must_use = "The page table must be flushed, or the changes unsafely ignored"]
 pub struct MapperFlushAll(bool);
 
diff --git a/src/arch/x86_64/paging/mod.rs b/src/arch/x86_64/paging/mod.rs
index d4096dfcd381c290ed5647f9f7f15210c132b197..43369b9b05e58ab8b95ac6f3dc16897669e93e39 100644
--- a/src/arch/x86_64/paging/mod.rs
+++ b/src/arch/x86_64/paging/mod.rs
@@ -304,7 +304,7 @@ impl ActivePageTable {
         unsafe { tlb::flush_all(); }
     }
 
-    pub fn with<F>(&mut self, table: &mut InactivePageTable, temporary_page: &mut temporary_page::TemporaryPage, f: F)
+    pub fn with<F>(&mut self, table: &mut InactivePageTable, temporary_page: &mut TemporaryPage, f: F)
         where F: FnOnce(&mut Mapper)
     {
         use x86::controlregs;
@@ -415,7 +415,7 @@ impl Page {
     }
 
     pub fn p1_index(&self) -> usize {
-        (self.number >> 0) & 0o777
+        self.number & 0o777
     }
 
     pub fn containing_address(address: VirtualAddress) -> Page {
diff --git a/src/arch/x86_64/start.rs b/src/arch/x86_64/start.rs
index 66125752c55a014b6184ee2c64b05526b97d711b..97735958c68cef615d6c40309bc996fa569974ba 100644
--- a/src/arch/x86_64/start.rs
+++ b/src/arch/x86_64/start.rs
@@ -20,13 +20,13 @@ use paging::mapper::MapperFlushAll;
 /// Test of zero values in BSS.
 static BSS_TEST_ZERO: usize = 0;
 /// Test of non-zero values in data.
-static DATA_TEST_NONZERO: usize = 0xFFFFFFFFFFFFFFFF;
+static DATA_TEST_NONZERO: usize = 0xFFFF_FFFF_FFFF_FFFF;
 /// Test of zero values in thread BSS
 #[thread_local]
 static mut TBSS_TEST_ZERO: usize = 0;
 /// Test of non-zero values in thread data.
 #[thread_local]
-static mut TDATA_TEST_NONZERO: usize = 0xFFFFFFFFFFFFFFFF;
+static mut TDATA_TEST_NONZERO: usize = 0xFFFF_FFFF_FFFF_FFFF;
 
 pub static KERNEL_BASE: AtomicUsize = ATOMIC_USIZE_INIT;
 pub static KERNEL_SIZE: AtomicUsize = ATOMIC_USIZE_INIT;
@@ -60,7 +60,7 @@ pub unsafe extern fn kstart(args_ptr: *const KernelArgs) -> ! {
         // BSS should already be zero
         {
             assert_eq!(BSS_TEST_ZERO, 0);
-            assert_eq!(DATA_TEST_NONZERO, 0xFFFFFFFFFFFFFFFF);
+            assert_eq!(DATA_TEST_NONZERO, 0xFFFF_FFFF_FFFF_FFFF);
         }
 
         KERNEL_BASE.store(kernel_base, Ordering::SeqCst);
@@ -87,9 +87,9 @@ pub unsafe extern fn kstart(args_ptr: *const KernelArgs) -> ! {
             assert_eq!(TBSS_TEST_ZERO, 0);
             TBSS_TEST_ZERO += 1;
             assert_eq!(TBSS_TEST_ZERO, 1);
-            assert_eq!(TDATA_TEST_NONZERO, 0xFFFFFFFFFFFFFFFF);
+            assert_eq!(TDATA_TEST_NONZERO, 0xFFFF_FFFF_FFFF_FFFF);
             TDATA_TEST_NONZERO -= 1;
-            assert_eq!(TDATA_TEST_NONZERO, 0xFFFFFFFFFFFFFFFE);
+            assert_eq!(TDATA_TEST_NONZERO, 0xFFFF_FFFF_FFFF_FFFE);
         }
 
         // Reset AP variables
@@ -153,7 +153,7 @@ pub unsafe extern fn kstart_ap(args_ptr: *const KernelArgsAp) -> ! {
         let stack_end = args.stack_end as usize;
 
         assert_eq!(BSS_TEST_ZERO, 0);
-        assert_eq!(DATA_TEST_NONZERO, 0xFFFFFFFFFFFFFFFF);
+        assert_eq!(DATA_TEST_NONZERO, 0xFFFF_FFFF_FFFF_FFFF);
 
         // Initialize paging
         let tcb_offset = paging::init_ap(cpu_id, bsp_table, stack_start, stack_end);
@@ -169,9 +169,9 @@ pub unsafe extern fn kstart_ap(args_ptr: *const KernelArgsAp) -> ! {
             assert_eq!(TBSS_TEST_ZERO, 0);
             TBSS_TEST_ZERO += 1;
             assert_eq!(TBSS_TEST_ZERO, 1);
-            assert_eq!(TDATA_TEST_NONZERO, 0xFFFFFFFFFFFFFFFF);
+            assert_eq!(TDATA_TEST_NONZERO, 0xFFFF_FFFF_FFFF_FFFF);
             TDATA_TEST_NONZERO -= 1;
-            assert_eq!(TDATA_TEST_NONZERO, 0xFFFFFFFFFFFFFFFE);
+            assert_eq!(TDATA_TEST_NONZERO, 0xFFFF_FFFF_FFFF_FFFE);
         }
 
         // Initialize devices (for AP)
@@ -205,7 +205,7 @@ pub unsafe fn usermode(ip: usize, sp: usize, arg: usize) -> ! {
         :   "{r10}"(gdt::GDT_USER_DATA << 3 | 3), // Data segment
             "{r11}"(gdt::GDT_USER_TLS << 3 | 3), // TLS segment
             "{r12}"(sp), // Stack pointer
-            "{r13}"(0 << 12 | 1 << 9), // Flags - Set IOPL and interrupt enable flag
+            "{r13}"(1 << 9), // Flags - Set interrupt enable flag
             "{r14}"(gdt::GDT_USER_CODE << 3 | 3), // Code segment
             "{r15}"(ip) // IP
             "{rdi}"(arg) // Argument
diff --git a/src/context/arch/x86_64.rs b/src/context/arch/x86_64.rs
index f9c4e02188152ca0808011a806c140b5723631bf..c286ad3529462bdbd6d6fe30229325ec94d2c632 100644
--- a/src/context/arch/x86_64.rs
+++ b/src/context/arch/x86_64.rs
@@ -3,7 +3,7 @@ use core::sync::atomic::{AtomicBool, ATOMIC_BOOL_INIT};
 
 /// This must be used by the kernel to ensure that context switches are done atomically
 /// Compare and exchange this to true when beginning a context switch on any CPU
-/// The Context::switch_to function will set it back to false, allowing other CPU's to switch
+/// The `Context::switch_to` function will set it back to false, allowing other CPU's to switch
 /// This must be done, as no locks can be held on the stack during switch
 pub static CONTEXT_SWITCH_LOCK: AtomicBool = ATOMIC_BOOL_INIT;
 
diff --git a/src/context/context.rs b/src/context/context.rs
index 6449869732e389b20afe362defe75bac2982c934..8fc4281e68601a1985451147aac67af282c409f7 100644
--- a/src/context/context.rs
+++ b/src/context/context.rs
@@ -18,7 +18,7 @@ use ::core::sync::atomic::AtomicUsize;
 int_like!(ContextId, AtomicContextId, usize, AtomicUsize);
 
 /// The status of a context - used for scheduling
-/// See syscall::process::waitpid and the sync module for examples of usage
+/// See `syscall::process::waitpid` and the `sync` module for examples of usage
 #[derive(Copy, Clone, Debug, Eq, PartialEq)]
 pub enum Status {
     Runnable,
@@ -182,13 +182,11 @@ impl Context {
                     } else if part == b".." {
                         *nskip += 1;
                         Some(None)
-                    } else {
-                        if *nskip > 0 {
+                    } else if *nskip > 0 {
                             *nskip -= 1;
                             Some(None)
-                        } else {
-                            Some(Some(part))
-                        }
+                    } else {
+                        Some(Some(part))
                     }
                 })
                 .filter_map(|x| x)
@@ -206,7 +204,7 @@ impl Context {
         result.pop(); // remove extra '/'
 
         // replace with the root of the scheme if it's empty
-        if result.len() == 0 {
+        if result.is_empty() {
             let pos = canon.iter()
                             .position(|&b| b == b':')
                             .map_or(canon.len(), |p| p + 1);
diff --git a/src/context/list.rs b/src/context/list.rs
index 71e688d1a8fa3e7ac40d993c7bb87fbb31c1679e..6ae441c190496cf213a139284a9045f05561eb34 100644
--- a/src/context/list.rs
+++ b/src/context/list.rs
@@ -71,7 +71,7 @@ impl ContextList {
             for b in fx.iter_mut() {
                 *b = 0;
             }
-            let mut stack = vec![0; 65536].into_boxed_slice();
+            let mut stack = vec![0; 65_536].into_boxed_slice();
             let offset = stack.len() - mem::size_of::<usize>();
             unsafe {
                 let offset = stack.len() - mem::size_of::<usize>();
diff --git a/src/context/mod.rs b/src/context/mod.rs
index f0e428c1ab711756be7e9a5430c6c9719d37d600..d573087f052026495f9c13583b417c70bc2d7f63 100644
--- a/src/context/mod.rs
+++ b/src/context/mod.rs
@@ -37,7 +37,7 @@ pub mod timeout;
 pub const CONTEXT_MAX_CONTEXTS: usize = (isize::max_value() as usize) - 1;
 
 /// Maximum context files
-pub const CONTEXT_MAX_FILES: usize = 65536;
+pub const CONTEXT_MAX_FILES: usize = 65_536;
 
 /// Contexts list
 static CONTEXTS: Once<RwLock<ContextList>> = Once::new();
@@ -77,6 +77,6 @@ pub fn contexts_mut() -> RwLockWriteGuard<'static, ContextList> {
     CONTEXTS.call_once(init_contexts).write()
 }
 
-pub fn context_id() -> context::ContextId {
+pub fn context_id() -> ContextId {
     CONTEXT_ID.load(Ordering::SeqCst)
 }
diff --git a/src/lib.rs b/src/lib.rs
index 3bf770de4d8223434c03376b3b7ea2d354204b1e..69727a62673677da6d48bef7e15c770ca7754366 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -1,9 +1,17 @@
 //! # The Redox OS Kernel, version 2
 //!
-//! The Redox OS Kernel is a microkernel that supports X86_64 systems and
+//! The Redox OS Kernel is a microkernel that supports `x86_64` systems and
 //! provides Unix-like syscalls for primarily Rust applications
 
 //#![deny(warnings)]
+#![cfg_attr(feature = "clippy", allow(if_same_then_else))]
+#![cfg_attr(feature = "clippy", allow(inline_always))]
+#![cfg_attr(feature = "clippy", allow(many_single_char_names))]
+#![cfg_attr(feature = "clippy", allow(module_inception))]
+#![cfg_attr(feature = "clippy", allow(new_without_default))]
+#![cfg_attr(feature = "clippy", allow(not_unsafe_ptr_arg_deref))]
+#![cfg_attr(feature = "clippy", allow(or_fun_call))]
+#![cfg_attr(feature = "clippy", allow(too_many_arguments))]
 #![feature(alloc)]
 #![feature(allocator_api)]
 #![feature(asm)]
diff --git a/src/scheme/mod.rs b/src/scheme/mod.rs
index a272d634c70b17790fc0dca8ceb99d116a7bdbd3..96e734066c4fb4dd76d4deb1f09672ad8001c619 100644
--- a/src/scheme/mod.rs
+++ b/src/scheme/mod.rs
@@ -64,7 +64,7 @@ pub mod time;
 pub mod user;
 
 /// Limit on number of schemes
-pub const SCHEME_MAX_SCHEMES: usize = 65536;
+pub const SCHEME_MAX_SCHEMES: usize = 65_536;
 
 /// Unique identifier for a scheme namespace.
 int_like!(SchemeNamespace, AtomicSchemeNamespace, usize, AtomicUsize);
@@ -197,7 +197,7 @@ impl SchemeList {
                 return self.get(id).map(|scheme| (id, scheme));
             }
         }
-        return None;
+        None
     }
 
     /// Create a new scheme.
diff --git a/src/scheme/user.rs b/src/scheme/user.rs
index 8ceb28439dc467bd932b5f1c6a1c66f3b633db4f..c26c585debb17dd8217239c8025bfe51d81b8ad4 100644
--- a/src/scheme/user.rs
+++ b/src/scheme/user.rs
@@ -205,7 +205,7 @@ impl UserInner {
     }
 }
 
-/// UserInner has to be wrapped
+/// `UserInner` has to be wrapped
 pub struct UserScheme {
     inner: Weak<UserInner>
 }
diff --git a/src/sync/wait_condition.rs b/src/sync/wait_condition.rs
index 500e8cd31663807f7a83e8b075a7edf7010606bb..37e33aaebc7b38c774551074fe035f50c863ab84 100644
--- a/src/sync/wait_condition.rs
+++ b/src/sync/wait_condition.rs
@@ -31,7 +31,7 @@ impl WaitCondition {
             let context_lock = {
                 let contexts = context::contexts();
                 let context_lock = contexts.current().expect("WaitCondition::wait: no context");
-                context_lock.clone()
+                Arc::clone(&context_lock)
             };
 
             {
diff --git a/src/sync/wait_map.rs b/src/sync/wait_map.rs
index 2705969b66ebcfe93daba081b5517010eacb74a8..37acdb92a026c897600e2529b4ad572eb0c28aa7 100644
--- a/src/sync/wait_map.rs
+++ b/src/sync/wait_map.rs
@@ -33,7 +33,7 @@ impl<K, V> WaitMap<K, V> where K: Clone + Ord {
 
     pub fn receive_any_nonblock(&self) -> Option<(K, V)> {
         let mut inner = self.inner.lock();
-        if let Some(key) = inner.keys().next().map(|key| key.clone()) {
+        if let Some(key) = inner.keys().next().cloned() {
             inner.remove(&key).map(|value| (key, value))
         } else {
             None
diff --git a/src/syscall/debug.rs b/src/syscall/debug.rs
index 520956d8e67233f6b27f18fdc83ea96100ce4a3d..06474a129d4367c771846b9094b0536d5800fc2a 100644
--- a/src/syscall/debug.rs
+++ b/src/syscall/debug.rs
@@ -223,7 +223,7 @@ pub fn format_call(a: usize, b: usize, c: usize, d: usize, e: usize, f: usize) -
             b,
             c
         ),
-        SYS_GETEGID => format!("getgid()"),
+        SYS_GETEGID => format!("getegid()"),
         SYS_GETENS => format!("getens()"),
         SYS_GETEUID => format!("geteuid()"),
         SYS_GETGID => format!("getgid()"),
diff --git a/src/syscall/fs.rs b/src/syscall/fs.rs
index 6cd747a1d2aa50607b9fe957c9299f6b90e547c1..71e3abfc7becaf3e190dc6b13e73f613e641b9ec 100644
--- a/src/syscall/fs.rs
+++ b/src/syscall/fs.rs
@@ -8,7 +8,7 @@ use scheme::{self, FileHandle};
 use syscall;
 use syscall::data::{Packet, Stat};
 use syscall::error::*;
-use syscall::flag::{F_GETFD, F_SETFD, F_GETFL, F_SETFL, F_DUPFD, O_ACCMODE, O_RDONLY, O_WRONLY, MODE_DIR, MODE_FILE, O_CLOEXEC};
+use syscall::flag::{F_GETFD, F_SETFD, F_GETFL, F_SETFL, F_DUPFD, O_ACCMODE, O_DIRECTORY, O_RDONLY, O_WRONLY, MODE_DIR, MODE_FILE, O_CLOEXEC};
 use context::file::{FileDescriptor, FileDescription};
 
 pub fn file_op(a: usize, fd: FileHandle, c: usize, d: usize) -> Result<usize> {
@@ -23,7 +23,7 @@ pub fn file_op(a: usize, fd: FileHandle, c: usize, d: usize) -> Result<usize> {
     let scheme = {
         let schemes = scheme::schemes();
         let scheme = schemes.get(file.description.read().scheme).ok_or(Error::new(EBADF))?;
-        scheme.clone()
+        Arc::clone(&scheme)
     };
 
     let mut packet = Packet {
@@ -52,7 +52,7 @@ pub fn file_op_mut_slice(a: usize, fd: FileHandle, slice: &mut [u8]) -> Result<u
 
 /// Change the current working directory
 pub fn chdir(path: &[u8]) -> Result<usize> {
-    let fd = open(path, syscall::flag::O_RDONLY | syscall::flag::O_DIRECTORY)?;
+    let fd = open(path, O_RDONLY | O_DIRECTORY)?;
     let mut stat = Stat::default();
     let stat_res = file_op_mut_slice(syscall::number::SYS_FSTAT, fd, &mut stat);
     let _ = close(fd);
@@ -103,7 +103,7 @@ pub fn open(path: &[u8], flags: usize) -> Result<FileHandle> {
         let (scheme_id, scheme) = {
             let schemes = scheme::schemes();
             let (scheme_id, scheme) = schemes.get_name(scheme_ns, scheme_name).ok_or(Error::new(ENODEV))?;
-            (scheme_id, scheme.clone())
+            (scheme_id, Arc::clone(&scheme))
         };
         let file_id = scheme.open(reference_opt.unwrap_or(b""), flags, uid, gid)?;
         (scheme_id, file_id)
@@ -178,7 +178,7 @@ pub fn chmod(path: &[u8], mode: u16) -> Result<usize> {
     let scheme = {
         let schemes = scheme::schemes();
         let (_scheme_id, scheme) = schemes.get_name(scheme_ns, scheme_name).ok_or(Error::new(ENODEV))?;
-        scheme.clone()
+        Arc::clone(&scheme)
     };
     scheme.chmod(reference_opt.unwrap_or(b""), mode, uid, gid)
 }
@@ -200,7 +200,7 @@ pub fn rmdir(path: &[u8]) -> Result<usize> {
     let scheme = {
         let schemes = scheme::schemes();
         let (_scheme_id, scheme) = schemes.get_name(scheme_ns, scheme_name).ok_or(Error::new(ENODEV))?;
-        scheme.clone()
+        Arc::clone(&scheme)
     };
     scheme.rmdir(reference_opt.unwrap_or(b""), uid, gid)
 }
@@ -222,7 +222,7 @@ pub fn unlink(path: &[u8]) -> Result<usize> {
     let scheme = {
         let schemes = scheme::schemes();
         let (_scheme_id, scheme) = schemes.get_name(scheme_ns, scheme_name).ok_or(Error::new(ENODEV))?;
-        scheme.clone()
+        Arc::clone(&scheme)
     };
     scheme.unlink(reference_opt.unwrap_or(b""), uid, gid)
 }
@@ -233,8 +233,7 @@ pub fn close(fd: FileHandle) -> Result<usize> {
         let contexts = context::contexts();
         let context_lock = contexts.current().ok_or(Error::new(ESRCH))?;
         let context = context_lock.read();
-        let file = context.remove_file(fd).ok_or(Error::new(EBADF))?;
-        file
+        context.remove_file(fd).ok_or(Error::new(EBADF))?
     };
 
     file.close(fd)
@@ -245,8 +244,7 @@ fn duplicate_file(fd: FileHandle, buf: &[u8]) -> Result<FileDescriptor> {
         let contexts = context::contexts();
         let context_lock = contexts.current().ok_or(Error::new(ESRCH))?;
         let context = context_lock.read();
-        let file = context.get_file(fd).ok_or(Error::new(EBADF))?;
-        file
+        context.get_file(fd).ok_or(Error::new(EBADF))?
     };
 
     if buf.is_empty() {
@@ -262,8 +260,7 @@ fn duplicate_file(fd: FileHandle, buf: &[u8]) -> Result<FileDescriptor> {
             let scheme = {
                 let schemes = scheme::schemes();
                 let scheme = schemes.get(description.scheme).ok_or(Error::new(EBADF))?;
-
-                scheme.clone()
+                Arc::clone(&scheme)
             };
             scheme.dup(description.number, buf)?
         };
@@ -313,8 +310,7 @@ pub fn fcntl(fd: FileHandle, cmd: usize, arg: usize) -> Result<usize> {
         let contexts = context::contexts();
         let context_lock = contexts.current().ok_or(Error::new(ESRCH))?;
         let context = context_lock.read();
-        let file = context.get_file(fd).ok_or(Error::new(EBADF))?;
-        file
+        context.get_file(fd).ok_or(Error::new(EBADF))?
     };
 
     let description = file.description.read();
@@ -324,7 +320,7 @@ pub fn fcntl(fd: FileHandle, cmd: usize, arg: usize) -> Result<usize> {
         let scheme = {
             let schemes = scheme::schemes();
             let scheme = schemes.get(description.scheme).ok_or(Error::new(EBADF))?;
-            scheme.clone()
+            Arc::clone(&scheme)
         };
         scheme.fcntl(description.number, cmd, arg)?;
     };
@@ -405,7 +401,7 @@ pub fn fevent(fd: FileHandle, flags: usize) -> Result<usize> {
     let scheme = {
         let schemes = scheme::schemes();
         let scheme = schemes.get(description.scheme).ok_or(Error::new(EBADF))?;
-        scheme.clone()
+        Arc::clone(&scheme)
     };
     let event_id = scheme.fevent(description.number, flags)?;
     {
diff --git a/src/syscall/futex.rs b/src/syscall/futex.rs
index c38fce9c64a93957981626682fbf72535b5a99de..d6f5696a7c7e77b36b7919370a5d58d3bacc1d4d 100644
--- a/src/syscall/futex.rs
+++ b/src/syscall/futex.rs
@@ -45,7 +45,7 @@ pub fn futex(addr: &mut i32, op: usize, val: i32, val2: usize, addr2: *mut i32)
                 let context_lock = {
                     let contexts = context::contexts();
                     let context_lock = contexts.current().ok_or(Error::new(ESRCH))?;
-                    context_lock.clone()
+                    Arc::clone(&context_lock)
                 };
 
                 if unsafe { intrinsics::atomic_load(addr) != val } {
@@ -58,7 +58,7 @@ pub fn futex(addr: &mut i32, op: usize, val: i32, val2: usize, addr2: *mut i32)
                     if let Some(timeout) = timeout_opt {
                         let start = time::monotonic();
                         let sum = start.1 + timeout.tv_nsec as u64;
-                        let end = (start.0 + timeout.tv_sec as u64 + sum / 1000000000, sum % 1000000000);
+                        let end = (start.0 + timeout.tv_sec as u64 + sum / 1_000_000_000, sum % 1_000_000_000);
                         context.wake = Some(end);
                     }
 
@@ -74,7 +74,7 @@ pub fn futex(addr: &mut i32, op: usize, val: i32, val2: usize, addr2: *mut i32)
                 let context_lock = {
                     let contexts = context::contexts();
                     let context_lock = contexts.current().ok_or(Error::new(ESRCH))?;
-                    context_lock.clone()
+                    Arc::clone(&context_lock)
                 };
 
                 {
diff --git a/src/syscall/process.rs b/src/syscall/process.rs
index 8b709e7a24b8d67028a65bb5c5a88d9cffa25fbc..e4244e69d4b246b68670634bb85f43f9881c4765 100644
--- a/src/syscall/process.rs
+++ b/src/syscall/process.rs
@@ -240,25 +240,25 @@ pub fn clone(flags: usize, stack_base: usize) -> Result<ContextId> {
             }
 
             if flags & CLONE_VM == CLONE_VM {
-                grants = context.grants.clone();
+                grants = Arc::clone(&context.grants);
             } else {
                 grants = Arc::new(Mutex::new(Vec::new()));
             }
 
             if flags & CLONE_VM == CLONE_VM {
-                name = context.name.clone();
+                name = Arc::clone(&context.name);
             } else {
                 name = Arc::new(Mutex::new(context.name.lock().clone()));
             }
 
             if flags & CLONE_FS == CLONE_FS {
-                cwd = context.cwd.clone();
+                cwd = Arc::clone(&context.cwd);
             } else {
                 cwd = Arc::new(Mutex::new(context.cwd.lock().clone()));
             }
 
             if flags & CLONE_VM == CLONE_VM {
-                env = context.env.clone();
+                env = Arc::clone(&context.env);
             } else {
                 let mut new_env = BTreeMap::new();
                 for item in context.env.lock().iter() {
@@ -268,13 +268,13 @@ pub fn clone(flags: usize, stack_base: usize) -> Result<ContextId> {
             }
 
             if flags & CLONE_FILES == CLONE_FILES {
-                files = context.files.clone();
+                files = Arc::clone(&context.files);
             } else {
                 files = Arc::new(Mutex::new(context.files.lock().clone()));
             }
 
             if flags & CLONE_SIGHAND == CLONE_SIGHAND {
-                actions = context.actions.clone();
+                actions = Arc::clone(&context.actions);
             } else {
                 actions = Arc::new(Mutex::new(context.actions.lock().clone()));
             }
@@ -826,7 +826,7 @@ pub fn exit(status: usize) -> ! {
         let context_lock = {
             let contexts = context::contexts();
             let context_lock = contexts.current().ok_or(Error::new(ESRCH)).expect("exit failed to find context");
-            context_lock.clone()
+            Arc::clone(&context_lock)
         };
 
         let mut close_files = Vec::new();
@@ -892,7 +892,7 @@ pub fn exit(status: usize) -> ! {
                             println!("{}: {} not blocked for exit vfork unblock", pid.into(), ppid.into());
                         }
                     }
-                    parent.waitpid.clone()
+                    Arc::clone(&parent.waitpid)
                 };
 
                 for (c_pid, c_status) in children {
@@ -1134,7 +1134,7 @@ pub fn waitpid(pid: ContextId, status_ptr: usize, flags: usize) -> Result<Contex
         let contexts = context::contexts();
         let context_lock = contexts.current().ok_or(Error::new(ESRCH))?;
         let context = context_lock.read();
-        (context.id, context.waitpid.clone())
+        (context.id, Arc::clone(&context.waitpid))
     };
 
     let mut tmp = [0];
@@ -1167,7 +1167,7 @@ pub fn waitpid(pid: ContextId, status_ptr: usize, flags: usize) -> Result<Contex
                 context.ppid = ppid;
                 //return Err(Error::new(ECHILD));
             }
-            context.status.clone()
+            context.status
         };
 
         if let context::Status::Exited(status) = status {
diff --git a/src/syscall/time.rs b/src/syscall/time.rs
index d4adaf23fd259b0152d431e99561ca19a415b6c6..cef0bba93d870c679b283e62fe12c24410d1ff01 100644
--- a/src/syscall/time.rs
+++ b/src/syscall/time.rs
@@ -19,7 +19,7 @@ pub fn clock_gettime(clock: usize, time: &mut TimeSpec) -> Result<usize> {
 pub fn nanosleep(req: &TimeSpec, rem_opt: Option<&mut TimeSpec>) -> Result<usize> {
     let start = time::monotonic();
     let sum = start.1 + req.tv_nsec as u64;
-    let end = (start.0 + req.tv_sec as u64 + sum / 1000000000, sum % 1000000000);
+    let end = (start.0 + req.tv_sec as u64 + sum / 1_000_000_000, sum % 1_000_000_000);
 
     {
         let contexts = context::contexts();
diff --git a/src/time.rs b/src/time.rs
index 7af3ef70721b9da7ec03c69548541b194557f9f0..6fd7720a95a8a19721473a34dd69d8557f299e69 100644
--- a/src/time.rs
+++ b/src/time.rs
@@ -1,6 +1,8 @@
 use spin::Mutex;
 
+/// Kernel start time, measured in (seconds, nanoseconds) since Unix epoch
 pub static START: Mutex<(u64, u64)> = Mutex::new((0, 0));
+/// Kernel up time, measured in (seconds, nanoseconds) since `START_TIME`
 pub static OFFSET: Mutex<(u64, u64)> = Mutex::new((0, 0));
 
 pub fn monotonic() -> (u64, u64) {
@@ -11,5 +13,5 @@ pub fn realtime() -> (u64, u64) {
     let offset = monotonic();
     let start = *START.lock();
     let sum = start.1 + offset.1;
-    (start.0 + offset.0 + sum / 1000000000, sum % 1000000000)
+    (start.0 + offset.0 + sum / 1_000_000_000, sum % 1_000_000_000)
 }