diff --git a/sample_project/Palettes/Charset.npal b/sample_project/Palettes/Charset.npal
index 4a1ca05d5..14f5f59a0 100644
Binary files a/sample_project/Palettes/Charset.npal and b/sample_project/Palettes/Charset.npal differ
diff --git a/sample_project/Palettes/Chester.npal b/sample_project/Palettes/Chester.npal
index e818a2669..77a2e0475 100644
--- a/sample_project/Palettes/Chester.npal
+++ b/sample_project/Palettes/Chester.npal
@@ -1 +1 @@
-M2;net.drinkingtea.nostalgia.core.Palette;1;ûÿ³Ö
\ No newline at end of file
+N1;14fc3dd8-42ff-4bf9-81f1-a010cc5ac251;M2;net.drinkingtea.nostalgia.core.Palette;1;ûÿ³Ö
diff --git a/sample_project/Palettes/Dirt.npal b/sample_project/Palettes/Dirt.npal
index 8be698b17..4e80b6938 100644
--- a/sample_project/Palettes/Dirt.npal
+++ b/sample_project/Palettes/Dirt.npal
@@ -1 +1 @@
-M2;net.drinkingtea.nostalgia.core.Palette;1;ûÿ³Ö
\ No newline at end of file
+N1;0f75977f-1c52-45f8-9793-52ea2dc200a0;M2;net.drinkingtea.nostalgia.core.Palette;1;ûÿ³Ö
diff --git a/sample_project/Palettes/Logo.npal b/sample_project/Palettes/Logo.npal
index cdf83857b..ec33e96e1 100644
--- a/sample_project/Palettes/Logo.npal
+++ b/sample_project/Palettes/Logo.npal
@@ -1 +1 @@
-M2;net.drinkingtea.nostalgia.core.Palette;1;PÛ{³ÖCˆ
\ No newline at end of file
+N1;c79f21e2-f74f-4ad9-90ed-32b0ef7da6ed;M2;net.drinkingtea.nostalgia.core.Palette;1;PÛ{³ÖCˆ
diff --git a/sample_project/Scenes/Chester.nscn b/sample_project/Scenes/Chester.nscn
index 535b35f0e..7b0ee0984 100644
Binary files a/sample_project/Scenes/Chester.nscn and b/sample_project/Scenes/Chester.nscn differ
diff --git a/sample_project/TileSheets/Charset.ng b/sample_project/TileSheets/Charset.ng
index 105b95fef..48914c0bf 100644
Binary files a/sample_project/TileSheets/Charset.ng and b/sample_project/TileSheets/Charset.ng differ
diff --git a/sample_project/TileSheets/Chester.ng b/sample_project/TileSheets/Chester.ng
index 2759e89c2..963a9e85a 100644
Binary files a/sample_project/TileSheets/Chester.ng and b/sample_project/TileSheets/Chester.ng differ
diff --git a/sample_project/TileSheets/Dirt.ng b/sample_project/TileSheets/Dirt.ng
index 8fa39b538..6d80ec4db 100644
Binary files a/sample_project/TileSheets/Dirt.ng and b/sample_project/TileSheets/Dirt.ng differ
diff --git a/sample_project/TileSheets/Logo.ng b/sample_project/TileSheets/Logo.ng
index 7e1e5450f..fdd2cabb2 100644
Binary files a/sample_project/TileSheets/Logo.ng and b/sample_project/TileSheets/Logo.ng differ
diff --git a/sample_project/TileSheets/NS_Logo.ng b/sample_project/TileSheets/NS_Logo.ng
index 5c8a7f951..f118210ad 100644
Binary files a/sample_project/TileSheets/NS_Logo.ng and b/sample_project/TileSheets/NS_Logo.ng differ
diff --git a/src/nostalgia/foundation/context.hpp b/src/nostalgia/foundation/context.hpp
index a127b553f..404844910 100644
--- a/src/nostalgia/foundation/context.hpp
+++ b/src/nostalgia/foundation/context.hpp
@@ -21,7 +21,6 @@ class Context {
 		ox::StringView appName = "Nostalgia Foundation App";
 #ifndef OX_BARE_METAL
 		AssetManager assetManager;
-		bool useUuids = false;
 		ox::HashMap<ox::String, ox::UUID> pathToUuid;
 		ox::HashMap<ox::UUIDStr, ox::String> uuidToPath;
 		ox::Vector<const class BaseConverter*> converters;
diff --git a/src/nostalgia/foundation/media.hpp b/src/nostalgia/foundation/media.hpp
index 1f50dbcfc..716517fe5 100644
--- a/src/nostalgia/foundation/media.hpp
+++ b/src/nostalgia/foundation/media.hpp
@@ -37,7 +37,7 @@ ox::Result<std::size_t> getPreloadAddr(foundation::Context *ctx, ox::CRStringVie
 template<typename T>
 ox::Result<foundation::AssetRef<T>> readObjFile(
 		foundation::Context *ctx,
-		ox::CRStringView assetId,
+		ox::StringView assetId,
 		bool forceLoad) noexcept {
 	constexpr auto readConvert = [](Context *ctx, const ox::Buffer &buff) -> ox::Result<T> {
 		auto [obj, err] = readAsset<T>(buff);
@@ -50,20 +50,24 @@ ox::Result<foundation::AssetRef<T>> readObjFile(
 		return std::move(obj);
 	};
 	ox::StringView path;
-	if (ctx->useUuids) {
+	ox::UUIDStr uuidStr;
+	if (beginsWith(assetId, "uuid://")) {
+		assetId = assetId.substr(7);
 		path = ctx->uuidToPath[assetId];
 	} else {
 		path = assetId;
+		uuidStr = ctx->pathToUuid[path].toString();
+		assetId = uuidStr;
 	}
 	if (forceLoad) {
-		oxRequire(buff, ctx->rom->read(assetId));
+		oxRequire(buff, ctx->rom->read(path));
 		oxRequire(obj, readConvert(ctx, buff));
 		oxRequire(cached, ctx->assetManager.setAsset(assetId, obj));
 		return cached;
 	} else {
 		auto [cached, err] = ctx->assetManager.getAsset<T>(assetId);
 		if (err) {
-			oxRequire(buff, ctx->rom->read(assetId));
+			oxRequire(buff, ctx->rom->read(path));
 			oxRequire(obj, readConvert(ctx, buff));
 			oxReturnError(ctx->assetManager.setAsset(assetId, obj).moveTo(&cached));
 		}
diff --git a/src/nostalgia/tools/pack/pack.cpp b/src/nostalgia/tools/pack/pack.cpp
index 6d2fd9ef2..7bf0c649c 100644
--- a/src/nostalgia/tools/pack/pack.cpp
+++ b/src/nostalgia/tools/pack/pack.cpp
@@ -13,7 +13,7 @@
 
 namespace nostalgia {
 
-static ox::Error pathToInode(ox::FileSystem *dest, ox::ModelObject *obj) noexcept {
+static ox::Error pathToInode(foundation::Context *ctx, ox::FileSystem *dest, ox::ModelObject *obj) noexcept {
 	auto &o = *obj;
 	auto type = static_cast<ox::FileAddressType>(o["type"].get<int8_t>());
 	auto &data = o["data"].get<ox::ModelUnion>();
@@ -29,28 +29,32 @@ static ox::Error pathToInode(ox::FileSystem *dest, ox::ModelObject *obj) noexcep
 		case ox::FileAddressType::None:
 			return {};
 	}
+	if (beginsWith(path, "uuid://")) {
+		const auto uuid = ox::StringView(path).substr(7);
+		path = ctx->uuidToPath[uuid];
+	}
 	oxRequire(s, dest->stat(path));
 	oxReturnError(o["type"].set(static_cast<int8_t>(ox::FileAddressType::Inode)));
 	return data.set(2, s.inode);
 }
 
-static ox::Error transformFileAddressesObj(ox::FileSystem *dest, ox::ModelObject *obj) noexcept;
-static ox::Error transformFileAddressesVec(ox::FileSystem *dest, ox::ModelValueVector *v) noexcept;
+static ox::Error transformFileAddressesObj(foundation::Context *ctx, ox::FileSystem *dest, ox::ModelObject *obj) noexcept;
+static ox::Error transformFileAddressesVec(foundation::Context *ctx, ox::FileSystem *dest, ox::ModelValueVector *v) noexcept;
 
-static ox::Error transformFileAddresses(ox::FileSystem *dest, ox::ModelValue *v) noexcept {
+static ox::Error transformFileAddresses(foundation::Context *ctx, ox::FileSystem *dest, ox::ModelValue *v) noexcept {
 	if (v->type() == ox::ModelValue::Type::Object) {
 		auto &obj = v->get<ox::ModelObject>();
-		return transformFileAddressesObj(dest, &obj);
+		return transformFileAddressesObj(ctx, dest, &obj);
 	} else if (v->type() == ox::ModelValue::Type::Vector) {
 		auto &vec = v->get<ox::ModelValueVector>();
-		return transformFileAddressesVec(dest, &vec);
+		return transformFileAddressesVec(ctx, dest, &vec);
 	}
 	return {};
 }
 
-static ox::Error transformFileAddressesVec(ox::FileSystem *dest, ox::ModelValueVector *v) noexcept {
+static ox::Error transformFileAddressesVec(foundation::Context *ctx, ox::FileSystem *dest, ox::ModelValueVector *v) noexcept {
 	for (auto &f : *v) {
-		oxReturnError(transformFileAddresses(dest, &f));
+		oxReturnError(transformFileAddresses(ctx, dest, &f));
 	}
 	return {};
 }
@@ -59,13 +63,13 @@ static ox::Error transformFileAddressesVec(ox::FileSystem *dest, ox::ModelValueV
  * Convert path references in Claw data to inodes to save space
  * @return error
  */
-static ox::Error transformFileAddressesObj(ox::FileSystem *dest, ox::ModelObject *obj) noexcept {
+static ox::Error transformFileAddressesObj(foundation::Context *ctx, ox::FileSystem *dest, ox::ModelObject *obj) noexcept {
 	if (obj->typeName() == "net.drinkingtea.ox.FileAddress" && obj->typeVersion() == 1) {
-		return pathToInode(dest, obj);
+		return pathToInode(ctx, dest, obj);
 	}
 	for (auto &f : *obj) {
 		auto &v = f->value;
-		oxReturnError(transformFileAddresses(dest, &v));
+		oxReturnError(transformFileAddresses(ctx, dest, &v));
 	}
 	return {};
 }
@@ -80,7 +84,7 @@ static ox::Error doTransformations(foundation::Context *ctx, ox::TypeStore *ts,
 	}
 	// transform FileAddresses
 	oxRequireM(obj, foundation::readAsset(ts, buff));
-	oxReturnError(transformFileAddressesObj(dest, &obj));
+	oxReturnError(transformFileAddressesObj(ctx, dest, &obj));
 	oxReturnError(ox::writeClaw(&obj).moveTo(&buff));
 	// write file to dest
 	oxReturnError(dest->write(s.inode, buff.data(), buff.size()));
