diff --git a/src/client.rs b/src/client.rs
index c8d8ef5..7edea98 100644
--- a/src/client.rs
+++ b/src/client.rs
@@ -155,7 +155,7 @@
                 )
             })?;
 
-        let tuf = Tuf::from_root(root)?;
+        let tuf = Tuf::from_root(&root)?;
 
         Ok(Client {
             tuf: tuf,
@@ -302,13 +302,13 @@
                 config.min_bytes_per_second,
                 None,
             )?;
-            if !tuf.update_root(signed)? {
+            if !tuf.update_root(&signed)? {
                 error!("{}", err_msg);
                 return Err(Error::Programming(err_msg.into()));
             }
         }
 
-        if !tuf.update_root(latest_root)? {
+        if !tuf.update_root(&latest_root)? {
             error!("{}", err_msg);
             return Err(Error::Programming(err_msg.into()));
         }
@@ -329,7 +329,7 @@
             config.min_bytes_per_second,
             None,
         )?;
-        tuf.update_timestamp(ts)
+        tuf.update_timestamp(&ts)
     }
 
     /// Returns `true` if an update occurred and `false` otherwise.
@@ -364,7 +364,7 @@
             config.min_bytes_per_second,
             Some((alg, value.clone())),
         )?;
-        tuf.update_snapshot(snap)
+        tuf.update_snapshot(&snap)
     }
 
     /// Returns `true` if an update occurred and `false` otherwise.
@@ -408,7 +408,7 @@
             config.min_bytes_per_second,
             Some((alg, value.clone())),
         )?;
-        tuf.update_targets(targets)
+        tuf.update_targets(&targets)
     }
 
     /// Fetch a target from the remote repo and write it to the local repo.
@@ -545,7 +545,7 @@
                     }
                 };
 
-                match tuf.update_delegation(delegation.role(), signed_meta.clone()) {
+                match tuf.update_delegation(delegation.role(), &signed_meta) {
                     Ok(_) => {
                         match local.store_metadata(
                             &Role::Targets,
diff --git a/src/error.rs b/src/error.rs
index 11dddbf..4cfc435 100644
--- a/src/error.rs
+++ b/src/error.rs
@@ -78,7 +78,7 @@
 
 impl Error {
     /// Helper to include the path that causd the error for FS I/O errors.
-    pub fn from_io(err: io::Error, path: &Path) -> Error {
+    pub fn from_io(err: &io::Error, path: &Path) -> Error {
         Error::Opaque(format!("Path {:?} : {:?}", path, err))
     }
 }
diff --git a/src/metadata.rs b/src/metadata.rs
index 7c349d0..dd782fe 100644
--- a/src/metadata.rs
+++ b/src/metadata.rs
@@ -1308,7 +1308,7 @@
     // TODO check all keys are used
     // TODO check all roles have their ID in the set of keys
     /// Create a new `Delegations` wrapper from the given set of trusted keys and roles.
-    pub fn new(keys: HashSet<PublicKey>, roles: Vec<Delegation>) -> Result<Self> {
+    pub fn new(keys: &HashSet<PublicKey>, roles: Vec<Delegation>) -> Result<Self> {
         if keys.is_empty() {
             return Err(Error::IllegalArgument("Keys cannot be empty.".into()));
         }
@@ -1787,7 +1787,7 @@
     fn serde_targets_with_delegations_metadata() {
         let key = PrivateKey::from_pkcs8(ED25519_1_PK8, SignatureScheme::Ed25519).unwrap();
         let delegations = Delegations::new(
-            hashset![key.public().clone()],
+            &hashset![key.public().clone()],
             vec![Delegation::new(
                 MetadataPath::new("foo/bar".into()).unwrap(),
                 false,
@@ -1988,7 +1988,7 @@
             .public()
             .clone();
         let delegations = Delegations::new(
-            hashset![key.clone()],
+            &hashset![key.clone()],
             vec![Delegation::new(
                 MetadataPath::new("foo".into()).unwrap(),
                 false,
@@ -2328,7 +2328,7 @@
             .public()
             .clone();
         let delegations = Delegations::new(
-            hashset!(key.clone()),
+            &hashset!(key.clone()),
             vec![Delegation::new(
                 MetadataPath::new("foo".into()).unwrap(),
                 false,
diff --git a/src/shims.rs b/src/shims.rs
index e252aec..a4842c8 100644
--- a/src/shims.rs
+++ b/src/shims.rs
@@ -343,7 +343,7 @@
         if keys.len() != keys_len {
             return Err(Error::Encoding("Cannot have duplicate keys".into()));
         }
-        metadata::Delegations::new(keys, self.roles)
+        metadata::Delegations::new(&keys, self.roles)
     }
 }
 
diff --git a/src/tuf.rs b/src/tuf.rs
index eea3eec..a13d5c6 100644
--- a/src/tuf.rs
+++ b/src/tuf.rs
@@ -37,14 +37,14 @@
         signed_root.signatures_mut().retain(|s| {
             root_key_ids.contains(s.key_id())
         });
-        Self::from_root(signed_root)
+        Self::from_root(&signed_root)
     }
 
     /// Create a new `TUF` struct from a piece of metadata that is assumed to be trusted.
     ///
     /// **WARNING**: This is trust-on-first-use (TOFU) and offers weaker security guarantees than
     /// the related method `from_root_pinned`.
-    pub fn from_root(signed_root: SignedMetadata<D, RootMetadata>) -> Result<Self> {
+    pub fn from_root(signed_root: &SignedMetadata<D, RootMetadata>) -> Result<Self> {
         let root = D::deserialize::<RootMetadata>(signed_root.signed())?;
         let _ = signed_root.verify(
             root.root().threshold(),
@@ -95,7 +95,7 @@
     }
 
     /// Verify and update the root metadata.
-    pub fn update_root(&mut self, signed_root: SignedMetadata<D, RootMetadata>) -> Result<bool> {
+    pub fn update_root(&mut self, signed_root: &SignedMetadata<D, RootMetadata>) -> Result<bool> {
         signed_root.verify(
             self.root.root().threshold(),
             self.root.keys().iter().filter_map(|(k, v)| {
@@ -150,7 +150,7 @@
     /// Verify and update the timestamp metadata.
     pub fn update_timestamp(
         &mut self,
-        signed_timestamp: SignedMetadata<D, TimestampMetadata>,
+        signed_timestamp: &SignedMetadata<D, TimestampMetadata>,
     ) -> Result<bool> {
         signed_timestamp.verify(
             self.root.timestamp().threshold(),
@@ -196,7 +196,7 @@
     /// Verify and update the snapshot metadata.
     pub fn update_snapshot(
         &mut self,
-        signed_snapshot: SignedMetadata<D, SnapshotMetadata>,
+        signed_snapshot: &SignedMetadata<D, SnapshotMetadata>,
     ) -> Result<bool> {
         let snapshot = {
             let root = self.safe_root_ref()?;
@@ -289,7 +289,7 @@
     /// Verify and update the targets metadata.
     pub fn update_targets(
         &mut self,
-        signed_targets: SignedMetadata<D, TargetsMetadata>,
+        signed_targets: &SignedMetadata<D, TargetsMetadata>,
     ) -> Result<bool> {
         let targets = {
             let root = self.safe_root_ref()?;
@@ -351,7 +351,7 @@
     pub fn update_delegation(
         &mut self,
         role: &MetadataPath,
-        signed: SignedMetadata<D, TargetsMetadata>,
+        signed: &SignedMetadata<D, TargetsMetadata>,
     ) -> Result<bool> {
         let delegation = {
             let _ = self.safe_root_ref()?;
@@ -458,7 +458,7 @@
             current_depth: u32,
             target_path: &VirtualTargetPath,
             delegations: &Delegations,
-            parents: Vec<HashSet<VirtualTargetPath>>,
+            parents: &[HashSet<VirtualTargetPath>],
             visited: &mut HashSet<MetadataPath>,
         ) -> (bool, Option<TargetDescription>) {
             for delegation in delegations.roles() {
@@ -467,7 +467,7 @@
                 }
                 let _ = visited.insert(delegation.role().clone());
 
-                let mut new_parents = parents.clone();
+                let mut new_parents = parents.to_owned();
                 new_parents.push(delegation.paths().clone());
 
                 if current_depth > 0 && !target_path.matches_chain(&parents) {
@@ -496,7 +496,7 @@
                         current_depth + 1,
                         target_path,
                         d,
-                        new_parents,
+                        &new_parents,
                         visited,
                     );
                     if term {
@@ -512,7 +512,7 @@
         match targets.delegations() {
             Some(d) => {
                 let mut visited = HashSet::new();
-                lookup(self, false, 0, target_path, d, vec![], &mut visited)
+                lookup(self, false, 0, target_path, d, &[], &mut visited)
                     .1
                     .ok_or_else(|| Error::TargetUnavailable)
             }
@@ -645,7 +645,7 @@
         let root: SignedMetadata<Json, RootMetadata> = SignedMetadata::new(&root, &KEYS[0])
             .unwrap();
 
-        let mut tuf = Tuf::from_root(root).unwrap();
+        let mut tuf = Tuf::from_root(&root).unwrap();
 
         let root = RootMetadata::new(
             2,
@@ -663,10 +663,10 @@
         // add the original key's signature to make it cross signed
         root.add_signature(&KEYS[0]).unwrap();
 
-        assert_eq!(tuf.update_root(root.clone()), Ok(true));
+        assert_eq!(tuf.update_root(&root), Ok(true));
 
         // second update should do nothing
-        assert_eq!(tuf.update_root(root), Ok(false));
+        assert_eq!(tuf.update_root(&root), Ok(false));
     }
 
     #[test]
@@ -684,7 +684,7 @@
         let root: SignedMetadata<Json, RootMetadata> = SignedMetadata::new(&root, &KEYS[0])
             .unwrap();
 
-        let mut tuf = Tuf::from_root(root).unwrap();
+        let mut tuf = Tuf::from_root(&root).unwrap();
 
         let root = RootMetadata::new(
             2,
@@ -700,7 +700,7 @@
         let root: SignedMetadata<Json, RootMetadata> = SignedMetadata::new(&root, &KEYS[1])
             .unwrap();
 
-        assert!(tuf.update_root(root).is_err());
+        assert!(tuf.update_root(&root).is_err());
     }
 
     #[test]
@@ -718,7 +718,7 @@
         let root: SignedMetadata<Json, RootMetadata> = SignedMetadata::new(&root, &KEYS[0])
             .unwrap();
 
-        let mut tuf = Tuf::from_root(root).unwrap();
+        let mut tuf = Tuf::from_root(&root).unwrap();
 
         let timestamp = TimestampMetadata::new(
             1,
@@ -729,10 +729,10 @@
         let timestamp: SignedMetadata<Json, TimestampMetadata> =
             SignedMetadata::new(&timestamp, &KEYS[1]).unwrap();
 
-        assert_eq!(tuf.update_timestamp(timestamp.clone()), Ok(true));
+        assert_eq!(tuf.update_timestamp(&timestamp), Ok(true));
 
         // second update should do nothing
-        assert_eq!(tuf.update_timestamp(timestamp), Ok(false))
+        assert_eq!(tuf.update_timestamp(&timestamp), Ok(false))
     }
 
     #[test]
@@ -750,7 +750,7 @@
         let root: SignedMetadata<Json, RootMetadata> = SignedMetadata::new(&root, &KEYS[0])
             .unwrap();
 
-        let mut tuf = Tuf::from_root(root).unwrap();
+        let mut tuf = Tuf::from_root(&root).unwrap();
 
         let timestamp = TimestampMetadata::new(
             1,
@@ -763,7 +763,7 @@
         let timestamp: SignedMetadata<Json, TimestampMetadata> =
             SignedMetadata::new(&timestamp, &KEYS[0]).unwrap();
 
-        assert!(tuf.update_timestamp(timestamp).is_err())
+        assert!(tuf.update_timestamp(&timestamp).is_err())
     }
 
     #[test]
@@ -785,7 +785,7 @@
         let root: SignedMetadata<Json, RootMetadata> = SignedMetadata::new(&root, &KEYS[0])
             .unwrap();
 
-        let mut tuf = Tuf::from_root(root).unwrap();
+        let mut tuf = Tuf::from_root(&root).unwrap();
 
         let timestamp = TimestampMetadata::new(
             1,
@@ -796,17 +796,17 @@
         let timestamp: SignedMetadata<Json, TimestampMetadata> =
             SignedMetadata::new(&timestamp, &KEYS[2]).unwrap();
 
-        tuf.update_timestamp(timestamp).unwrap();
+        tuf.update_timestamp(&timestamp).unwrap();
 
         let snapshot = SnapshotMetadata::new(1, Utc.ymd(2038, 1, 1).and_hms(0, 0, 0), hashmap!())
             .unwrap();
         let snapshot: SignedMetadata<Json, SnapshotMetadata> =
             SignedMetadata::new(&snapshot, &KEYS[1]).unwrap();
 
-        assert_eq!(tuf.update_snapshot(snapshot.clone()), Ok(true));
+        assert_eq!(tuf.update_snapshot(&snapshot), Ok(true));
 
         // second update should do nothing
-        assert_eq!(tuf.update_snapshot(snapshot), Ok(false));
+        assert_eq!(tuf.update_snapshot(&snapshot), Ok(false));
     }
 
     #[test]
@@ -828,7 +828,7 @@
         let root: SignedMetadata<Json, RootMetadata> = SignedMetadata::new(&root, &KEYS[0])
             .unwrap();
 
-        let mut tuf = Tuf::from_root(root).unwrap();
+        let mut tuf = Tuf::from_root(&root).unwrap();
 
         let timestamp = TimestampMetadata::new(
             1,
@@ -839,14 +839,14 @@
         let timestamp: SignedMetadata<Json, TimestampMetadata> =
             SignedMetadata::new(&timestamp, &KEYS[2]).unwrap();
 
-        tuf.update_timestamp(timestamp).unwrap();
+        tuf.update_timestamp(&timestamp).unwrap();
 
         let snapshot = SnapshotMetadata::new(1, Utc.ymd(2038, 1, 1).and_hms(0, 0, 0), hashmap!())
             .unwrap();
         let snapshot: SignedMetadata<Json, SnapshotMetadata> =
             SignedMetadata::new(&snapshot, &KEYS[2]).unwrap();
 
-        assert!(tuf.update_snapshot(snapshot.clone()).is_err());
+        assert!(tuf.update_snapshot(&snapshot).is_err());
     }
 
     #[test]
@@ -868,7 +868,7 @@
         let root: SignedMetadata<Json, RootMetadata> = SignedMetadata::new(&root, &KEYS[0])
             .unwrap();
 
-        let mut tuf = Tuf::from_root(root).unwrap();
+        let mut tuf = Tuf::from_root(&root).unwrap();
 
         let timestamp = TimestampMetadata::new(
             1,
@@ -879,14 +879,14 @@
         let timestamp: SignedMetadata<Json, TimestampMetadata> =
             SignedMetadata::new(&timestamp, &KEYS[2]).unwrap();
 
-        tuf.update_timestamp(timestamp).unwrap();
+        tuf.update_timestamp(&timestamp).unwrap();
 
         let snapshot = SnapshotMetadata::new(1, Utc.ymd(2038, 1, 1).and_hms(0, 0, 0), hashmap!())
             .unwrap();
         let snapshot: SignedMetadata<Json, SnapshotMetadata> =
             SignedMetadata::new(&snapshot, &KEYS[1]).unwrap();
 
-        assert!(tuf.update_snapshot(snapshot).is_err());
+        assert!(tuf.update_snapshot(&snapshot).is_err());
     }
 
     #[test]
@@ -909,7 +909,7 @@
         let root: SignedMetadata<Json, RootMetadata> = SignedMetadata::new(&root, &KEYS[0])
             .unwrap();
 
-        let mut tuf = Tuf::from_root(root).unwrap();
+        let mut tuf = Tuf::from_root(&root).unwrap();
 
         let timestamp = TimestampMetadata::new(
             1,
@@ -920,7 +920,7 @@
         let timestamp: SignedMetadata<Json, TimestampMetadata> =
             SignedMetadata::new(&timestamp, &KEYS[3]).unwrap();
 
-        tuf.update_timestamp(timestamp).unwrap();
+        tuf.update_timestamp(&timestamp).unwrap();
 
         let meta_map =
             hashmap!(
@@ -932,7 +932,7 @@
         let snapshot: SignedMetadata<Json, SnapshotMetadata> =
             SignedMetadata::new(&snapshot, &KEYS[1]).unwrap();
 
-        tuf.update_snapshot(snapshot).unwrap();
+        tuf.update_snapshot(&snapshot).unwrap();
 
         let targets =
             TargetsMetadata::new(1, Utc.ymd(2038, 1, 1).and_hms(0, 0, 0), hashmap!(), None)
@@ -940,10 +940,10 @@
         let targets: SignedMetadata<Json, TargetsMetadata> =
             SignedMetadata::new(&targets, &KEYS[2]).unwrap();
 
-        assert_eq!(tuf.update_targets(targets.clone()), Ok(true));
+        assert_eq!(tuf.update_targets(&targets), Ok(true));
 
         // second update should do nothing
-        assert_eq!(tuf.update_targets(targets), Ok(false));
+        assert_eq!(tuf.update_targets(&targets), Ok(false));
     }
 
     #[test]
@@ -966,7 +966,7 @@
         let root: SignedMetadata<Json, RootMetadata> = SignedMetadata::new(&root, &KEYS[0])
             .unwrap();
 
-        let mut tuf = Tuf::from_root(root).unwrap();
+        let mut tuf = Tuf::from_root(&root).unwrap();
 
         let timestamp = TimestampMetadata::new(
             1,
@@ -977,7 +977,7 @@
         let timestamp: SignedMetadata<Json, TimestampMetadata> =
             SignedMetadata::new(&timestamp, &KEYS[3]).unwrap();
 
-        tuf.update_timestamp(timestamp).unwrap();
+        tuf.update_timestamp(&timestamp).unwrap();
 
         let meta_map =
             hashmap!(
@@ -989,7 +989,7 @@
         let snapshot: SignedMetadata<Json, SnapshotMetadata> =
             SignedMetadata::new(&snapshot, &KEYS[1]).unwrap();
 
-        tuf.update_snapshot(snapshot).unwrap();
+        tuf.update_snapshot(&snapshot).unwrap();
 
         let targets =
             TargetsMetadata::new(1, Utc.ymd(2038, 1, 1).and_hms(0, 0, 0), hashmap!(), None)
@@ -997,7 +997,7 @@
         let targets: SignedMetadata<Json, TargetsMetadata> =
             SignedMetadata::new(&targets, &KEYS[3]).unwrap();
 
-        assert!(tuf.update_targets(targets).is_err());
+        assert!(tuf.update_targets(&targets).is_err());
     }
 
     #[test]
@@ -1020,7 +1020,7 @@
         let root: SignedMetadata<Json, RootMetadata> = SignedMetadata::new(&root, &KEYS[0])
             .unwrap();
 
-        let mut tuf = Tuf::from_root(root).unwrap();
+        let mut tuf = Tuf::from_root(&root).unwrap();
 
         let timestamp = TimestampMetadata::new(
             1,
@@ -1031,7 +1031,7 @@
         let timestamp: SignedMetadata<Json, TimestampMetadata> =
             SignedMetadata::new(&timestamp, &KEYS[3]).unwrap();
 
-        tuf.update_timestamp(timestamp).unwrap();
+        tuf.update_timestamp(&timestamp).unwrap();
 
         let meta_map =
             hashmap!(
@@ -1043,7 +1043,7 @@
         let snapshot: SignedMetadata<Json, SnapshotMetadata> =
             SignedMetadata::new(&snapshot, &KEYS[1]).unwrap();
 
-        tuf.update_snapshot(snapshot).unwrap();
+        tuf.update_snapshot(&snapshot).unwrap();
 
         let targets =
             TargetsMetadata::new(1, Utc.ymd(2038, 1, 1).and_hms(0, 0, 0), hashmap!(), None)
@@ -1051,6 +1051,6 @@
         let targets: SignedMetadata<Json, TargetsMetadata> =
             SignedMetadata::new(&targets, &KEYS[2]).unwrap();
 
-        assert!(tuf.update_targets(targets).is_err());
+        assert!(tuf.update_targets(&targets).is_err());
     }
 }
diff --git a/tests/integration.rs b/tests/integration.rs
index 4f46a83..4a7fd3c 100644
--- a/tests/integration.rs
+++ b/tests/integration.rs
@@ -63,7 +63,7 @@
     let signed = SignedMetadata::<Json, TimestampMetadata>::new(&timestamp, &timestamp_key)
         .unwrap();
 
-    tuf.update_timestamp(signed).unwrap();
+    tuf.update_timestamp(&signed).unwrap();
 
     //// build the snapshot ////
     let meta_map =
@@ -78,11 +78,11 @@
 
     let signed = SignedMetadata::<Json, SnapshotMetadata>::new(&snapshot, &snapshot_key).unwrap();
 
-    tuf.update_snapshot(signed).unwrap();
+    tuf.update_snapshot(&signed).unwrap();
 
     //// build the targets ////
     let delegations = Delegations::new(
-        hashset![delegation_key.public().clone()],
+        &hashset![delegation_key.public().clone()],
         vec![
             Delegation::new(
                 MetadataPath::new("delegation".into()).unwrap(),
@@ -108,7 +108,7 @@
 
     let signed = SignedMetadata::<Json, TargetsMetadata>::new(&targets, &targets_key).unwrap();
 
-    tuf.update_targets(signed).unwrap();
+    tuf.update_targets(&signed).unwrap();
 
     //// build the delegation ////
     let target_file: &[u8] = b"bar";
@@ -123,7 +123,7 @@
     let signed = SignedMetadata::<Json, TargetsMetadata>::new(&delegation, &delegation_key)
         .unwrap();
 
-    tuf.update_delegation(&MetadataPath::new("delegation".into()).unwrap(), signed)
+    tuf.update_delegation(&MetadataPath::new("delegation".into()).unwrap(), &signed)
         .unwrap();
 
     assert!(
@@ -176,7 +176,7 @@
     let signed = SignedMetadata::<Json, TimestampMetadata>::new(&timestamp, &timestamp_key)
         .unwrap();
 
-    tuf.update_timestamp(signed).unwrap();
+    tuf.update_timestamp(&signed).unwrap();
 
     //// build the snapshot ////
     let meta_map =
@@ -193,11 +193,11 @@
 
     let signed = SignedMetadata::<Json, SnapshotMetadata>::new(&snapshot, &snapshot_key).unwrap();
 
-    tuf.update_snapshot(signed).unwrap();
+    tuf.update_snapshot(&signed).unwrap();
 
     //// build the targets ////
     let delegations = Delegations::new(
-        hashset![delegation_a_key.public().clone()],
+        &hashset![delegation_a_key.public().clone()],
         vec![
             Delegation::new(
                 MetadataPath::new("delegation-a".into()).unwrap(),
@@ -223,11 +223,11 @@
 
     let signed = SignedMetadata::<Json, TargetsMetadata>::new(&targets, &targets_key).unwrap();
 
-    tuf.update_targets(signed).unwrap();
+    tuf.update_targets(&signed).unwrap();
 
     //// build delegation A ////
     let delegations = Delegations::new(
-        hashset![delegation_b_key.public().clone()],
+        &hashset![delegation_b_key.public().clone()],
         vec![
             Delegation::new(
                 MetadataPath::new("delegation-b".into()).unwrap(),
@@ -254,7 +254,7 @@
     let signed = SignedMetadata::<Json, TargetsMetadata>::new(&delegation, &delegation_a_key)
         .unwrap();
 
-    tuf.update_delegation(&MetadataPath::new("delegation-a".into()).unwrap(), signed)
+    tuf.update_delegation(&MetadataPath::new("delegation-a".into()).unwrap(), &signed)
         .unwrap();
 
     //// build delegation B ////
@@ -271,7 +271,7 @@
     let signed = SignedMetadata::<Json, TargetsMetadata>::new(&delegation, &delegation_b_key)
         .unwrap();
 
-    tuf.update_delegation(&MetadataPath::new("delegation-b".into()).unwrap(), signed)
+    tuf.update_delegation(&MetadataPath::new("delegation-b".into()).unwrap(), &signed)
         .unwrap();
 
     assert!(
