diff --git a/src/main/java/link/infra/packwiz/installer/UpdateManager.java b/src/main/java/link/infra/packwiz/installer/UpdateManager.java
index 5ca183f..ac3a6a4 100644
--- a/src/main/java/link/infra/packwiz/installer/UpdateManager.java
+++ b/src/main/java/link/infra/packwiz/installer/UpdateManager.java
@@ -157,10 +157,9 @@ public class UpdateManager {
 			ui.handleExceptionAndExit(e1);
 		}
 
-		// When successfully updated
+		// TODO: update MMC params, java args etc
+
 		manifest.packFileHash = packFileSource.getHash();
-		// update other hashes
-		// TODO: don't do this on failure?
 		try (Writer writer = new FileWriter(Paths.get(opts.packFolder, opts.manifestFile).toString())) {
 			gson.toJson(manifest, writer);
 		} catch (IOException e) {
@@ -271,6 +270,13 @@ public class UpdateManager {
 						} catch (Exception e) {}
 					}
 
+					// Don't update files marked with preserve if they already exist on disk
+					if (f.preserve) {
+						if (Files.exists(Paths.get(opts.packFolder, f.getDestURI().toString()))) {
+							return dc;
+						}
+					}
+
 					try {
 						Hash hash;
 						String fileHashFormat;
diff --git a/src/main/java/link/infra/packwiz/installer/metadata/IndexFile.java b/src/main/java/link/infra/packwiz/installer/metadata/IndexFile.java
index e4da16f..26d4985 100644
--- a/src/main/java/link/infra/packwiz/installer/metadata/IndexFile.java
+++ b/src/main/java/link/infra/packwiz/installer/metadata/IndexFile.java
@@ -26,10 +26,8 @@ public class IndexFile {
 		@SerializedName("hash-format")
 		public String hashFormat;
 		public String hash;
-		// TODO: implement
-		public String alias;
+		public URI alias;
 		public boolean metafile;
-		// TODO: implement
 		public boolean preserve;
 
 		public transient ModFile linkedFile;
@@ -96,6 +94,9 @@ public class IndexFile {
 		}
 
 		public URI getDestURI() {
+			if (alias != null) {
+				return alias;
+			}
 			if (metafile && linkedFile != null) {
 				// TODO: URIs are bad
 				return file.resolve(linkedFile.filename.replace(" ", "%20"));