diff --git a/Cargo.toml b/Cargo.toml
index 23ee009..fa9cede 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,5 +1,6 @@
 [package]
 name = "tuf"
+edition = "2018"
 version = "0.3.0-alpha3"
 authors = [ "heartsucker <heartsucker@autistici.org>" ]
 description = "Library for The Update Framework (TUF)"
diff --git a/src/client.rs b/src/client.rs
index dd8debd..80c83c3 100644
--- a/src/client.rs
+++ b/src/client.rs
@@ -47,20 +47,20 @@
 //! }
 //! ```
 
+use chrono::offset::Utc;
 use std::io::{Read, Write};
 
-use chrono::offset::Utc;
-use crypto::{self, KeyId};
-use error::Error;
-use interchange::DataInterchange;
-use metadata::{
+use crate::crypto::{self, KeyId};
+use crate::error::Error;
+use crate::interchange::DataInterchange;
+use crate::metadata::{
     Metadata, MetadataPath, MetadataVersion, Role, RootMetadata, SignedMetadata, SnapshotMetadata,
     TargetDescription, TargetPath, TargetsMetadata, VirtualTargetPath,
 };
-use repository::Repository;
-use tuf::Tuf;
-use util::SafeReader;
-use Result;
+use crate::repository::Repository;
+use crate::tuf::Tuf;
+use crate::util::SafeReader;
+use crate::Result;
 
 /// Translates real paths (where a file is stored) into virtual paths (how it is addressed in TUF)
 /// and back.
@@ -175,7 +175,8 @@
                 &config.max_root_size,
                 config.min_bytes_per_second,
                 None,
-            ).or_else(|_| -> Result<SignedMetadata<_, RootMetadata>> {
+            )
+            .or_else(|_| -> Result<SignedMetadata<_, RootMetadata>> {
                 // FIXME: should we be fetching the latest version instead of version 1?
                 let root = remote.fetch_metadata(
                     &root_path,
@@ -338,7 +339,8 @@
         let snapshot_description = match self.tuf.timestamp() {
             Some(ts) => Ok(ts.snapshot()),
             None => Err(Error::MissingMetadata(Role::Timestamp)),
-        }?.clone();
+        }?
+        .clone();
 
         if snapshot_description.version() <= self.tuf.snapshot().map(|s| s.version()).unwrap_or(0) {
             return Ok(false);
@@ -383,7 +385,8 @@
                 )),
             },
             None => Err(Error::MissingMetadata(Role::Snapshot)),
-        }?.clone();
+        }?
+        .clone();
 
         if targets_description.version() <= self.tuf.targets().map(|t| t.version()).unwrap_or(0) {
             return Ok(false);
@@ -486,7 +489,7 @@
                     return (
                         default_terminate,
                         Err(Error::MissingMetadata(Role::Targets)),
-                    )
+                    );
                 }
             },
         };
@@ -534,7 +537,8 @@
                     &Some(role_meta.size()),
                     self.config.min_bytes_per_second(),
                     Some((alg, value.clone())),
-                ).or_else(|_| {
+                )
+                .or_else(|_| {
                     self.remote.fetch_metadata::<TargetsMetadata>(
                         delegation.role(),
                         &version,
@@ -762,14 +766,14 @@
 #[cfg(test)]
 mod test {
     use super::*;
-    use chrono::prelude::*;
-    use crypto::{HashAlgorithm, PrivateKey, SignatureScheme};
-    use interchange::Json;
-    use metadata::{
+    use crate::crypto::{HashAlgorithm, PrivateKey, SignatureScheme};
+    use crate::interchange::Json;
+    use crate::metadata::{
         MetadataPath, MetadataVersion, RootMetadataBuilder, SnapshotMetadataBuilder,
         TargetsMetadataBuilder, TimestampMetadataBuilder,
     };
-    use repository::EphemeralRepository;
+    use crate::repository::EphemeralRepository;
+    use chrono::prelude::*;
     use std::u32;
 
     lazy_static! {
@@ -863,49 +867,57 @@
             &MetadataPath::from_role(&Role::Root),
             &MetadataVersion::Number(1),
             &root1,
-        ).unwrap();
+        )
+        .unwrap();
 
         repo.store_metadata(
             &MetadataPath::from_role(&Role::Root),
             &MetadataVersion::None,
             &root1,
-        ).unwrap();
+        )
+        .unwrap();
 
         repo.store_metadata(
             &MetadataPath::from_role(&Role::Targets),
             &MetadataVersion::Number(1),
             &targets,
-        ).unwrap();
+        )
+        .unwrap();
 
         repo.store_metadata(
             &MetadataPath::from_role(&Role::Targets),
             &MetadataVersion::None,
             &targets,
-        ).unwrap();
+        )
+        .unwrap();
 
         repo.store_metadata(
             &MetadataPath::from_role(&Role::Snapshot),
             &MetadataVersion::Number(1),
             &snapshot,
-        ).unwrap();
+        )
+        .unwrap();
 
         repo.store_metadata(
             &MetadataPath::from_role(&Role::Snapshot),
             &MetadataVersion::None,
             &snapshot,
-        ).unwrap();
+        )
+        .unwrap();
 
         repo.store_metadata(
             &MetadataPath::from_role(&Role::Timestamp),
             &MetadataVersion::Number(1),
             &timestamp,
-        ).unwrap();
+        )
+        .unwrap();
 
         repo.store_metadata(
             &MetadataPath::from_role(&Role::Timestamp),
             &MetadataVersion::None,
             &timestamp,
-        ).unwrap();
+        )
+        .unwrap();
 
         ////
         // Now, make sure that the local metadata got version 1.
@@ -915,7 +927,8 @@
             Config::build().finish().unwrap(),
             EphemeralRepository::new(),
             repo,
-        ).unwrap();
+        )
+        .unwrap();
 
         assert_eq!(client.update(), Ok(true));
         assert_eq!(client.tuf.root().version(), 1);
@@ -930,7 +943,8 @@
                     &None,
                     u32::MAX,
                     None
-                ).unwrap(),
+                )
+                .unwrap(),
         );
 
         ////
@@ -942,7 +956,8 @@
                 &MetadataPath::from_role(&Role::Root),
                 &MetadataVersion::Number(2),
                 &root2,
-            ).unwrap();
+            )
+            .unwrap();
 
         client
             .remote
@@ -950,7 +965,8 @@
                 &MetadataPath::from_role(&Role::Root),
                 &MetadataVersion::None,
                 &root2,
-            ).unwrap();
+            )
+            .unwrap();
 
         client
             .remote
@@ -958,7 +974,8 @@
                 &MetadataPath::from_role(&Role::Root),
                 &MetadataVersion::Number(3),
                 &root3,
-            ).unwrap();
+            )
+            .unwrap();
 
         client
             .remote
@@ -966,7 +983,8 @@
                 &MetadataPath::from_role(&Role::Root),
                 &MetadataVersion::None,
                 &root3,
-            ).unwrap();
+            )
+            .unwrap();
 
         ////
         // Finally, check that the update brings us to version 3.
@@ -984,7 +1002,8 @@
                     &None,
                     u32::MAX,
                     None
-                ).unwrap(),
+                )
+                .unwrap(),
         );
     }
 }
diff --git a/src/crypto.rs b/src/crypto.rs
index 2c9623d..288ea72 100644
--- a/src/crypto.rs
+++ b/src/crypto.rs
@@ -21,9 +21,9 @@
 use std::sync::Arc;
 use untrusted::Input;
 
-use error::Error;
-use shims;
-use Result;
+use crate::error::Error;
+use crate::shims;
+use crate::Result;
 
 const HASH_ALG_PREFS: &[HashAlgorithm] = &[HashAlgorithm::Sha512, HashAlgorithm::Sha256];
 
@@ -82,7 +82,7 @@
                 return Err(Error::IllegalArgument(format!(
                     "Unknown hash algorithm: {}",
                     s
-                )))
+                )));
             }
         };
 
@@ -409,7 +409,7 @@
                         return Err(Error::IllegalArgument(format!(
                             "Cannot use signature scheme {:?} with Ed25519 keys",
                             s
-                        )))
+                        )));
                     }
                 };
                 Ok(k)
@@ -499,7 +499,7 @@
                 return Err(Error::IllegalArgument(format!(
                     "Key {:?} can't be used with scheme {:?}",
                     k, s
-                )))
+                )));
             }
         };
 
@@ -521,12 +521,14 @@
                 "rsa_keygen_pubexp:65537",
                 "-outform",
                 "der",
-            ]).output()?;
+            ])
+            .output()?;
 
         let mut pk8 = Command::new("openssl")
             .args(&[
                 "pkcs8", "-inform", "der", "-topk8", "-nocrypt", "-outform", "der",
-            ]).stdin(Stdio::piped())
+            ])
+            .stdin(Stdio::piped())
             .stdout(Stdio::piped())
             .spawn()?;
 
@@ -623,7 +625,7 @@
                 return Err(Error::IllegalArgument(format!(
                     "Unknown signature scheme: {}",
                     s
-                )))
+                )));
             }
         };
 
@@ -632,7 +634,8 @@
             Input::from(&self.value.0),
             Input::from(msg),
             Input::from(&sig.value.0),
-        ).map_err(|_| Error::BadSignature)
+        )
+        .map_err(|_| Error::BadSignature)
     }
 }
 
@@ -856,7 +859,7 @@
 #[cfg(test)]
 mod test {
     use super::*;
-    use json;
+    use serde_json::{self, json};
 
     const RSA_2048_PK8: &'static [u8] = include_bytes!("../tests/rsa/rsa-2048.pk8.der");
     const RSA_2048_SPKI: &'static [u8] = include_bytes!("../tests/rsa/rsa-2048.spki.der");
@@ -935,9 +938,9 @@
     fn serde_key_id() {
         let s = "T5vfRrM1iHpgzGwAHe7MbJH_7r4chkOAphV3OPCCv0I=";
         let jsn = json!(s);
-        let parsed: KeyId = json::from_str(&format!("\"{}\"", s)).unwrap();
+        let parsed: KeyId = serde_json::from_str(&format!("\"{}\"", s)).unwrap();
         assert_eq!(parsed, KeyId::from_string(s).unwrap());
-        let encoded = json::to_value(&parsed).unwrap();
+        let encoded = serde_json::to_value(&parsed).unwrap();
         assert_eq!(encoded, jsn);
     }
 
@@ -945,9 +948,9 @@
     fn serde_signature_value() {
         let s = "T5vfRrM1iHpgzGwAHe7MbJH_7r4chkOAphV3OPCCv0I=";
         let jsn = json!(s);
-        let parsed: SignatureValue = json::from_str(&format!("\"{}\"", s)).unwrap();
+        let parsed: SignatureValue = serde_json::from_str(&format!("\"{}\"", s)).unwrap();
         assert_eq!(parsed, SignatureValue::from_string(s).unwrap());
-        let encoded = json::to_value(&parsed).unwrap();
+        let encoded = serde_json::to_value(&parsed).unwrap();
         assert_eq!(encoded, jsn);
     }
 
@@ -955,14 +958,14 @@
     fn serde_rsa_public_key() {
         let der = RSA_2048_SPKI;
         let pub_key = PublicKey::from_spki(der, SignatureScheme::RsaSsaPssSha256).unwrap();
-        let encoded = json::to_value(&pub_key).unwrap();
+        let encoded = serde_json::to_value(&pub_key).unwrap();
         let jsn = json!({
             "type": "rsa",
             "scheme": "rsassa-pss-sha256",
             "public_key": BASE64URL.encode(der),
         });
         assert_eq!(encoded, jsn);
-        let decoded: PublicKey = json::from_value(encoded).unwrap();
+        let decoded: PublicKey = serde_json::from_value(encoded).unwrap();
         assert_eq!(decoded, pub_key);
     }
 
@@ -970,14 +973,14 @@
     fn serde_ed25519_public_key() {
         let der = ED25519_SPKI;
         let pub_key = PublicKey::from_spki(der, SignatureScheme::Ed25519).unwrap();
-        let encoded = json::to_value(&pub_key).unwrap();
+        let encoded = serde_json::to_value(&pub_key).unwrap();
         let jsn = json!({
             "type": "ed25519",
             "scheme": "ed25519",
             "public_key": BASE64URL.encode(der),
         });
         assert_eq!(encoded, jsn);
-        let decoded: PublicKey = json::from_value(encoded).unwrap();
+        let decoded: PublicKey = serde_json::from_value(encoded).unwrap();
         assert_eq!(decoded, pub_key);
     }
 
@@ -986,15 +989,15 @@
         let key = PrivateKey::from_pkcs8(ED25519_PK8, SignatureScheme::Ed25519).unwrap();
         let msg = b"test";
         let sig = key.sign(msg).unwrap();
-        let encoded = json::to_value(&sig).unwrap();
+        let encoded = serde_json::to_value(&sig).unwrap();
         let jsn = json!({
-            "key_id": "qfrfBrkB4lBBSDEBlZgaTGS_SrE6UfmON9kP4i3dJFY=",
-            "value": "_k0Tsqc8Azod5_UQeyBfx7oOFWbLlbkjScrmqkU4lWATv-D3v5d8sHK7Z\
-                eh4K18zoFc_54gWKZoBfKW6VZ45DA==",
+        "key_id": "qfrfBrkB4lBBSDEBlZgaTGS_SrE6UfmON9kP4i3dJFY=",
+        "value": "_k0Tsqc8Azod5_UQeyBfx7oOFWbLlbkjScrmqkU4lWATv-D3v5d8sHK7Z\
+            eh4K18zoFc_54gWKZoBfKW6VZ45DA==",
         });
         assert_eq!(encoded, jsn);
 
-        let decoded: Signature = json::from_value(encoded).unwrap();
+        let decoded: Signature = serde_json::from_value(encoded).unwrap();
         assert_eq!(decoded, sig);
     }
 
diff --git a/src/error.rs b/src/error.rs
index 45cc70b..e708598 100644
--- a/src/error.rs
+++ b/src/error.rs
@@ -3,13 +3,13 @@
 use data_encoding::DecodeError;
 use derp;
 use hyper;
-use json;
+use serde_json;
 use std::fmt;
 use std::io;
 use std::path::Path;
 use tempfile;
 
-use metadata::Role;
+use crate::metadata::Role;
 
 /// Error type for all TUF related errors.
 #[derive(Debug, PartialEq, Eq)]
@@ -70,8 +70,8 @@
     }
 }
 
-impl From<json::error::Error> for Error {
-    fn from(err: json::error::Error) -> Error {
+impl From<serde_json::error::Error> for Error {
+    fn from(err: serde_json::error::Error) -> Error {
         Error::Encoding(format!("JSON: {:?}", err))
     }
 }
diff --git a/src/interchange/cjson.rs b/src/interchange/cjson.rs
index f7c23a9..3fea747 100644
--- a/src/interchange/cjson.rs
+++ b/src/interchange/cjson.rs
@@ -1,8 +1,8 @@
 use itoa;
-use json;
+use serde_json;
 use std::collections::BTreeMap;
 
-pub fn canonicalize(jsn: &json::Value) -> Result<Vec<u8>, String> {
+pub fn canonicalize(jsn: &serde_json::Value) -> Result<Vec<u8>, String> {
     let converted = convert(jsn)?;
     let mut buf = Vec::new();
     let _ = converted.write(&mut buf); // Vec<u8> impl always succeeds (or panics).
@@ -41,8 +41,8 @@
                 .map_err(|err| format!("Write error: {}", err)),
             Value::String(ref s) => {
                 // this mess is abusing serde_json to get json escaping
-                let s = json::Value::String(s.clone());
-                let s = json::to_string(&s).map_err(|e| format!("{:?}", e))?;
+                let s = serde_json::Value::String(s.clone());
+                let s = serde_json::to_string(&s).map_err(|e| format!("{:?}", e))?;
                 buf.extend(s.as_bytes());
                 Ok(())
             }
@@ -69,8 +69,8 @@
                     first = false;
 
                     // this mess is abusing serde_json to get json escaping
-                    let k = json::Value::String(k.clone());
-                    let k = json::to_string(&k).map_err(|e| format!("{:?}", e))?;
+                    let k = serde_json::Value::String(k.clone());
+                    let k = serde_json::to_string(&k).map_err(|e| format!("{:?}", e))?;
                     buf.extend(k.as_bytes());
 
                     buf.push(b':');
@@ -88,31 +88,31 @@
     U64(u64),
 }
 
-fn convert(jsn: &json::Value) -> Result<Value, String> {
+fn convert(jsn: &serde_json::Value) -> Result<Value, String> {
     match *jsn {
-        json::Value::Null => Ok(Value::Null),
-        json::Value::Bool(b) => Ok(Value::Bool(b)),
-        json::Value::Number(ref n) => n
+        serde_json::Value::Null => Ok(Value::Null),
+        serde_json::Value::Bool(b) => Ok(Value::Bool(b)),
+        serde_json::Value::Number(ref n) => n
             .as_i64()
             .map(Number::I64)
             .or_else(|| n.as_u64().map(Number::U64))
             .map(Value::Number)
             .ok_or_else(|| String::from("only i64 and u64 are supported")),
-        json::Value::Array(ref arr) => {
+        serde_json::Value::Array(ref arr) => {
             let mut out = Vec::new();
             for res in arr.iter().map(|v| convert(v)) {
                 out.push(res?)
             }
             Ok(Value::Array(out))
         }
-        json::Value::Object(ref obj) => {
+        serde_json::Value::Object(ref obj) => {
             let mut out = BTreeMap::new();
             for (k, v) in obj.iter() {
                 let _ = out.insert(k.clone(), convert(v)?);
             }
             Ok(Value::Object(out))
         }
-        json::Value::String(ref s) => Ok(Value::String(s.clone())),
+        serde_json::Value::String(ref s) => Ok(Value::String(s.clone())),
     }
 }
 
diff --git a/src/interchange/mod.rs b/src/interchange/mod.rs
index 7f6dbd6..8bdcb6f 100644
--- a/src/interchange/mod.rs
+++ b/src/interchange/mod.rs
@@ -2,14 +2,14 @@
 
 mod cjson;
 
-use json;
 use serde::de::DeserializeOwned;
 use serde::ser::Serialize;
+use serde_json;
 use std::fmt::Debug;
 use std::io::{Read, Write};
 
-use error::Error;
-use Result;
+use crate::error::Error;
+use crate::Result;
 
 /// The format used for data interchange, serialization, and deserialization.
 pub trait DataInterchange: Debug + PartialEq + Clone {
@@ -219,7 +219,7 @@
 #[derive(Debug, Clone, PartialEq)]
 pub struct Json {}
 impl DataInterchange for Json {
-    type RawData = json::Value;
+    type RawData = serde_json::Value;
 
     /// ```
     /// # use tuf::interchange::{DataInterchange, Json};
@@ -267,7 +267,7 @@
     where
         T: DeserializeOwned,
     {
-        Ok(json::from_value(raw_data.clone())?)
+        Ok(serde_json::from_value(raw_data.clone())?)
     }
 
     /// ```
@@ -296,7 +296,7 @@
     where
         T: Serialize,
     {
-        Ok(json::to_value(data)?)
+        Ok(serde_json::to_value(data)?)
     }
 
     /// ```
@@ -327,6 +327,6 @@
         R: Read,
         T: DeserializeOwned,
     {
-        Ok(json::from_reader(rdr)?)
+        Ok(serde_json::from_reader(rdr)?)
     }
 }
diff --git a/src/lib.rs b/src/lib.rs
index a93a655..1d6f125 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -130,12 +130,7 @@
 extern crate serde;
 #[macro_use]
 extern crate serde_derive;
-
-#[cfg(not(test))]
-extern crate serde_json as json;
-#[cfg(test)]
-#[macro_use]
-extern crate serde_json as json;
+extern crate serde_json;
 
 extern crate tempfile;
 extern crate untrusted;
@@ -154,6 +149,6 @@
 pub mod tuf;
 mod util;
 
-pub use error::*;
-pub use tuf::*;
-pub use util::*;
+pub use crate::error::*;
+pub use crate::tuf::*;
+pub use crate::util::*;
diff --git a/src/metadata.rs b/src/metadata.rs
index 0e0fb91..a25db77 100644
--- a/src/metadata.rs
+++ b/src/metadata.rs
@@ -9,11 +9,11 @@
 use std::io::Read;
 use std::marker::PhantomData;
 
-use crypto::{self, HashAlgorithm, HashValue, KeyId, PrivateKey, PublicKey, Signature};
-use error::Error;
-use interchange::DataInterchange;
-use shims;
-use Result;
+use crate::crypto::{self, HashAlgorithm, HashValue, KeyId, PrivateKey, PublicKey, Signature};
+use crate::error::Error;
+use crate::interchange::DataInterchange;
+use crate::shims;
+use crate::Result;
 
 #[cfg_attr(rustfmt, rustfmt_skip)]
 static PATH_ILLEGAL_COMPONENTS: &'static [&str] = &[
@@ -1377,9 +1377,11 @@
                         parents[0]
                             .iter()
                             .any(|p| parent.is_child(p) || parent == &p)
-                    }).cloned()
+                    })
+                    .cloned()
                     .collect::<HashSet<_>>()
-            }).collect::<Vec<_>>();
+            })
+            .collect::<Vec<_>>();
         self.matches_chain(&*new)
     }
 
@@ -1684,11 +1686,12 @@
             return Err(Error::IllegalArgument("Roles cannot be empty.".into()));
         }
 
-        if roles.len() != roles
-            .iter()
-            .map(|r| &r.role)
-            .collect::<HashSet<&MetadataPath>>()
-            .len()
+        if roles.len()
+            != roles
+                .iter()
+                .map(|r| &r.role)
+                .collect::<HashSet<&MetadataPath>>()
+                .len()
         {
             return Err(Error::IllegalArgument(
                 "Cannot have duplicated roles in delegations.".into(),
@@ -1827,10 +1830,10 @@
 #[cfg(test)]
 mod test {
     use super::*;
+    use crate::crypto::SignatureScheme;
+    use crate::interchange::Json;
     use chrono::prelude::*;
-    use crypto::SignatureScheme;
-    use interchange::Json;
-    use json;
+    use serde_json::json;
 
     const ED25519_1_PK8: &'static [u8] = include_bytes!("../tests/ed25519/ed25519-1.pk8.der");
     const ED25519_2_PK8: &'static [u8] = include_bytes!("../tests/ed25519/ed25519-2.pk8.der");
@@ -1895,7 +1898,8 @@
                         .iter()
                         .map(|p| VirtualTargetPath::new(p.to_string()).unwrap())
                         .collect::<HashSet<_>>()
-                }).collect::<Vec<_>>();
+                })
+                .collect::<Vec<_>>();
             println!(
                 "CASE: expect: {} path: {:?} parents: {:?}",
                 expected, target, parents
@@ -1907,32 +1911,32 @@
     #[test]
     fn serde_target_path() {
         let s = "foo/bar";
-        let t = json::from_str::<VirtualTargetPath>(&format!("\"{}\"", s)).unwrap();
+        let t = serde_json::from_str::<VirtualTargetPath>(&format!("\"{}\"", s)).unwrap();
         assert_eq!(t.to_string().as_str(), s);
-        assert_eq!(json::to_value(t).unwrap(), json!("foo/bar"));
+        assert_eq!(serde_json::to_value(t).unwrap(), json!("foo/bar"));
     }
 
     #[test]
     fn serde_metadata_path() {
         let s = "foo/bar";
-        let m = json::from_str::<MetadataPath>(&format!("\"{}\"", s)).unwrap();
+        let m = serde_json::from_str::<MetadataPath>(&format!("\"{}\"", s)).unwrap();
         assert_eq!(m.to_string().as_str(), s);
-        assert_eq!(json::to_value(m).unwrap(), json!("foo/bar"));
+        assert_eq!(serde_json::to_value(m).unwrap(), json!("foo/bar"));
     }
 
     #[test]
     fn serde_target_description() {
         let s: &[u8] = b"from water does all life begin";
         let description = TargetDescription::from_reader(s, &[HashAlgorithm::Sha256]).unwrap();
-        let jsn_str = json::to_string(&description).unwrap();
+        let jsn_str = serde_json::to_string(&description).unwrap();
         let jsn = json!({
             "size": 30,
             "hashes": {
                 "sha256": "_F10XHEryG6poxJk2sDJVu61OFf2d-7QWCm7cQE8rhg=",
             },
         });
-        let parsed_str: TargetDescription = json::from_str(&jsn_str).unwrap();
-        let parsed_jsn: TargetDescription = json::from_value(jsn).unwrap();
+        let parsed_str: TargetDescription = serde_json::from_str(&jsn_str).unwrap();
+        let parsed_jsn: TargetDescription = serde_json::from_value(jsn).unwrap();
         assert_eq!(parsed_str, parsed_jsn);
     }
 
@@ -1941,7 +1945,8 @@
         let hashes = hashset!(
             "diNfThTFm0PI8R-Bq7NztUIvZbZiaC_weJBgcqaHlWw=",
             "ar9AgoRsmeEcf6Ponta_1TZu1ds5uXbDemBig30O7ck=",
-        ).iter()
+        )
+        .iter()
         .map(|k| KeyId::from_string(*k).unwrap())
         .collect();
         let role_def = RoleDefinition::new(2, hashes).unwrap();
@@ -1953,9 +1958,9 @@
                 "diNfThTFm0PI8R-Bq7NztUIvZbZiaC_weJBgcqaHlWw=",
             ],
         });
-        let encoded = json::to_value(&role_def).unwrap();
+        let encoded = serde_json::to_value(&role_def).unwrap();
         assert_eq!(encoded, jsn);
-        let decoded: RoleDefinition = json::from_value(encoded).unwrap();
+        let decoded: RoleDefinition = serde_json::from_value(encoded).unwrap();
         assert_eq!(decoded, role_def);
 
         let jsn = json!({
@@ -1964,7 +1969,7 @@
                 "diNfThTFm0PI8R-Bq7NztUIvZbZiaC_weJBgcqaHlWw=",
             ],
         });
-        assert!(json::from_value::<RoleDefinition>(jsn).is_err());
+        assert!(serde_json::from_value::<RoleDefinition>(jsn).is_err());
 
         let jsn = json!({
             "threshold": -1,
@@ -1972,7 +1977,7 @@
                 "diNfThTFm0PI8R-Bq7NztUIvZbZiaC_weJBgcqaHlWw=",
             ],
         });
-        assert!(json::from_value::<RoleDefinition>(jsn).is_err());
+        assert!(serde_json::from_value::<RoleDefinition>(jsn).is_err());
     }
 
     #[test]
@@ -2041,9 +2046,9 @@
             },
         });
 
-        let encoded = json::to_value(&root).unwrap();
+        let encoded = serde_json::to_value(&root).unwrap();
         assert_eq!(encoded, jsn);
-        let decoded: RootMetadata = json::from_value(encoded).unwrap();
+        let decoded: RootMetadata = serde_json::from_value(encoded).unwrap();
         assert_eq!(decoded, root);
     }
 
@@ -2053,7 +2058,8 @@
             1,
             100,
             hashmap! { HashAlgorithm::Sha256 => HashValue::new(vec![]) },
-        ).unwrap();
+        )
+        .unwrap();
 
         let timestamp = TimestampMetadataBuilder::from_metadata_description(description)
             .expires(Utc.ymd(2017, 1, 1).and_hms(0, 0, 0))
@@ -2073,9 +2079,9 @@
             },
         });
 
-        let encoded = json::to_value(&timestamp).unwrap();
+        let encoded = serde_json::to_value(&timestamp).unwrap();
         assert_eq!(encoded, jsn);
-        let decoded: TimestampMetadata = json::from_value(encoded).unwrap();
+        let decoded: TimestampMetadata = serde_json::from_value(encoded).unwrap();
         assert_eq!(decoded, timestamp);
     }
 
@@ -2089,8 +2095,10 @@
                     1,
                     100,
                     hashmap! { HashAlgorithm::Sha256 => HashValue::new(vec![]) },
-                ).unwrap(),
-            ).build()
+                )
+                .unwrap(),
+            )
+            .build()
             .unwrap();
 
         let jsn = json!({
@@ -2108,9 +2116,9 @@
             },
         });
 
-        let encoded = json::to_value(&snapshot).unwrap();
+        let encoded = serde_json::to_value(&snapshot).unwrap();
         assert_eq!(encoded, jsn);
-        let decoded: SnapshotMetadata = json::from_value(encoded).unwrap();
+        let decoded: SnapshotMetadata = serde_json::from_value(encoded).unwrap();
         assert_eq!(decoded, snapshot);
     }
 
@@ -2121,7 +2129,8 @@
             .insert_target_description(
                 VirtualTargetPath::new("foo".into()).unwrap(),
                 TargetDescription::from_reader(&b"foo"[..], &[HashAlgorithm::Sha256]).unwrap(),
-            ).build()
+            )
+            .build()
             .unwrap();
 
         let jsn = json!({
@@ -2138,9 +2147,9 @@
             },
         });
 
-        let encoded = json::to_value(&targets).unwrap();
+        let encoded = serde_json::to_value(&targets).unwrap();
         assert_eq!(encoded, jsn);
-        let decoded: TargetsMetadata = json::from_value(encoded).unwrap();
+        let decoded: TargetsMetadata = serde_json::from_value(encoded).unwrap();
         assert_eq!(decoded, targets);
     }
 
@@ -2149,16 +2158,16 @@
         let key = PrivateKey::from_pkcs8(ED25519_1_PK8, SignatureScheme::Ed25519).unwrap();
         let delegations = Delegations::new(
             &hashset![key.public().clone()],
-            vec![
-                Delegation::new(
-                    MetadataPath::new("foo/bar".into()).unwrap(),
-                    false,
-                    1,
-                    hashset!(key.key_id().clone()),
-                    hashset!(VirtualTargetPath::new("baz/quux".into()).unwrap()),
-                ).unwrap(),
-            ],
-        ).unwrap();
+            vec![Delegation::new(
+                MetadataPath::new("foo/bar".into()).unwrap(),
+                false,
+                1,
+                hashset!(key.key_id().clone()),
+                hashset!(VirtualTargetPath::new("baz/quux".into()).unwrap()),
+            )
+            .unwrap()],
+        )
+        .unwrap();
 
         let targets = TargetsMetadataBuilder::new()
             .expires(Utc.ymd(2017, 1, 1).and_hms(0, 0, 0))
@@ -2192,9 +2201,9 @@
             }
         });
 
-        let encoded = json::to_value(&targets).unwrap();
+        let encoded = serde_json::to_value(&targets).unwrap();
         assert_eq!(encoded, jsn);
-        let decoded: TargetsMetadata = json::from_value(encoded).unwrap();
+        let decoded: TargetsMetadata = serde_json::from_value(encoded).unwrap();
         assert_eq!(decoded, targets);
     }
 
@@ -2208,8 +2217,10 @@
                     1,
                     100,
                     hashmap! { HashAlgorithm::Sha256 => HashValue::new(vec![]) },
-                ).unwrap(),
-            ).build()
+                )
+                .unwrap(),
+            )
+            .build()
             .unwrap();
 
         let key = PrivateKey::from_pkcs8(ED25519_1_PK8, SignatureScheme::Ed25519).unwrap();
@@ -2240,9 +2251,10 @@
             },
         });
 
-        let encoded = json::to_value(&signed).unwrap();
+        let encoded = serde_json::to_value(&signed).unwrap();
         assert_eq!(encoded, jsn, "{:#?} != {:#?}", encoded, jsn);
-        let decoded: SignedMetadata<Json, SnapshotMetadata> = json::from_value(encoded).unwrap();
+        let decoded: SignedMetadata<Json, SnapshotMetadata> =
+            serde_json::from_value(encoded).unwrap();
         assert_eq!(decoded, signed);
     }
 
@@ -2269,7 +2281,7 @@
 
     // TODO test for mismatched ed25519/rsa keys/schemes
 
-    fn make_root() -> json::Value {
+    fn make_root() -> serde_json::Value {
         let root_key = PrivateKey::from_pkcs8(ED25519_1_PK8, SignatureScheme::Ed25519).unwrap();
         let snapshot_key = PrivateKey::from_pkcs8(ED25519_2_PK8, SignatureScheme::Ed25519).unwrap();
         let targets_key = PrivateKey::from_pkcs8(ED25519_3_PK8, SignatureScheme::Ed25519).unwrap();
@@ -2285,19 +2297,19 @@
             .build()
             .unwrap();
 
-        json::to_value(&root).unwrap()
+        serde_json::to_value(&root).unwrap()
     }
 
-    fn make_snapshot() -> json::Value {
+    fn make_snapshot() -> serde_json::Value {
         let snapshot = SnapshotMetadataBuilder::new()
             .expires(Utc.ymd(2038, 1, 1).and_hms(0, 0, 0))
             .build()
             .unwrap();
 
-        json::to_value(&snapshot).unwrap()
+        serde_json::to_value(&snapshot).unwrap()
     }
 
-    fn make_timestamp() -> json::Value {
+    fn make_timestamp() -> serde_json::Value {
         let description =
             MetadataDescription::from_reader(&[][..], 1, &[HashAlgorithm::Sha256]).unwrap();
 
@@ -2306,39 +2318,39 @@
             .build()
             .unwrap();
 
-        json::to_value(&timestamp).unwrap()
+        serde_json::to_value(&timestamp).unwrap()
     }
 
-    fn make_targets() -> json::Value {
+    fn make_targets() -> serde_json::Value {
         let targets =
             TargetsMetadata::new(1, Utc.ymd(2038, 1, 1).and_hms(0, 0, 0), hashmap!(), None)
                 .unwrap();
 
-        json::to_value(&targets).unwrap()
+        serde_json::to_value(&targets).unwrap()
     }
 
-    fn make_delegations() -> json::Value {
+    fn make_delegations() -> serde_json::Value {
         let key = PrivateKey::from_pkcs8(ED25519_1_PK8, SignatureScheme::Ed25519)
             .unwrap()
             .public()
             .clone();
         let delegations = Delegations::new(
             &hashset![key.clone()],
-            vec![
-                Delegation::new(
-                    MetadataPath::new("foo".into()).unwrap(),
-                    false,
-                    1,
-                    hashset!(key.key_id().clone()),
-                    hashset!(VirtualTargetPath::new("bar".into()).unwrap()),
-                ).unwrap(),
-            ],
-        ).unwrap();
+            vec![Delegation::new(
+                MetadataPath::new("foo".into()).unwrap(),
+                false,
+                1,
+                hashset!(key.key_id().clone()),
+                hashset!(VirtualTargetPath::new("bar".into()).unwrap()),
+            )
+            .unwrap()],
+        )
+        .unwrap();
 
-        json::to_value(&delegations).unwrap()
+        serde_json::to_value(&delegations).unwrap()
     }
 
-    fn make_delegation() -> json::Value {
+    fn make_delegation() -> serde_json::Value {
         let key = PrivateKey::from_pkcs8(ED25519_1_PK8, SignatureScheme::Ed25519)
             .unwrap()
             .public()
@@ -2349,12 +2361,13 @@
             1,
             hashset!(key.key_id().clone()),
             hashset!(VirtualTargetPath::new("bar".into()).unwrap()),
-        ).unwrap();
+        )
+        .unwrap();
 
-        json::to_value(&delegation).unwrap()
+        serde_json::to_value(&delegation).unwrap()
     }
 
-    fn set_version(value: &mut json::Value, version: i64) {
+    fn set_version(value: &mut serde_json::Value, version: i64) {
         match value.as_object_mut() {
             Some(obj) => {
                 let _ = obj.insert("version".into(), json!(version));
@@ -2368,11 +2381,11 @@
     fn deserialize_json_root_illegal_version() {
         let mut root_json = make_root();
         set_version(&mut root_json, 0);
-        assert!(json::from_value::<RootMetadata>(root_json.clone()).is_err());
+        assert!(serde_json::from_value::<RootMetadata>(root_json.clone()).is_err());
 
         let mut root_json = make_root();
         set_version(&mut root_json, -1);
-        assert!(json::from_value::<RootMetadata>(root_json).is_err());
+        assert!(serde_json::from_value::<RootMetadata>(root_json).is_err());
     }
 
     // Refuse to deserialize root metadata if it contains duplicate keys
@@ -2395,10 +2408,10 @@
             .as_array_mut()
             .unwrap()
             .push(dupe);
-        assert!(json::from_value::<RootMetadata>(root_json).is_err());
+        assert!(serde_json::from_value::<RootMetadata>(root_json).is_err());
     }
 
-    fn set_threshold(value: &mut json::Value, threshold: i32) {
+    fn set_threshold(value: &mut serde_json::Value, threshold: i32) {
         match value.as_object_mut() {
             Some(obj) => {
                 let _ = obj.insert("threshold".into(), json!(threshold));
@@ -2418,15 +2431,16 @@
                     .key_id()
                     .clone()
             ),
-        ).unwrap();
+        )
+        .unwrap();
 
-        let mut jsn = json::to_value(&role_def).unwrap();
+        let mut jsn = serde_json::to_value(&role_def).unwrap();
         set_threshold(&mut jsn, 0);
-        assert!(json::from_value::<RoleDefinition>(jsn).is_err());
+        assert!(serde_json::from_value::<RoleDefinition>(jsn).is_err());
 
-        let mut jsn = json::to_value(&role_def).unwrap();
+        let mut jsn = serde_json::to_value(&role_def).unwrap();
         set_threshold(&mut jsn, -1);
-        assert!(json::from_value::<RoleDefinition>(jsn).is_err());
+        assert!(serde_json::from_value::<RoleDefinition>(jsn).is_err());
 
         let role_def = RoleDefinition::new(
             2,
@@ -2440,11 +2454,12 @@
                     .key_id()
                     .clone(),
             ),
-        ).unwrap();
+        )
+        .unwrap();
 
-        let mut jsn = json::to_value(&role_def).unwrap();
+        let mut jsn = serde_json::to_value(&role_def).unwrap();
         set_threshold(&mut jsn, 3);
-        assert!(json::from_value::<RoleDefinition>(jsn).is_err());
+        assert!(serde_json::from_value::<RoleDefinition>(jsn).is_err());
     }
 
     // Refuse to deserialilze root metadata with wrong type field
@@ -2455,7 +2470,7 @@
             .as_object_mut()
             .unwrap()
             .insert("type".into(), json!("snapshot"));
-        assert!(json::from_value::<RootMetadata>(root).is_err());
+        assert!(serde_json::from_value::<RootMetadata>(root).is_err());
     }
 
     // Refuse to deserialize role definitions with duplicated key ids
@@ -2466,7 +2481,7 @@
             .key_id()
             .clone();
         let role_def = RoleDefinition::new(1, hashset!(key_id.clone())).unwrap();
-        let mut jsn = json::to_value(&role_def).unwrap();
+        let mut jsn = serde_json::to_value(&role_def).unwrap();
 
         match jsn.as_object_mut() {
             Some(obj) => match obj.get_mut("key_ids").unwrap().as_array_mut() {
@@ -2476,7 +2491,7 @@
             None => panic!(),
         }
 
-        assert!(json::from_value::<RoleDefinition>(jsn).is_err());
+        assert!(serde_json::from_value::<RoleDefinition>(jsn).is_err());
     }
 
     // Refuse to deserialize snapshot metadata with illegal versions
@@ -2484,11 +2499,11 @@
     fn deserialize_json_snapshot_illegal_version() {
         let mut snapshot = make_snapshot();
         set_version(&mut snapshot, 0);
-        assert!(json::from_value::<SnapshotMetadata>(snapshot).is_err());
+        assert!(serde_json::from_value::<SnapshotMetadata>(snapshot).is_err());
 
         let mut snapshot = make_snapshot();
         set_version(&mut snapshot, -1);
-        assert!(json::from_value::<SnapshotMetadata>(snapshot).is_err());
+        assert!(serde_json::from_value::<SnapshotMetadata>(snapshot).is_err());
     }
 
     // Refuse to deserialilze snapshot metadata with wrong type field
@@ -2499,7 +2514,7 @@
             .as_object_mut()
             .unwrap()
             .insert("type".into(), json!("root"));
-        assert!(json::from_value::<SnapshotMetadata>(snapshot).is_err());
+        assert!(serde_json::from_value::<SnapshotMetadata>(snapshot).is_err());
     }
 
     // Refuse to deserialize timestamp metadata with illegal versions
@@ -2507,11 +2522,11 @@
     fn deserialize_json_timestamp_illegal_version() {
         let mut timestamp = make_timestamp();
         set_version(&mut timestamp, 0);
-        assert!(json::from_value::<TimestampMetadata>(timestamp).is_err());
+        assert!(serde_json::from_value::<TimestampMetadata>(timestamp).is_err());
 
         let mut timestamp = make_timestamp();
         set_version(&mut timestamp, -1);
-        assert!(json::from_value::<TimestampMetadata>(timestamp).is_err());
+        assert!(serde_json::from_value::<TimestampMetadata>(timestamp).is_err());
     }
 
     // Refuse to deserialilze timestamp metadata with wrong type field
@@ -2522,7 +2537,7 @@
             .as_object_mut()
             .unwrap()
             .insert("type".into(), json!("root"));
-        assert!(json::from_value::<TimestampMetadata>(timestamp).is_err());
+        assert!(serde_json::from_value::<TimestampMetadata>(timestamp).is_err());
     }
 
     // Refuse to deserialize targets metadata with illegal versions
@@ -2530,11 +2545,11 @@
     fn deserialize_json_targets_illegal_version() {
         let mut targets = make_targets();
         set_version(&mut targets, 0);
-        assert!(json::from_value::<TargetsMetadata>(targets).is_err());
+        assert!(serde_json::from_value::<TargetsMetadata>(targets).is_err());
 
         let mut targets = make_targets();
         set_version(&mut targets, -1);
-        assert!(json::from_value::<TargetsMetadata>(targets).is_err());
+        assert!(serde_json::from_value::<TargetsMetadata>(targets).is_err());
     }
 
     // Refuse to deserialilze targets metadata with wrong type field
@@ -2545,7 +2560,7 @@
             .as_object_mut()
             .unwrap()
             .insert("type".into(), json!("root"));
-        assert!(json::from_value::<TargetsMetadata>(targets).is_err());
+        assert!(serde_json::from_value::<TargetsMetadata>(targets).is_err());
     }
 
     // Refuse to deserialize delegations with no keys
@@ -2560,7 +2575,7 @@
             .as_array_mut()
             .unwrap()
             .clear();
-        assert!(json::from_value::<Delegations>(delegations).is_err());
+        assert!(serde_json::from_value::<Delegations>(delegations).is_err());
     }
 
     // Refuse to deserialize delegations with no roles
@@ -2575,7 +2590,7 @@
             .as_array_mut()
             .unwrap()
             .clear();
-        assert!(json::from_value::<Delegations>(delegations).is_err());
+        assert!(serde_json::from_value::<Delegations>(delegations).is_err());
     }
 
     // Refuse to deserialize delegations with duplicated roles
@@ -2598,7 +2613,7 @@
             .as_array_mut()
             .unwrap()
             .push(dupe);
-        assert!(json::from_value::<Delegations>(delegations).is_err());
+        assert!(serde_json::from_value::<Delegations>(delegations).is_err());
     }
 
     // Refuse to deserialize a delegation with insufficient threshold
@@ -2606,11 +2621,11 @@
     fn deserialize_json_delegation_bad_threshold() {
         let mut delegation = make_delegation();
         set_threshold(&mut delegation, 0);
-        assert!(json::from_value::<Delegation>(delegation).is_err());
+        assert!(serde_json::from_value::<Delegation>(delegation).is_err());
 
         let mut delegation = make_delegation();
         set_threshold(&mut delegation, 2);
-        assert!(json::from_value::<Delegation>(delegation).is_err());
+        assert!(serde_json::from_value::<Delegation>(delegation).is_err());
     }
 
     // Refuse to deserialize a delegation with duplicate key IDs
@@ -2633,7 +2648,7 @@
             .as_array_mut()
             .unwrap()
             .push(dupe);
-        assert!(json::from_value::<Delegation>(delegation).is_err());
+        assert!(serde_json::from_value::<Delegation>(delegation).is_err());
     }
 
     // Refuse to deserialize a delegation with duplicate paths
@@ -2656,7 +2671,7 @@
             .as_array_mut()
             .unwrap()
             .push(dupe);
-        assert!(json::from_value::<Delegation>(delegation).is_err());
+        assert!(serde_json::from_value::<Delegation>(delegation).is_err());
     }
 
     // Refuse to deserialize a Delegations struct with duplicate keys
@@ -2668,17 +2683,17 @@
             .clone();
         let delegations = Delegations::new(
             &hashset!(key.clone()),
-            vec![
-                Delegation::new(
-                    MetadataPath::new("foo".into()).unwrap(),
-                    false,
-                    1,
-                    hashset!(key.key_id().clone()),
-                    hashset!(VirtualTargetPath::new("bar".into()).unwrap()),
-                ).unwrap(),
-            ],
-        ).unwrap();
-        let mut delegations = json::to_value(delegations).unwrap();
+            vec![Delegation::new(
+                MetadataPath::new("foo".into()).unwrap(),
+                false,
+                1,
+                hashset!(key.key_id().clone()),
+                hashset!(VirtualTargetPath::new("bar".into()).unwrap()),
+            )
+            .unwrap()],
+        )
+        .unwrap();
+        let mut delegations = serde_json::to_value(delegations).unwrap();
 
         let dupe = delegations
             .as_object()
@@ -2696,6 +2711,6 @@
             .as_array_mut()
             .unwrap()
             .push(dupe);
-        assert!(json::from_value::<Delegations>(delegations).is_err());
+        assert!(serde_json::from_value::<Delegations>(delegations).is_err());
     }
 }
diff --git a/src/repository.rs b/src/repository.rs
index 7304d79..3d68917 100644
--- a/src/repository.rs
+++ b/src/repository.rs
@@ -12,14 +12,14 @@
 use std::sync::{Arc, RwLock};
 use tempfile::NamedTempFile;
 
-use crypto::{self, HashAlgorithm, HashValue};
-use error::Error;
-use interchange::DataInterchange;
-use metadata::{
+use crate::crypto::{self, HashAlgorithm, HashValue};
+use crate::error::Error;
+use crate::interchange::DataInterchange;
+use crate::metadata::{
     Metadata, MetadataPath, MetadataVersion, SignedMetadata, TargetDescription, TargetPath,
 };
-use util::SafeReader;
-use Result;
+use crate::util::SafeReader;
+use crate::Result;
 
 /// Top-level trait that represents a TUF repository and contains all the ways it can be interacted
 /// with.
@@ -504,7 +504,7 @@
 #[cfg(test)]
 mod test {
     use super::*;
-    use interchange::Json;
+    use crate::interchange::Json;
     use tempfile;
 
     #[test]
@@ -546,15 +546,13 @@
             TargetDescription::from_reader(data, &[HashAlgorithm::Sha256]).unwrap();
         let path = TargetPath::new("foo/bar/baz".into()).unwrap();
         repo.store_target(data, &path).unwrap();
-        assert!(
-            temp_dir
-                .path()
-                .join("targets")
-                .join("foo")
-                .join("bar")
-                .join("baz")
-                .exists()
-        );
+        assert!(temp_dir
+            .path()
+            .join("targets")
+            .join("foo")
+            .join("bar")
+            .join("baz")
+            .exists());
 
         let mut buf = Vec::new();
 
diff --git a/src/shims.rs b/src/shims.rs
index 294474e..88072a2 100644
--- a/src/shims.rs
+++ b/src/shims.rs
@@ -4,10 +4,10 @@
 use std::collections::{HashMap, HashSet};
 use std::iter::FromIterator;
 
-use crypto;
-use error::Error;
-use metadata::{self, Metadata};
-use Result;
+use crate::crypto;
+use crate::error::Error;
+use crate::metadata::{self, Metadata};
+use crate::Result;
 
 fn parse_datetime(ts: &str) -> Result<DateTime<Utc>> {
     Utc.datetime_from_str(ts, "%FT%TZ")
diff --git a/src/tuf.rs b/src/tuf.rs
index 1fa84fa..26f2297 100644
--- a/src/tuf.rs
+++ b/src/tuf.rs
@@ -4,14 +4,14 @@
 use std::collections::{HashMap, HashSet};
 use std::marker::PhantomData;
 
-use crypto::KeyId;
-use error::Error;
-use interchange::DataInterchange;
-use metadata::{
+use crate::crypto::KeyId;
+use crate::error::Error;
+use crate::interchange::DataInterchange;
+use crate::metadata::{
     Delegations, Metadata, MetadataPath, Role, RootMetadata, SignedMetadata, SnapshotMetadata,
     TargetDescription, TargetsMetadata, TimestampMetadata, VirtualTargetPath,
 };
-use Result;
+use crate::Result;
 
 /// Contains trusted TUF metadata and can be used to verify other metadata and targets.
 #[derive(Debug)]
@@ -411,7 +411,7 @@
                 None => {
                     return Err(Error::VerificationFailure(
                         "Delegations not authorized".into(),
-                    ))
+                    ));
                 }
             };
 
@@ -421,7 +421,7 @@
                     return Err(Error::VerificationFailure(format!(
                         "The degated role {:?} was not present in the snapshot metadata.",
                         role
-                    )))
+                    )));
                 }
             };
 
@@ -622,9 +622,9 @@
 #[cfg(test)]
 mod test {
     use super::*;
-    use crypto::{HashAlgorithm, PrivateKey, SignatureScheme};
-    use interchange::Json;
-    use metadata::{
+    use crate::crypto::{HashAlgorithm, PrivateKey, SignatureScheme};
+    use crate::interchange::Json;
+    use crate::metadata::{
         RootMetadataBuilder, SnapshotMetadataBuilder, TargetsMetadataBuilder,
         TimestampMetadataBuilder,
     };
diff --git a/src/util.rs b/src/util.rs
index c6ba957..d0deb81 100644
--- a/src/util.rs
+++ b/src/util.rs
@@ -3,9 +3,9 @@
 use ring::digest::{self, SHA256, SHA512};
 use std::io::{self, ErrorKind, Read};
 
-use crypto::{HashAlgorithm, HashValue};
-use error::Error;
-use Result;
+use crate::crypto::{HashAlgorithm, HashValue};
+use crate::error::Error;
+use crate::Result;
 
 /// Wrapper to verify a byte stream as it is read.
 ///
@@ -48,7 +48,7 @@
                         return Err(Error::IllegalArgument(format!(
                             "Unknown hash algorithm: {}",
                             s
-                        )))
+                        )));
                     }
                 };
                 Some((ctx, value))
@@ -181,7 +181,8 @@
             bytes.len() as u64,
             0,
             Some((&HashAlgorithm::Sha256, hash_value)),
-        ).unwrap();
+        )
+        .unwrap();
         let mut buf = Vec::new();
         assert!(reader.read_to_end(&mut buf).is_ok());
         assert_eq!(buf, bytes);
@@ -199,7 +200,8 @@
             bytes.len() as u64,
             0,
             Some((&HashAlgorithm::Sha256, hash_value)),
-        ).unwrap();
+        )
+        .unwrap();
         let mut buf = Vec::new();
         assert!(reader.read_to_end(&mut buf).is_err());
     }
@@ -215,7 +217,8 @@
             bytes.len() as u64,
             0,
             Some((&HashAlgorithm::Sha256, hash_value)),
-        ).unwrap();
+        )
+        .unwrap();
         let mut buf = Vec::new();
         assert!(reader.read_to_end(&mut buf).is_ok());
         assert_eq!(buf, bytes);
@@ -233,7 +236,8 @@
             bytes.len() as u64,
             0,
             Some((&HashAlgorithm::Sha256, hash_value)),
-        ).unwrap();
+        )
+        .unwrap();
         let mut buf = Vec::new();
         assert!(reader.read_to_end(&mut buf).is_err());
     }
diff --git a/tests/integration.rs b/tests/integration.rs
index ad495f0..ed63c04 100644
--- a/tests/integration.rs
+++ b/tests/integration.rs
@@ -43,10 +43,12 @@
         .insert_metadata_description(
             MetadataPath::new("targets".into()).unwrap(),
             MetadataDescription::from_reader(&*vec![0u8], 1, &[HashAlgorithm::Sha256]).unwrap(),
-        ).insert_metadata_description(
+        )
+        .insert_metadata_description(
             MetadataPath::new("delegation".into()).unwrap(),
             MetadataDescription::from_reader(&*vec![0u8], 1, &[HashAlgorithm::Sha256]).unwrap(),
-        ).signed::<Json>(&snapshot_key)
+        )
+        .signed::<Json>(&snapshot_key)
         .unwrap();
 
     let timestamp = TimestampMetadataBuilder::from_snapshot(&snapshot, &[HashAlgorithm::Sha256])
@@ -60,22 +62,22 @@
     //// build the targets ////
     let delegations = Delegations::new(
         &hashset![delegation_key.public().clone()],
-        vec![
-            Delegation::new(
-                MetadataPath::new("delegation".into()).unwrap(),
-                false,
-                1,
-                vec![delegation_key.key_id().clone()]
-                    .iter()
-                    .cloned()
-                    .collect(),
-                vec![VirtualTargetPath::new("foo".into()).unwrap()]
-                    .iter()
-                    .cloned()
-                    .collect(),
-            ).unwrap(),
-        ],
-    ).unwrap();
+        vec![Delegation::new(
+            MetadataPath::new("delegation".into()).unwrap(),
+            false,
+            1,
+            vec![delegation_key.key_id().clone()]
+                .iter()
+                .cloned()
+                .collect(),
+            vec![VirtualTargetPath::new("foo".into()).unwrap()]
+                .iter()
+                .cloned()
+                .collect(),
+        )
+        .unwrap()],
+    )
+    .unwrap();
     let targets = TargetsMetadataBuilder::new()
         .delegations(delegations)
         .signed::<Json>(&targets_key)
@@ -90,17 +92,17 @@
             VirtualTargetPath::new("foo".into()).unwrap(),
             target_file,
             &[HashAlgorithm::Sha256],
-        ).unwrap()
+        )
+        .unwrap()
         .signed::<Json>(&delegation_key)
         .unwrap();
 
     tuf.update_delegation(&MetadataPath::new("delegation".into()).unwrap(), delegation)
         .unwrap();
 
-    assert!(
-        tuf.target_description(&VirtualTargetPath::new("foo".into()).unwrap())
-            .is_ok()
-    );
+    assert!(tuf
+        .target_description(&VirtualTargetPath::new("foo".into()).unwrap())
+        .is_ok());
 }
 
 #[test]
@@ -130,13 +132,16 @@
         .insert_metadata_description(
             MetadataPath::new("targets".into()).unwrap(),
             MetadataDescription::from_reader(&*vec![0u8], 1, &[HashAlgorithm::Sha256]).unwrap(),
-        ).insert_metadata_description(
+        )
+        .insert_metadata_description(
             MetadataPath::new("delegation-a".into()).unwrap(),
             MetadataDescription::from_reader(&*vec![0u8], 1, &[HashAlgorithm::Sha256]).unwrap(),
-        ).insert_metadata_description(
+        )
+        .insert_metadata_description(
             MetadataPath::new("delegation-b".into()).unwrap(),
             MetadataDescription::from_reader(&*vec![0u8], 1, &[HashAlgorithm::Sha256]).unwrap(),
-        ).signed::<Json>(&snapshot_key)
+        )
+        .signed::<Json>(&snapshot_key)
         .unwrap();
 
     let timestamp = TimestampMetadataBuilder::from_snapshot(&snapshot, &[HashAlgorithm::Sha256])
@@ -151,22 +156,22 @@
 
     let delegations = Delegations::new(
         &hashset![delegation_a_key.public().clone()],
-        vec![
-            Delegation::new(
-                MetadataPath::new("delegation-a".into()).unwrap(),
-                false,
-                1,
-                vec![delegation_a_key.key_id().clone()]
-                    .iter()
-                    .cloned()
-                    .collect(),
-                vec![VirtualTargetPath::new("foo".into()).unwrap()]
-                    .iter()
-                    .cloned()
-                    .collect(),
-            ).unwrap(),
-        ],
-    ).unwrap();
+        vec![Delegation::new(
+            MetadataPath::new("delegation-a".into()).unwrap(),
+            false,
+            1,
+            vec![delegation_a_key.key_id().clone()]
+                .iter()
+                .cloned()
+                .collect(),
+            vec![VirtualTargetPath::new("foo".into()).unwrap()]
+                .iter()
+                .cloned()
+                .collect(),
+        )
+        .unwrap()],
+    )
+    .unwrap();
     let targets = TargetsMetadataBuilder::new()
         .delegations(delegations)
         .signed::<Json>(&targets_key)
@@ -178,22 +183,22 @@
 
     let delegations = Delegations::new(
         &hashset![delegation_b_key.public().clone()],
-        vec![
-            Delegation::new(
-                MetadataPath::new("delegation-b".into()).unwrap(),
-                false,
-                1,
-                vec![delegation_b_key.key_id().clone()]
-                    .iter()
-                    .cloned()
-                    .collect(),
-                vec![VirtualTargetPath::new("foo".into()).unwrap()]
-                    .iter()
-                    .cloned()
-                    .collect(),
-            ).unwrap(),
-        ],
-    ).unwrap();
+        vec![Delegation::new(
+            MetadataPath::new("delegation-b".into()).unwrap(),
+            false,
+            1,
+            vec![delegation_b_key.key_id().clone()]
+                .iter()
+                .cloned()
+                .collect(),
+            vec![VirtualTargetPath::new("foo".into()).unwrap()]
+                .iter()
+                .cloned()
+                .collect(),
+        )
+        .unwrap()],
+    )
+    .unwrap();
 
     let delegation = TargetsMetadataBuilder::new()
         .delegations(delegations)
@@ -203,7 +208,8 @@
     tuf.update_delegation(
         &MetadataPath::new("delegation-a".into()).unwrap(),
         delegation,
-    ).unwrap();
+    )
+    .unwrap();
 
     //// build delegation B ////
 
@@ -214,17 +220,18 @@
             VirtualTargetPath::new("foo".into()).unwrap(),
             target_file,
             &[HashAlgorithm::Sha256],
-        ).unwrap()
+        )
+        .unwrap()
         .signed::<Json>(&delegation_b_key)
         .unwrap();
 
     tuf.update_delegation(
         &MetadataPath::new("delegation-b".into()).unwrap(),
         delegation,
-    ).unwrap();
+    )
+    .unwrap();
 
-    assert!(
-        tuf.target_description(&VirtualTargetPath::new("foo".into()).unwrap())
-            .is_ok()
-    );
+    assert!(tuf
+        .target_description(&VirtualTargetPath::new("foo".into()).unwrap())
+        .is_ok());
 }
diff --git a/tests/simple_example.rs b/tests/simple_example.rs
index 8eaea1c..ff7707c 100644
--- a/tests/simple_example.rs
+++ b/tests/simple_example.rs
@@ -105,7 +105,8 @@
             config.path_translator().real_to_virtual(&target_path)?,
             target_file,
             &[HashAlgorithm::Sha256],
-        )?.signed::<Json>(&targets_key)?;
+        )?
+        .signed::<Json>(&targets_key)?;
 
     remote.store_metadata(
         &MetadataPath::new("targets".into())?,
