--- NoesisGUI/Source/NoesisRuntime/Classes/NoesisSettings.h	2026-10-09 12:29:51.000000000 0100
+++ NoesisGUI\Source\NoesisRuntime\Classes\NoesisSettings.h	2026-10-09 12:29:51.000000000 0100
@@ -11,6 +11,10 @@
 // CoreUObject includes
 #include "UObject/SoftObjectPtr.h"
 
+// @Custom
+#include "UObject/SoftObjectPath.h"
+// @~Custom
+
 // NoesisRuntime includes
 #include "NoesisEnums.h"
 
@@ -63,6 +67,22 @@
 	int Order = -1;
 };
 
+// @Custom
+USTRUCT()
+struct FStudioProjectAssemblyMapping
+{
+	GENERATED_USTRUCT_BODY()
+
+	/** The Noesis assembly name (as referenced by a Uri) to map to a content directory. */
+	UPROPERTY(EditAnywhere, Config, Category = Studio)
+	FString AssemblyName;
+
+	/** Content directory whose assets should resolve for this assembly. */
+	UPROPERTY(EditAnywhere, Config, Category = Studio, meta = (ContentDir))
+	FDirectoryPath Directory;
+};
+// @~Custom
+
 UCLASS(Config = Engine, DefaultConfig)
 class NOESISRUNTIME_API UNoesisSettings : public UObject
 {
@@ -108,6 +128,12 @@
 	UPROPERTY(EditAnywhere, Config, Category = "Studio")
 	TArray<FStudioProjectConfig> StudioProjects;
 
+// @Custom
+	/** Maps a Noesis assembly name to the content directory its assets are loaded from */
+	UPROPERTY(EditAnywhere, Config, Category = "Studio")
+	TArray<FStudioProjectAssemblyMapping> StudioProjectAssemblyMappings;
+// @~Custom
+
 	/** Dimensions of texture used to cache glyphs */
 	UPROPERTY(EditAnywhere, Config, Category = "Rendering", meta = (ConfigRestartRequired = true))
 	ENoesisGlyphCacheDimensions GlyphTextureSize;
--- NoesisGUI/Source/NoesisRuntime/Public/NoesisSupport.h	2026-05-01 13:13:58.000000000 0100
+++ NoesisGUI\Source\NoesisRuntime\Public\NoesisSupport.h	2026-05-01 13:13:58.000000000 0100
@@ -15,6 +15,11 @@
 // Noesis includes
 #include "NoesisSDK.h"
 
+// @Custom
+// NoesisRuntime includes
+#include "NoesisSettings.h"
+// @~Custom
+
 inline FString NsStringToFString(const char* String)
 {
 	return FString(StringCast<TCHAR>((UTF8CHAR*)String).Get());
@@ -70,9 +75,33 @@
 	Noesis::String Assembly;
 	Uri.GetAssembly(Assembly);
 
-	FString AssetPath = TEXT("/");
-	AssetPath += (UTF8CHAR*)GetAssetRoot(Assembly).Str();
-	AssetPath += TEXT("/") + SafePath;
+// @Custom
+	FString AssetPath;
+	
+	const FString AssemblyName = NsStringToFString(Assembly.Str());
+	const TArray<FStudioProjectAssemblyMapping>& StudioProjectAssemblyMappings = GetDefault<UNoesisSettings>()->StudioProjectAssemblyMappings;
+	const FStudioProjectAssemblyMapping* MappedEntry = StudioProjectAssemblyMappings.FindByPredicate([&AssemblyName](const FStudioProjectAssemblyMapping& Mapping)
+	{
+		return Mapping.AssemblyName == AssemblyName;
+	});
+	
+	if (MappedEntry != nullptr)
+	{
+		// Mapping found - use path defined in setting to map to
+		FString MappedPath = MappedEntry->Directory.Path;
+		if (!MappedPath.IsEmpty() && !MappedPath.EndsWith(TEXT("/")))
+		{
+			MappedPath += TEXT("/");
+		}
+		AssetPath = MappedPath + SafePath;
+	}
+	else
+	{
+		AssetPath += TEXT("/");
+		AssetPath += (UTF8CHAR*)GetAssetRoot(Assembly).Str();
+		AssetPath += TEXT("/") + SafePath;
+	}
+// @~Custom
 
 	return AssetPath;
 }
