diff --git a/hercules_cg/Cargo.toml b/hercules_cg/Cargo.toml
index 8a60956b356465632225e5dfb477166149c44648..cf0767de04c81e35974a7aca89e9085b543e1a9d 100644
--- a/hercules_cg/Cargo.toml
+++ b/hercules_cg/Cargo.toml
@@ -2,6 +2,7 @@
 name = "hercules_cg"
 version = "0.1.0"
 authors = ["Russel Arbore <rarbore2@illinois.edu>"]
+edition = "2021"
 
 [dependencies]
 rand = "*"
diff --git a/hercules_cg/src/cpu.rs b/hercules_cg/src/cpu.rs
index 415244043c304fd94e7b95cd4c3ace990bfdcbcb..3f600fc0b6e729711be8632442e2b756b40e26a1 100644
--- a/hercules_cg/src/cpu.rs
+++ b/hercules_cg/src/cpu.rs
@@ -1,11 +1,9 @@
-extern crate hercules_ir;
-
 use std::collections::BTreeMap;
 use std::fmt::{Error, Write};
 use std::iter::zip;
 use std::sync::atomic::{AtomicUsize, Ordering};
 
-use self::hercules_ir::*;
+use hercules_ir::*;
 
 use crate::*;
 
@@ -21,7 +19,6 @@ pub fn cpu_codegen<W: Write>(
     types: &Vec<Type>,
     constants: &Vec<Constant>,
     dynamic_constants: &Vec<DynamicConstant>,
-    reverse_postorder: &Vec<NodeID>,
     typing: &Vec<TypeID>,
     control_subgraph: &Subgraph,
     bbs: &BasicBlocks,
@@ -32,7 +29,6 @@ pub fn cpu_codegen<W: Write>(
         types,
         constants,
         dynamic_constants,
-        reverse_postorder,
         typing,
         control_subgraph,
         bbs,
@@ -45,7 +41,6 @@ struct CPUContext<'a> {
     types: &'a Vec<Type>,
     constants: &'a Vec<Constant>,
     dynamic_constants: &'a Vec<DynamicConstant>,
-    reverse_postorder: &'a Vec<NodeID>,
     typing: &'a Vec<TypeID>,
     control_subgraph: &'a Subgraph,
     bbs: &'a BasicBlocks,
diff --git a/hercules_cg/src/device.rs b/hercules_cg/src/device.rs
index 7dbeeeda77182e833b258f4f78109e7e3abb185e..866fa6adeeb41c2c8106a1b7de5ce1ffdc45db40 100644
--- a/hercules_cg/src/device.rs
+++ b/hercules_cg/src/device.rs
@@ -1,6 +1,4 @@
-extern crate hercules_ir;
-
-use self::hercules_ir::*;
+use hercules_ir::*;
 
 /*
  * Top level function to definitively place functions onto devices. A function
diff --git a/hercules_cg/src/lib.rs b/hercules_cg/src/lib.rs
index 77cfa5404ddbb368ea7e30506bba1b9890663ec6..a70effb5fdaf96c066683735226779cb23d9c020 100644
--- a/hercules_cg/src/lib.rs
+++ b/hercules_cg/src/lib.rs
@@ -8,9 +8,7 @@ pub use crate::cpu::*;
 pub use crate::device::*;
 pub use crate::rt::*;
 
-extern crate hercules_ir;
-
-use self::hercules_ir::*;
+use hercules_ir::*;
 
 /*
  * Basic block info consists of two things:
diff --git a/hercules_cg/src/rt.rs b/hercules_cg/src/rt.rs
index 6278b790d849237b758c1c8ab011d5894731d7cb..65f7121576c8b7c5d703a140ad90ea6262005cd8 100644
--- a/hercules_cg/src/rt.rs
+++ b/hercules_cg/src/rt.rs
@@ -1,10 +1,8 @@
-extern crate hercules_ir;
-
 use std::collections::BTreeMap;
 use std::fmt::{Error, Write};
 use std::iter::zip;
 
-use self::hercules_ir::*;
+use hercules_ir::*;
 
 use crate::*;
 
@@ -16,7 +14,6 @@ use crate::*;
 pub fn rt_codegen<W: Write>(
     func_id: FunctionID,
     module: &Module,
-    reverse_postorder: &Vec<NodeID>,
     typing: &Vec<TypeID>,
     control_subgraph: &Subgraph,
     bbs: &BasicBlocks,
@@ -28,7 +25,6 @@ pub fn rt_codegen<W: Write>(
     let ctx = RTContext {
         func_id,
         module,
-        reverse_postorder,
         typing,
         control_subgraph,
         bbs,
@@ -42,7 +38,6 @@ pub fn rt_codegen<W: Write>(
 struct RTContext<'a> {
     func_id: FunctionID,
     module: &'a Module,
-    reverse_postorder: &'a Vec<NodeID>,
     typing: &'a Vec<TypeID>,
     control_subgraph: &'a Subgraph,
     bbs: &'a BasicBlocks,
diff --git a/hercules_ir/Cargo.toml b/hercules_ir/Cargo.toml
index 44648c11baaa5539f6598270f4423b591f4422e2..deda9cc58758f6cc834aadcc8e4ec66625fefb4b 100644
--- a/hercules_ir/Cargo.toml
+++ b/hercules_ir/Cargo.toml
@@ -2,10 +2,11 @@
 name = "hercules_ir"
 version = "0.1.0"
 authors = ["Russel Arbore <rarbore2@illinois.edu>, Aaron Councilman <aaronjc4@illinois.edu>"]
+edition = "2021"
 
 [dependencies]
 rand = "*"
 nom = "*"
 ordered-float = { version = "*", features = ["serde"] }
 bitvec = "*"
-serde = { version = "*", features = ["derive"] }
\ No newline at end of file
+serde = { version = "*", features = ["derive"] }
diff --git a/hercules_ir/src/dataflow.rs b/hercules_ir/src/dataflow.rs
index 6df19d1408e06cc9e18c2f3f52e4eb5f5f618315..ced77d0ba4b107ce740fd3bafb99645f17747f96 100644
--- a/hercules_ir/src/dataflow.rs
+++ b/hercules_ir/src/dataflow.rs
@@ -1,7 +1,5 @@
-extern crate bitvec;
-
-use self::bitvec::prelude::*;
-use self::bitvec::slice::*;
+use bitvec::prelude::*;
+use bitvec::slice::*;
 
 use crate::*;
 
diff --git a/hercules_ir/src/dot.rs b/hercules_ir/src/dot.rs
index c05f2606b2d90ae06b10f47cd2028b8a3ca974f5..4d526366808e8b2aea39fecd81f6c00269ffb154 100644
--- a/hercules_ir/src/dot.rs
+++ b/hercules_ir/src/dot.rs
@@ -1,5 +1,3 @@
-extern crate rand;
-
 use std::collections::HashMap;
 use std::env::temp_dir;
 use std::fmt::Write;
@@ -7,7 +5,7 @@ use std::fs::File;
 use std::io::Write as _;
 use std::process::Command;
 
-use self::rand::Rng;
+use rand::Rng;
 
 use crate::*;
 
diff --git a/hercules_ir/src/fork_join_analysis.rs b/hercules_ir/src/fork_join_analysis.rs
index 5fe6b13221144e7c1dcbaa645d5446da5c8a2a06..130bc2ed49c637d28cc27cfd88c564222c680c12 100644
--- a/hercules_ir/src/fork_join_analysis.rs
+++ b/hercules_ir/src/fork_join_analysis.rs
@@ -1,8 +1,6 @@
-extern crate bitvec;
-
 use std::collections::{HashMap, HashSet};
 
-use self::bitvec::prelude::*;
+use bitvec::prelude::*;
 
 use crate::*;
 
diff --git a/hercules_ir/src/ir.rs b/hercules_ir/src/ir.rs
index 8bb8e4ef219f440c598ef3e07aeb7bf81dc178ef..3c5ed0bdfa9c6a7e7c9c55c9da16782ff5cc7cde 100644
--- a/hercules_ir/src/ir.rs
+++ b/hercules_ir/src/ir.rs
@@ -1,15 +1,12 @@
-extern crate bitvec;
-extern crate ordered_float;
-extern crate serde;
-
 use std::fmt::Write;
 use std::ops::Coroutine;
 use std::ops::CoroutineState;
 use std::pin::Pin;
 
-use self::bitvec::prelude::*;
-use self::serde::Deserialize;
-use self::serde::Serialize;
+use bitvec::prelude::*;
+use ordered_float::OrderedFloat;
+use serde::Deserialize;
+use serde::Serialize;
 
 use crate::*;
 
@@ -93,8 +90,8 @@ pub enum Constant {
     UnsignedInteger16(u16),
     UnsignedInteger32(u32),
     UnsignedInteger64(u64),
-    Float32(ordered_float::OrderedFloat<f32>),
-    Float64(ordered_float::OrderedFloat<f64>),
+    Float32(OrderedFloat<f32>),
+    Float64(OrderedFloat<f64>),
     Product(TypeID, Box<[ConstantID]>),
     Summation(TypeID, u32, ConstantID),
     // Array constants are always zero.
@@ -938,8 +935,8 @@ impl Constant {
             Constant::UnsignedInteger16(0) => true,
             Constant::UnsignedInteger32(0) => true,
             Constant::UnsignedInteger64(0) => true,
-            Constant::Float32(ord) => *ord == ordered_float::OrderedFloat::<f32>(0.0),
-            Constant::Float64(ord) => *ord == ordered_float::OrderedFloat::<f64>(0.0),
+            Constant::Float32(ord) => *ord == OrderedFloat::<f32>(0.0),
+            Constant::Float64(ord) => *ord == OrderedFloat::<f64>(0.0),
             _ => false,
         }
     }
@@ -954,8 +951,8 @@ impl Constant {
             Constant::UnsignedInteger16(1) => true,
             Constant::UnsignedInteger32(1) => true,
             Constant::UnsignedInteger64(1) => true,
-            Constant::Float32(ord) => *ord == ordered_float::OrderedFloat::<f32>(1.0),
-            Constant::Float64(ord) => *ord == ordered_float::OrderedFloat::<f64>(1.0),
+            Constant::Float32(ord) => *ord == OrderedFloat::<f32>(1.0),
+            Constant::Float64(ord) => *ord == OrderedFloat::<f64>(1.0),
             _ => false,
         }
     }
diff --git a/hercules_ir/src/loops.rs b/hercules_ir/src/loops.rs
index 3ab3313fa43570e118e9cb690b464df3cc01c5de..13e935e0dd151ba3a29c4d07c9f9ee50341d5091 100644
--- a/hercules_ir/src/loops.rs
+++ b/hercules_ir/src/loops.rs
@@ -1,10 +1,8 @@
-extern crate bitvec;
-
 use std::collections::hash_map;
 use std::collections::VecDeque;
 use std::collections::{HashMap, HashSet};
 
-use self::bitvec::prelude::*;
+use bitvec::prelude::*;
 
 use crate::*;
 
diff --git a/hercules_ir/src/parse.rs b/hercules_ir/src/parse.rs
index 5e4b12178d1782df47d2e5d36abffdb568311799..21eb325a530907bec0aa1f34788708da76453a54 100644
--- a/hercules_ir/src/parse.rs
+++ b/hercules_ir/src/parse.rs
@@ -1,5 +1,3 @@
-extern crate nom;
-
 use std::cell::RefCell;
 use std::collections::HashMap;
 use std::str::FromStr;
diff --git a/hercules_ir/src/subgraph.rs b/hercules_ir/src/subgraph.rs
index a4948016b57d5efaf0c64183c6e3c78141000bf8..908011d3198ee4fe982fdc7b7aa263c87f80e3c7 100644
--- a/hercules_ir/src/subgraph.rs
+++ b/hercules_ir/src/subgraph.rs
@@ -1,9 +1,7 @@
-extern crate bitvec;
-
 use std::collections::{HashMap, HashSet};
 use std::mem::take;
 
-use self::bitvec::prelude::*;
+use bitvec::prelude::*;
 
 use crate::*;
 
diff --git a/hercules_ir/src/verify.rs b/hercules_ir/src/verify.rs
index 18ad92c3271df9dd9bea3bc5881489dd84176c70..572bb9d11d3aca8efb5bd70b6b18781da83bc0e7 100644
--- a/hercules_ir/src/verify.rs
+++ b/hercules_ir/src/verify.rs
@@ -1,9 +1,7 @@
-extern crate bitvec;
-
 use std::collections::HashMap;
 use std::iter::zip;
 
-use self::bitvec::prelude::*;
+use bitvec::prelude::*;
 
 use crate::*;
 
diff --git a/hercules_opt/Cargo.toml b/hercules_opt/Cargo.toml
index e1936a97d4e717b06195188016b711735af6367b..20d734027965ff79c7a295596c63ad6b1688b0e8 100644
--- a/hercules_opt/Cargo.toml
+++ b/hercules_opt/Cargo.toml
@@ -2,6 +2,7 @@
 name = "hercules_opt"
 version = "0.1.0"
 authors = ["Russel Arbore <rarbore2@illinois.edu>, Aaron Councilman <aaronjc4@illinois.edu>"]
+edition = "2021"
 
 [dependencies]
 ordered-float = "*"
diff --git a/hercules_opt/src/ccp.rs b/hercules_opt/src/ccp.rs
index a66bf63345c6f951e7f6e7bb8abeba5bcabdf968..39fab9da391a4ee17618fb5b5f899e37138fce1f 100644
--- a/hercules_opt/src/ccp.rs
+++ b/hercules_opt/src/ccp.rs
@@ -1,12 +1,10 @@
-extern crate hercules_ir;
-
 use std::cmp::{max, min};
 use std::collections::HashSet;
 use std::iter::zip;
 
-use self::hercules_ir::dataflow::*;
-use self::hercules_ir::def_use::get_uses;
-use self::hercules_ir::ir::*;
+use hercules_ir::dataflow::*;
+use hercules_ir::def_use::get_uses;
+use hercules_ir::ir::*;
 
 use crate::*;
 
@@ -415,8 +413,8 @@ fn ccp_flow_function(
         }),
         // If node has only one output, if doesn't directly handle crossover of
         // reachability and constant propagation. Read handles that.
-        Node::If { control, cond } => inputs[control.idx()].clone(),
-        Node::Match { control, sum } => inputs[control.idx()].clone(),
+        Node::If { control, cond: _ } => inputs[control.idx()].clone(),
+        Node::Match { control, sum: _ } => inputs[control.idx()].clone(),
         Node::Fork {
             control,
             factors: _,
diff --git a/hercules_opt/src/dce.rs b/hercules_opt/src/dce.rs
index 839e9ad1e5c586c56c9c0d697b3267e6dc6a5abe..026672a395d783c0abd5257894c4c32335654371 100644
--- a/hercules_opt/src/dce.rs
+++ b/hercules_opt/src/dce.rs
@@ -1,7 +1,5 @@
-extern crate hercules_ir;
-
-use self::hercules_ir::def_use::*;
-use self::hercules_ir::ir::*;
+use hercules_ir::def_use::*;
+use hercules_ir::ir::*;
 
 use crate::*;
 
diff --git a/hercules_opt/src/delete_uncalled.rs b/hercules_opt/src/delete_uncalled.rs
index 78ab428526971f121e0a2bc582e55b423395730b..1a19ee010e4772b8a2367b928f8226109dbef32c 100644
--- a/hercules_opt/src/delete_uncalled.rs
+++ b/hercules_opt/src/delete_uncalled.rs
@@ -1,9 +1,7 @@
-extern crate bitvec;
-extern crate hercules_ir;
-use self::bitvec::prelude::*;
+use bitvec::prelude::*;
 
-use self::hercules_ir::callgraph::*;
-use self::hercules_ir::ir::*;
+use hercules_ir::callgraph::*;
+use hercules_ir::ir::*;
 
 use crate::*;
 
diff --git a/hercules_opt/src/editor.rs b/hercules_opt/src/editor.rs
index 313596514216257797ea3aa0cd17af332f37cbf2..1318f032e0ac8a02c0375ae2de56311f0d97306a 100644
--- a/hercules_opt/src/editor.rs
+++ b/hercules_opt/src/editor.rs
@@ -1,18 +1,13 @@
-extern crate bitvec;
-extern crate either;
-extern crate hercules_ir;
-extern crate itertools;
-
 use std::cell::{Ref, RefCell};
 use std::collections::{BTreeMap, HashSet};
 use std::mem::take;
 use std::ops::Deref;
 
-use self::bitvec::prelude::*;
-use self::either::Either;
+use bitvec::prelude::*;
+use either::Either;
 
-use self::hercules_ir::def_use::*;
-use self::hercules_ir::ir::*;
+use hercules_ir::def_use::*;
+use hercules_ir::ir::*;
 
 /*
  * Helper object for editing Hercules functions in a trackable manner. Edits
@@ -125,7 +120,7 @@ impl<'a: 'b, 'b> FunctionEditor<'a> {
             let FunctionEdit {
                 editor,
                 deleted_nodeids,
-                added_nodeids,
+                added_nodeids: _,
                 added_and_updated_nodes,
                 added_and_updated_schedules,
                 added_constants,
@@ -604,8 +599,8 @@ mod editor_tests {
 
     use std::mem::replace;
 
-    use self::hercules_ir::dataflow::reverse_postorder;
-    use self::hercules_ir::parse::parse;
+    use hercules_ir::dataflow::reverse_postorder;
+    use hercules_ir::parse::parse;
 
     fn canonicalize(function: &mut Function) -> Vec<Option<NodeID>> {
         // The reverse postorder traversal from the Start node is a map from new
diff --git a/hercules_opt/src/float_collections.rs b/hercules_opt/src/float_collections.rs
index 30df387598395f9182fd123024d14240510ce73a..faa38375f68e93fad04b632c2f2e5491403a6a3e 100644
--- a/hercules_opt/src/float_collections.rs
+++ b/hercules_opt/src/float_collections.rs
@@ -1,6 +1,4 @@
-extern crate hercules_ir;
-
-use self::hercules_ir::*;
+use hercules_ir::*;
 
 use crate::*;
 
diff --git a/hercules_opt/src/fork_concat_split.rs b/hercules_opt/src/fork_concat_split.rs
index 232b43f70374427842b425f912928d316535d886..186cd6a6eaad70ba4b26e25dee8714c7988ee611 100644
--- a/hercules_opt/src/fork_concat_split.rs
+++ b/hercules_opt/src/fork_concat_split.rs
@@ -1,9 +1,7 @@
-extern crate hercules_ir;
-
 use std::collections::{HashMap, HashSet};
 use std::iter::zip;
 
-use self::hercules_ir::ir::*;
+use hercules_ir::ir::*;
 
 use crate::*;
 
diff --git a/hercules_opt/src/fork_guard_elim.rs b/hercules_opt/src/fork_guard_elim.rs
index cfa2a6ff344f5641a28d01b7b1fa44feb480b03e..842c83086f9ecedbbe5c8c96bf160de8968a953a 100644
--- a/hercules_opt/src/fork_guard_elim.rs
+++ b/hercules_opt/src/fork_guard_elim.rs
@@ -1,10 +1,8 @@
-extern crate hercules_ir;
-
 use std::collections::{HashMap, HashSet};
 
-use self::hercules_ir::get_uses_mut;
-use self::hercules_ir::ir::*;
-use self::hercules_ir::ImmutableDefUseMap;
+use hercules_ir::get_uses_mut;
+use hercules_ir::ir::*;
+use hercules_ir::ImmutableDefUseMap;
 
 /*
  * This is a Hercules IR transformation that:
diff --git a/hercules_opt/src/forkify.rs b/hercules_opt/src/forkify.rs
index e32bef383a077d6444bf3f3817c4adbe96fee78b..fb53a5e4a84bb08da7606aea914d368878c94b41 100644
--- a/hercules_opt/src/forkify.rs
+++ b/hercules_opt/src/forkify.rs
@@ -1,10 +1,8 @@
-extern crate hercules_ir;
-
 use std::iter::zip;
 
-use self::hercules_ir::def_use::*;
-use self::hercules_ir::ir::*;
-use self::hercules_ir::loops::*;
+use hercules_ir::def_use::*;
+use hercules_ir::ir::*;
+use hercules_ir::loops::*;
 
 /*
  * Top level function to convert natural loops with simple induction variables
diff --git a/hercules_opt/src/gcm.rs b/hercules_opt/src/gcm.rs
index 76ce3fdfeced77b5663dc99cd76049ba13e1172c..a7df9bd9c8409daf4daa004dcd2b29a3ec2660c8 100644
--- a/hercules_opt/src/gcm.rs
+++ b/hercules_opt/src/gcm.rs
@@ -1,16 +1,11 @@
-extern crate bitvec;
-extern crate either;
-extern crate hercules_cg;
-extern crate hercules_ir;
-
 use std::collections::{BTreeMap, BTreeSet, HashMap, VecDeque};
 use std::iter::{empty, once, zip, FromIterator};
 
-use self::bitvec::prelude::*;
-use self::either::Either;
+use bitvec::prelude::*;
+use either::Either;
 
-use self::hercules_cg::*;
-use self::hercules_ir::*;
+use hercules_cg::*;
+use hercules_ir::*;
 
 use crate::*;
 
@@ -59,7 +54,6 @@ pub fn gcm(
         editor.func_id(),
         def_use,
         reverse_postorder,
-        control_subgraph,
         dom,
         loops,
         fork_join_map,
@@ -86,7 +80,6 @@ fn basic_blocks(
     func_id: FunctionID,
     def_use: &ImmutableDefUseMap,
     reverse_postorder: &Vec<NodeID>,
-    control_subgraph: &Subgraph,
     dom: &DomTree,
     loops: &LoopTree,
     fork_join_map: &HashMap<NodeID, NodeID>,
diff --git a/hercules_opt/src/gvn.rs b/hercules_opt/src/gvn.rs
index 69ed8e4af75a318d22a14bbbd0b48d298ff62bdf..42835e853c36a994f656a16e1662e8837fd55239 100644
--- a/hercules_opt/src/gvn.rs
+++ b/hercules_opt/src/gvn.rs
@@ -1,8 +1,6 @@
-extern crate hercules_ir;
-
 use std::collections::HashMap;
 
-use self::hercules_ir::ir::*;
+use hercules_ir::ir::*;
 
 use crate::*;
 
diff --git a/hercules_opt/src/inline.rs b/hercules_opt/src/inline.rs
index 9ab158742d140448c6aadead23cd237e7f7be1c9..63a05b0c10bd4efca7da76ceb21969b118770e53 100644
--- a/hercules_opt/src/inline.rs
+++ b/hercules_opt/src/inline.rs
@@ -1,11 +1,9 @@
-extern crate hercules_ir;
-
 use std::collections::HashMap;
 use std::iter::zip;
 
-use self::hercules_ir::callgraph::*;
-use self::hercules_ir::def_use::*;
-use self::hercules_ir::ir::*;
+use hercules_ir::callgraph::*;
+use hercules_ir::def_use::*;
+use hercules_ir::ir::*;
 
 use crate::*;
 
diff --git a/hercules_opt/src/interprocedural_sroa.rs b/hercules_opt/src/interprocedural_sroa.rs
index c6cf448b0615cac528bbbff055d91c4bd0d371d6..9edb4d02134e4c5c05aaf398cddbd7bb19686625 100644
--- a/hercules_opt/src/interprocedural_sroa.rs
+++ b/hercules_opt/src/interprocedural_sroa.rs
@@ -1,9 +1,9 @@
-extern crate hercules_ir;
 use std::collections::HashMap;
+use std::iter::zip;
+
+use hercules_ir::ir::*;
 
-use self::hercules_ir::ir::*;
 use crate::*;
-use std::iter::zip;
 
 /**
  * Given an editor for each function in a module, return V s.t.
diff --git a/hercules_opt/src/outline.rs b/hercules_opt/src/outline.rs
index 239838334801c7048a3bcaaad0cd626f2c9d0dea..80f97c7f079ad57bb1edb0929dfe56578eae338c 100644
--- a/hercules_opt/src/outline.rs
+++ b/hercules_opt/src/outline.rs
@@ -1,14 +1,12 @@
-extern crate hercules_ir;
-
 use std::collections::{BTreeMap, BTreeSet};
 use std::iter::zip;
 use std::sync::atomic::{AtomicUsize, Ordering};
 
-use self::hercules_ir::def_use::*;
-use self::hercules_ir::dom::*;
-use self::hercules_ir::fork_join_analysis::*;
-use self::hercules_ir::ir::*;
-use self::hercules_ir::subgraph::*;
+use hercules_ir::def_use::*;
+use hercules_ir::dom::*;
+use hercules_ir::fork_join_analysis::*;
+use hercules_ir::ir::*;
+use hercules_ir::subgraph::*;
 
 use crate::*;
 
diff --git a/hercules_opt/src/pass.rs b/hercules_opt/src/pass.rs
index 57fd464de82a36cab4c2d7c3758bd43b3d13eae3..7685d3045a6b58101efee699a5691269cc56449f 100644
--- a/hercules_opt/src/pass.rs
+++ b/hercules_opt/src/pass.rs
@@ -1,9 +1,3 @@
-extern crate hercules_cg;
-extern crate hercules_ir;
-extern crate postcard;
-extern crate serde;
-extern crate take_mut;
-
 use std::cell::RefCell;
 use std::collections::{HashMap, HashSet};
 use std::env::temp_dir;
@@ -12,10 +6,10 @@ use std::io::Write;
 use std::iter::zip;
 use std::process::{Command, Stdio};
 
-use self::serde::Deserialize;
+use serde::Deserialize;
 
-use self::hercules_cg::*;
-use self::hercules_ir::*;
+use hercules_cg::*;
+use hercules_ir::*;
 
 use crate::*;
 
@@ -920,12 +914,10 @@ impl PassManager {
                     );
                 }
                 Pass::Codegen(output_dir, module_name) => {
-                    self.make_reverse_postorders();
                     self.make_typing();
                     self.make_control_subgraphs();
                     self.make_collection_objects();
                     self.make_callgraph();
-                    let reverse_postorders = self.reverse_postorders.as_ref().unwrap();
                     let typing = self.typing.as_ref().unwrap();
                     let control_subgraphs = self.control_subgraphs.as_ref().unwrap();
                     let bbs = self.bbs.as_ref().unwrap();
@@ -943,7 +935,6 @@ impl PassManager {
                                 &self.module.types,
                                 &self.module.constants,
                                 &self.module.dynamic_constants,
-                                &reverse_postorders[idx],
                                 &typing[idx],
                                 &control_subgraphs[idx],
                                 &bbs[idx],
@@ -953,7 +944,6 @@ impl PassManager {
                             Device::AsyncRust => rt_codegen(
                                 FunctionID::new(idx),
                                 &self.module,
-                                &reverse_postorders[idx],
                                 &typing[idx],
                                 &control_subgraphs[idx],
                                 &bbs[idx],
@@ -972,14 +962,15 @@ impl PassManager {
                     // Write the LLVM IR into a temporary file.
                     let mut tmp_path = temp_dir();
                     tmp_path.push(format!("{}.ll", module_name));
+                    println!("{}", tmp_path.display());
                     let mut file = File::create(&tmp_path)
                         .expect("PANIC: Unable to open output LLVM IR file.");
                     file.write_all(llvm_ir.as_bytes())
                         .expect("PANIC: Unable to write output LLVM IR file contents.");
-                    println!("{}", tmp_path.display());
 
                     // Compile LLVM IR into an ELF object file.
                     let output_archive = format!("{}/lib{}.a", output_dir, module_name);
+                    println!("{}", output_archive);
                     let mut clang_process = Command::new("clang")
                         .arg(&tmp_path)
                         .arg("--emit-static-lib")
@@ -992,15 +983,14 @@ impl PassManager {
                         .spawn()
                         .expect("Error running clang. Is it installed?");
                     assert!(clang_process.wait().unwrap().success());
-                    println!("{}", output_archive);
 
                     // Write the Rust runtime into a file.
                     let output_rt = format!("{}/rt_{}.hrt", output_dir, module_name);
+                    println!("{}", output_rt);
                     let mut file = File::create(&output_rt)
                         .expect("PANIC: Unable to open output Rust runtime file.");
                     file.write_all(rust_rt.as_bytes())
                         .expect("PANIC: Unable to write output Rust runtime file contents.");
-                    println!("{}", output_rt);
                 }
                 Pass::Serialize(output_file) => {
                     let module_contents: Vec<u8> = postcard::to_allocvec(&self.module).unwrap();
diff --git a/hercules_opt/src/phi_elim.rs b/hercules_opt/src/phi_elim.rs
index 2788e56a9199d20997e1272fe495e45048d91767..a79b43d3ca6a6b7fa85f09127ce53ba70b0063be 100644
--- a/hercules_opt/src/phi_elim.rs
+++ b/hercules_opt/src/phi_elim.rs
@@ -1,12 +1,9 @@
-extern crate bitvec;
-extern crate hercules_ir;
-
 use std::collections::VecDeque;
 use std::iter::FromIterator;
 
-use self::bitvec::prelude::*;
+use bitvec::prelude::*;
 
-use self::hercules_ir::ir::*;
+use hercules_ir::ir::*;
 
 use crate::*;
 
diff --git a/hercules_opt/src/pred.rs b/hercules_opt/src/pred.rs
index 09d9753d0c09a561483c733eb87415beda435944..be1b4a0bb77e3ab225f495577eae9d6a24e52561 100644
--- a/hercules_opt/src/pred.rs
+++ b/hercules_opt/src/pred.rs
@@ -1,15 +1,12 @@
-extern crate bitvec;
-extern crate hercules_ir;
-
 use std::collections::HashMap;
 use std::collections::HashSet;
 use std::collections::VecDeque;
 
-use self::bitvec::prelude::*;
+use bitvec::prelude::*;
 
-use self::hercules_ir::def_use::*;
-use self::hercules_ir::dom::*;
-use self::hercules_ir::ir::*;
+use hercules_ir::def_use::*;
+use hercules_ir::dom::*;
+use hercules_ir::ir::*;
 
 /*
  * Top level function to convert acyclic control flow in vectorized fork-joins
diff --git a/hercules_opt/src/schedule.rs b/hercules_opt/src/schedule.rs
index ff895b1651b298cc59a8b0afbd921da2aaf04f82..2c8209aae002beffca3c8f7ee40d6986fed49fb0 100644
--- a/hercules_opt/src/schedule.rs
+++ b/hercules_opt/src/schedule.rs
@@ -1,9 +1,7 @@
-extern crate hercules_ir;
-
 use std::collections::{HashMap, HashSet};
 
-use self::hercules_ir::def_use::*;
-use self::hercules_ir::ir::*;
+use hercules_ir::def_use::*;
+use hercules_ir::ir::*;
 
 use crate::*;
 
diff --git a/hercules_opt/src/sroa.rs b/hercules_opt/src/sroa.rs
index a73ecb2b42ef42c94f3e97faa8d777a7040cc6f4..6461ad717d5b7cbeac0e237916d11d4a3a4ae6d6 100644
--- a/hercules_opt/src/sroa.rs
+++ b/hercules_opt/src/sroa.rs
@@ -1,8 +1,6 @@
-extern crate hercules_ir;
-
 use std::collections::{BTreeMap, HashMap, VecDeque};
 
-use self::hercules_ir::ir::*;
+use hercules_ir::ir::*;
 
 use crate::*;
 
diff --git a/hercules_opt/src/unforkify.rs b/hercules_opt/src/unforkify.rs
index 61c86a276c6f71be3790ec1d9342d6b364d020c4..a5df7a7c404e820a92d27842211dd0e3396dae41 100644
--- a/hercules_opt/src/unforkify.rs
+++ b/hercules_opt/src/unforkify.rs
@@ -1,9 +1,7 @@
-extern crate hercules_ir;
-
 use std::collections::HashMap;
 use std::iter::zip;
 
-use self::hercules_ir::ir::*;
+use hercules_ir::ir::*;
 
 use crate::*;
 
diff --git a/hercules_opt/src/utils.rs b/hercules_opt/src/utils.rs
index c32225b50bd1d02500ad210171cde0a58d67b17e..77fa1ff6525c575414b94e12905502b257ac1a12 100644
--- a/hercules_opt/src/utils.rs
+++ b/hercules_opt/src/utils.rs
@@ -1,7 +1,5 @@
-extern crate hercules_ir;
-
-use self::hercules_ir::def_use::*;
-use self::hercules_ir::ir::*;
+use hercules_ir::def_use::*;
+use hercules_ir::ir::*;
 
 use crate::*;
 
diff --git a/hercules_rt/Cargo.toml b/hercules_rt/Cargo.toml
index 0bf19adf352512e3bd5639015e62c38e13670f85..7201f41127a8a307b1df6a361743da889a2b49b8 100644
--- a/hercules_rt/Cargo.toml
+++ b/hercules_rt/Cargo.toml
@@ -2,6 +2,7 @@
 name = "hercules_rt"
 version = "0.1.0"
 authors = ["Russel Arbore <rarbore2@illinois.edu>"]
+edition = "2021"
 
 [dependencies]
 
diff --git a/hercules_samples/call/build.rs b/hercules_samples/call/build.rs
index dbefe008a14e57785261e2757bb0e0dbbb5fa27c..af48fe64f7c2b778c9841e45ecf13b8a6a5740d2 100644
--- a/hercules_samples/call/build.rs
+++ b/hercules_samples/call/build.rs
@@ -1,4 +1,3 @@
-extern crate juno_build;
 use juno_build::JunoCompiler;
 
 fn main() {
diff --git a/hercules_samples/call/src/main.rs b/hercules_samples/call/src/main.rs
index b5c999fdac3738f6d3fced2164fbf9320d5a1034..0b657dd81e7ade1491f3c6c51fdd9a9f0abb5d57 100644
--- a/hercules_samples/call/src/main.rs
+++ b/hercules_samples/call/src/main.rs
@@ -1,8 +1,5 @@
 #![feature(box_as_ptr, let_chains)]
 
-extern crate async_std;
-extern crate juno_build;
-
 juno_build::juno!("call");
 
 fn main() {
diff --git a/hercules_samples/ccp/build.rs b/hercules_samples/ccp/build.rs
index 650b51b8b14715579de164f7fc65330e113613a1..f04d48c7d0ea6df8b16d70b05cedabfc04c1f6f2 100644
--- a/hercules_samples/ccp/build.rs
+++ b/hercules_samples/ccp/build.rs
@@ -1,4 +1,3 @@
-extern crate juno_build;
 use juno_build::JunoCompiler;
 
 fn main() {
diff --git a/hercules_samples/ccp/src/main.rs b/hercules_samples/ccp/src/main.rs
index 9e2aced90044d1af68e6a47f9205ee1a21a69328..7f6459a0c3593c38794d5534ac7af41e404db8c1 100644
--- a/hercules_samples/ccp/src/main.rs
+++ b/hercules_samples/ccp/src/main.rs
@@ -1,8 +1,5 @@
 #![feature(box_as_ptr, let_chains)]
 
-extern crate async_std;
-extern crate juno_build;
-
 juno_build::juno!("ccp");
 
 fn main() {
diff --git a/hercules_samples/dot/build.rs b/hercules_samples/dot/build.rs
index cfa03fd3b989748fe530071f289fb31f036283b4..2a239bc6c3ebd3780cb15358375c59bdfb2e25ae 100644
--- a/hercules_samples/dot/build.rs
+++ b/hercules_samples/dot/build.rs
@@ -1,4 +1,3 @@
-extern crate juno_build;
 use juno_build::JunoCompiler;
 
 fn main() {
diff --git a/hercules_samples/dot/src/main.rs b/hercules_samples/dot/src/main.rs
index 34d397ef12c0d6eed2f6acf7c9f4da780412242f..0b5c6a93c3527d4c6863c48956f1d10947bdb017 100644
--- a/hercules_samples/dot/src/main.rs
+++ b/hercules_samples/dot/src/main.rs
@@ -1,9 +1,5 @@
 #![feature(box_as_ptr, let_chains)]
 
-extern crate async_std;
-extern crate hercules_rt;
-extern crate juno_build;
-
 use hercules_rt::HerculesBox;
 
 juno_build::juno!("dot");
diff --git a/hercules_samples/fac/build.rs b/hercules_samples/fac/build.rs
index 49a6024828516f994522e66bf1de1d714f63e75b..4d8226f11183d9500e6affec4c46110e8626ee69 100644
--- a/hercules_samples/fac/build.rs
+++ b/hercules_samples/fac/build.rs
@@ -1,4 +1,3 @@
-extern crate juno_build;
 use juno_build::JunoCompiler;
 
 fn main() {
diff --git a/hercules_samples/fac/src/main.rs b/hercules_samples/fac/src/main.rs
index 7071fd2c115bba1d6ff60fae688b262354d4fc71..b6e0257b0be48e39555050194be6d29459c3c765 100644
--- a/hercules_samples/fac/src/main.rs
+++ b/hercules_samples/fac/src/main.rs
@@ -1,7 +1,3 @@
-extern crate async_std;
-extern crate clap;
-extern crate juno_build;
-
 juno_build::juno!("fac");
 
 fn main() {
diff --git a/hercules_samples/matmul/build.rs b/hercules_samples/matmul/build.rs
index ec6eb892326c5d6eb341c89239b0465de0cf4a49..08478deaac459d9a94f79fdabce37da9a1205f89 100644
--- a/hercules_samples/matmul/build.rs
+++ b/hercules_samples/matmul/build.rs
@@ -1,4 +1,3 @@
-extern crate juno_build;
 use juno_build::JunoCompiler;
 
 fn main() {
diff --git a/hercules_samples/matmul/src/main.rs b/hercules_samples/matmul/src/main.rs
index 34612801b4d27c456251cda01550c7cbd0700ebf..587109f88336f987450b24d1eb3c972fd58da2e3 100644
--- a/hercules_samples/matmul/src/main.rs
+++ b/hercules_samples/matmul/src/main.rs
@@ -1,10 +1,5 @@
 #![feature(box_as_ptr, let_chains)]
 
-extern crate async_std;
-extern crate hercules_rt;
-extern crate juno_build;
-extern crate rand;
-
 use rand::random;
 
 use hercules_rt::HerculesBox;
diff --git a/hercules_test/hercules_interpreter/src/interpreter.rs b/hercules_test/hercules_interpreter/src/interpreter.rs
index a166427fe062f90577f1b29b193cc08e02e01193..621260e5a25597e3dedcc279348e0be7c1fb9472 100644
--- a/hercules_test/hercules_interpreter/src/interpreter.rs
+++ b/hercules_test/hercules_interpreter/src/interpreter.rs
@@ -1,19 +1,14 @@
-extern crate itertools;
-extern crate ordered_float;
 
-use crate::value;
-
-use self::itertools::Itertools;
 use std::collections::HashMap;
 use std::panic;
 use std::collections::hash_map::Entry::Occupied;
 
-use value::*;
+use itertools::Itertools;
 
-extern crate hercules_ir;
-extern crate hercules_opt;
+use hercules_ir::*;
 
-use self::hercules_ir::*;
+use crate::value;
+use value::*;
 
 /* High level design details / discussion for this:
  *
diff --git a/hercules_test/hercules_interpreter/src/main.rs b/hercules_test/hercules_interpreter/src/main.rs
index 4d2ebd31853aedf36fb5871e62af9422f49b3c0f..5db31cd730fe802dd9ccbf1b8e0d603c736fb196 100644
--- a/hercules_test/hercules_interpreter/src/main.rs
+++ b/hercules_test/hercules_interpreter/src/main.rs
@@ -1,18 +1,13 @@
-extern crate clap;
-extern crate hercules_ir;
-extern crate hercules_opt;
-extern crate rand;
+use std::fs::File;
+use std::io::prelude::*;
 
+use clap::Parser;
+
+use hercules_ir::*;
 
 use hercules_interpreter::interpreter::*;
 use hercules_interpreter::*;
 use hercules_interpreter::value;
-use std::fs::File;
-use std::io::prelude::*;
-
-use self::hercules_ir::*;
-
-use clap::Parser;
 
 #[derive(Parser, Debug)]
 #[command(author, version, about, long_about = None)]
diff --git a/hercules_test/hercules_interpreter/src/value.rs b/hercules_test/hercules_interpreter/src/value.rs
index d236145c00e1bfd63a1b45ff5bebad93398062ea..e032bd5b711a713c55c6cd911c99e327ff1d2e0b 100644
--- a/hercules_test/hercules_interpreter/src/value.rs
+++ b/hercules_test/hercules_interpreter/src/value.rs
@@ -1,23 +1,18 @@
 #![allow(unused)]
 
-extern crate derive_more;
 use derive_more::From;
 
 /* Defines semantic meaning of IR operations. */
-extern crate itertools;
 
 use crate::dyn_const_value;
 
-use self::itertools::Itertools;
+use itertools::Itertools;
 use std::clone;
 use std::convert::TryInto;
 use std::panic;
 
-extern crate hercules_ir;
-extern crate hercules_opt;
-
-use self::hercules_ir::*;
-use self::hercules_opt::*;
+use hercules_ir::*;
+use hercules_opt::*;
 
 #[derive(PartialEq, Debug, Clone, Eq)]
 pub enum InterpreterVal {
diff --git a/hercules_test/hercules_tests/tests/opt_tests.rs b/hercules_test/hercules_tests/tests/opt_tests.rs
index c14d4db5b0072ec0f724cdde9b467c7568e1b41c..388dfeddf38eecab3ffb191a344682395e71d5cd 100644
--- a/hercules_test/hercules_tests/tests/opt_tests.rs
+++ b/hercules_test/hercules_tests/tests/opt_tests.rs
@@ -1,11 +1,10 @@
 use std::env;
 
+use rand::Rng;
+
 use hercules_interpreter::*;
 use hercules_opt::pass::Pass;
 
-extern crate rand;
-use rand::Rng;
-
 #[test]
 fn matmul_int() {
     let module = parse_file("../test_inputs/matmul_int.hir");
@@ -198,4 +197,4 @@ fn sum_int2_smaller() {
         Pass::DCE,
     ],
     vec![1; 100]);
-}
\ No newline at end of file
+}
diff --git a/hercules_tools/hercules_driver/Cargo.toml b/hercules_tools/hercules_driver/Cargo.toml
index 9236c34a948e61e962f2fddc3d23a4fd72cfaee6..ad9397b140052539a341084646d5f7fde1cbafff 100644
--- a/hercules_tools/hercules_driver/Cargo.toml
+++ b/hercules_tools/hercules_driver/Cargo.toml
@@ -2,6 +2,7 @@
 name = "hercules_driver"
 version = "0.1.0"
 authors = ["Russel Arbore <rarbore2@illinois.edu>"]
+edition = "2021"
 
 [dependencies]
 clap = { version = "*", features = ["derive"] }
diff --git a/hercules_tools/hercules_driver/src/main.rs b/hercules_tools/hercules_driver/src/main.rs
index 97c9fe2ef9f03c87f50d079d4b1aabad371b894f..a2550022129029387664fb4327528d09078c2e02 100644
--- a/hercules_tools/hercules_driver/src/main.rs
+++ b/hercules_tools/hercules_driver/src/main.rs
@@ -1,6 +1,3 @@
-extern crate clap;
-extern crate postcard;
-
 use std::fs::File;
 use std::io::prelude::*;
 use std::path::Path;
diff --git a/juno_build/src/lib.rs b/juno_build/src/lib.rs
index fdaf4d27cbcb7b31738e6df42d69272369d5026f..0c676e4c1b203c53e98a8430e0f2354104540e07 100644
--- a/juno_build/src/lib.rs
+++ b/juno_build/src/lib.rs
@@ -1,5 +1,3 @@
-extern crate hercules_ir;
-
 use juno_compiler::*;
 
 use std::env::{current_dir, var};
diff --git a/juno_frontend/src/lib.rs b/juno_frontend/src/lib.rs
index 9297173d4deededf8b541dfc821e1b88dd68841d..906d780560626d7aff1716b4d159aa82d76a7df5 100644
--- a/juno_frontend/src/lib.rs
+++ b/juno_frontend/src/lib.rs
@@ -9,8 +9,6 @@ mod semant;
 mod ssa;
 mod types;
 
-extern crate hercules_ir;
-
 use std::fmt;
 use std::path::Path;
 
diff --git a/juno_frontend/src/main.rs b/juno_frontend/src/main.rs
index 4624e7160d242b064fdae85e7eba889e752fff75..d98c1e29e5aedeac5ce2a4e791c669a7af34c320 100644
--- a/juno_frontend/src/main.rs
+++ b/juno_frontend/src/main.rs
@@ -1,5 +1,3 @@
-extern crate clap;
-
 use juno_compiler::*;
 
 use clap::{ArgGroup, Parser};
diff --git a/juno_frontend/src/semant.rs b/juno_frontend/src/semant.rs
index 1ccdf3ed80b33deab7fe51c51cf44c118f4c4518..660d8afe35a803e7395d67871236e0f596b09a87 100644
--- a/juno_frontend/src/semant.rs
+++ b/juno_frontend/src/semant.rs
@@ -1,5 +1,3 @@
-extern crate hercules_ir;
-
 use std::collections::{HashMap, LinkedList};
 use std::fmt;
 use std::fs::File;
diff --git a/juno_frontend/src/ssa.rs b/juno_frontend/src/ssa.rs
index f5e1d8302d8a407e2a6e1b6d89cc9b62d4e5c40e..578f7a9af120644d265d5c5b679fb97b35806d36 100644
--- a/juno_frontend/src/ssa.rs
+++ b/juno_frontend/src/ssa.rs
@@ -4,12 +4,11 @@
  *  Compiler Construction. CC 2013. Lecture Notes in Computer Science, vol 7791. Springer, Berlin,
  *  Heidelberg. https://doi.org/10.1007/978-3-642-37051-9_6
  */
-extern crate hercules_ir;
 
 use std::collections::{HashMap, HashSet};
 
-use self::hercules_ir::build::*;
-use self::hercules_ir::ir::*;
+use hercules_ir::build::*;
+use hercules_ir::ir::*;
 use crate::labeled_builder::LabeledBuilder;
 
 pub struct SSA {
diff --git a/juno_frontend/src/types.rs b/juno_frontend/src/types.rs
index 582e7cfddb87cc47e467662d52e87029319e99ad..5f907cd9370a343eb501e0c4b5b1dcef2a55f651 100644
--- a/juno_frontend/src/types.rs
+++ b/juno_frontend/src/types.rs
@@ -1,11 +1,12 @@
 use std::collections::{HashMap, HashSet, VecDeque};
 
 use crate::dynconst::DynConst;
-use crate::hercules_ir::build::*;
-use crate::hercules_ir::ir::*;
 use crate::locs::Location;
 use crate::parser;
 
+use hercules_ir::build::*;
+use hercules_ir::ir::*;
+
 #[derive(Copy, Clone, PartialEq, Eq, Debug)]
 pub enum Either<A, B> {
     Left(A),
diff --git a/juno_samples/antideps/build.rs b/juno_samples/antideps/build.rs
index 757243b829c3f805f8d87d38676e72e2b532f072..7ed716a444460d7a90965f5b7f5faf3a7aadcb14 100644
--- a/juno_samples/antideps/build.rs
+++ b/juno_samples/antideps/build.rs
@@ -1,4 +1,3 @@
-extern crate juno_build;
 use juno_build::JunoCompiler;
 
 fn main() {
diff --git a/juno_samples/antideps/src/main.rs b/juno_samples/antideps/src/main.rs
index a9c225b21bb7a8f3693f124471989fc9d4ebe23c..0b065cbaa6e6cffcaf9ff7b3fbc5a2c882dc7248 100644
--- a/juno_samples/antideps/src/main.rs
+++ b/juno_samples/antideps/src/main.rs
@@ -1,8 +1,5 @@
 #![feature(future_join, box_as_ptr)]
 
-extern crate async_std;
-extern crate juno_build;
-
 juno_build::juno!("antideps");
 
 fn main() {
diff --git a/juno_samples/casts_and_intrinsics/build.rs b/juno_samples/casts_and_intrinsics/build.rs
index fafa97bbc642751c37b2ef47a43954fa84f340d9..16d5c7a4f7fcb00344fc7669b67103a27f71a7c6 100644
--- a/juno_samples/casts_and_intrinsics/build.rs
+++ b/juno_samples/casts_and_intrinsics/build.rs
@@ -1,4 +1,3 @@
-extern crate juno_build;
 use juno_build::JunoCompiler;
 
 fn main() {
diff --git a/juno_samples/casts_and_intrinsics/src/main.rs b/juno_samples/casts_and_intrinsics/src/main.rs
index 037d4c4025ca141887034353124436a2db8f84f3..8ee509bfb401aca4bd42751c0fe34beee94c7324 100644
--- a/juno_samples/casts_and_intrinsics/src/main.rs
+++ b/juno_samples/casts_and_intrinsics/src/main.rs
@@ -1,8 +1,5 @@
 #![feature(future_join)]
 
-extern crate async_std;
-extern crate juno_build;
-
 juno_build::juno!("casts_and_intrinsics");
 
 fn main() {
diff --git a/juno_samples/implicit_clone/build.rs b/juno_samples/implicit_clone/build.rs
index 3378966b64a71a239178edc6a010f9081939f58a..75c1afc41a75b2006b26042323df3bdc3fcf5a17 100644
--- a/juno_samples/implicit_clone/build.rs
+++ b/juno_samples/implicit_clone/build.rs
@@ -1,4 +1,3 @@
-extern crate juno_build;
 use juno_build::JunoCompiler;
 
 fn main() {
diff --git a/juno_samples/implicit_clone/src/main.rs b/juno_samples/implicit_clone/src/main.rs
index a92e4e2d7558733b28db0bba203415a73631ab6d..bc687ed386f091e674c5eb81122adf30c06f8da9 100644
--- a/juno_samples/implicit_clone/src/main.rs
+++ b/juno_samples/implicit_clone/src/main.rs
@@ -1,8 +1,5 @@
 #![feature(future_join, box_as_ptr)]
 
-extern crate async_std;
-extern crate juno_build;
-
 juno_build::juno!("implicit_clone");
 
 fn main() {
diff --git a/juno_samples/matmul/build.rs b/juno_samples/matmul/build.rs
index 81f645e0666dfb22e075953c3d0a1a531909f1a0..926fbc33ecfa5ab31b40a92f778bb4d3b7f6a77e 100644
--- a/juno_samples/matmul/build.rs
+++ b/juno_samples/matmul/build.rs
@@ -1,4 +1,3 @@
-extern crate juno_build;
 use juno_build::JunoCompiler;
 
 fn main() {
diff --git a/juno_samples/matmul/src/main.rs b/juno_samples/matmul/src/main.rs
index 11066e8bf4762247a50881ccdd3dfeea8fae9fea..e6fb25436b2f7d901a475c726face0b28017bc1b 100644
--- a/juno_samples/matmul/src/main.rs
+++ b/juno_samples/matmul/src/main.rs
@@ -1,10 +1,5 @@
 #![feature(box_as_ptr, let_chains)]
 
-extern crate async_std;
-extern crate hercules_rt;
-extern crate juno_build;
-extern crate rand;
-
 use rand::random;
 
 use hercules_rt::HerculesBox;
diff --git a/juno_samples/nested_ccp/build.rs b/juno_samples/nested_ccp/build.rs
index 0fb54be347f011f4c29f1d7df98a0f29c85193c6..c5c7ca6a1b9ab5decf6a8cf0b8e8f13ff7122834 100644
--- a/juno_samples/nested_ccp/build.rs
+++ b/juno_samples/nested_ccp/build.rs
@@ -1,4 +1,3 @@
-extern crate juno_build;
 use juno_build::JunoCompiler;
 
 fn main() {
diff --git a/juno_samples/nested_ccp/src/main.rs b/juno_samples/nested_ccp/src/main.rs
index 11561eb8fcdbe9be4b163506f98d9952ecbc749d..974a488c8f3574aaecfd40b1110b6a7022891f0f 100644
--- a/juno_samples/nested_ccp/src/main.rs
+++ b/juno_samples/nested_ccp/src/main.rs
@@ -1,9 +1,5 @@
 #![feature(box_as_ptr, let_chains)]
 
-extern crate async_std;
-extern crate hercules_rt;
-extern crate juno_build;
-
 use hercules_rt::HerculesBox;
 
 juno_build::juno!("nested_ccp");
diff --git a/juno_samples/simple3/build.rs b/juno_samples/simple3/build.rs
index 0e476e8d41c7880741a3f474f341a0decf0bda4b..94760025d53abe7e10914052e1a7783386b316b0 100644
--- a/juno_samples/simple3/build.rs
+++ b/juno_samples/simple3/build.rs
@@ -1,4 +1,3 @@
-extern crate juno_build;
 use juno_build::JunoCompiler;
 
 fn main() {
diff --git a/juno_samples/simple3/src/main.rs b/juno_samples/simple3/src/main.rs
index 8ca54344fd6b8f574c3e2b43e50c58185812188a..1f6e213c41a27ceeb9c2988fe85bd956dec879d1 100644
--- a/juno_samples/simple3/src/main.rs
+++ b/juno_samples/simple3/src/main.rs
@@ -1,9 +1,5 @@
 #![feature(box_as_ptr, let_chains)]
 
-extern crate async_std;
-extern crate hercules_rt;
-extern crate juno_build;
-
 use hercules_rt::HerculesBox;
 
 juno_build::juno!("simple3");
diff --git a/juno_scheduler/src/lib.rs b/juno_scheduler/src/lib.rs
index 7e558d6bcb7a5c9250f3efe862ff235463c3599c..d515633eec468012ceee7305544b1859c1ebd621 100644
--- a/juno_scheduler/src/lib.rs
+++ b/juno_scheduler/src/lib.rs
@@ -1,5 +1,3 @@
-extern crate hercules_ir;
-
 use std::collections::{HashMap, HashSet};
 use std::fs::File;
 use std::io::Read;
@@ -7,7 +5,7 @@ use std::io::Read;
 use lrlex::DefaultLexerTypes;
 use lrpar::NonStreamingLexer;
 
-use self::hercules_ir::ir::*;
+use hercules_ir::ir::*;
 
 mod parser;
 use crate::parser::lexer;
diff --git a/reports/technical1/main.tex b/reports/technical1/main.tex
index 4743d2069ce05baae6e37ea3f8c24582cbd0e9ff..e70625d4cd8adcf9157e1234d45eac177fa1f255 100644
--- a/reports/technical1/main.tex
+++ b/reports/technical1/main.tex
@@ -502,9 +502,6 @@ The manifest plus the Hercules module itself are loaded from a \texttt{.hbin} fi
 Here's an example host code written in Rust:
 
 \begin{lstlisting}[style=colouredRust]
-extern crate async_std;
-extern crate hercules_rt;
-
 hercules_rt::use_hbin!("my_module.hbin");
 
 fn main() {