diff --git a/strafe-client/src/file.rs b/strafe-client/src/file.rs
index 81d4fd31b..fcc079622 100644
--- a/strafe-client/src/file.rs
+++ b/strafe-client/src/file.rs
@@ -1,5 +1,8 @@
 use std::io::Read;
 
+#[cfg(any(feature="roblox",feature="source"))]
+use strafesnet_deferred_loader::deferred_loader::{LoadFailureMode,MeshDeferredLoader,RenderConfigDeferredLoader};
+
 #[allow(dead_code)]
 #[derive(Debug)]
 pub enum ReadError{
@@ -65,7 +68,10 @@ pub fn read<R:Read+std::io::Seek>(input:R)->Result<ReadFormat,ReadError>{
 pub enum LoadError{
 	ReadError(ReadError),
 	File(std::io::Error),
-	Io(std::io::Error),
+	#[cfg(feature="roblox")]
+	LoadRobloxMesh(strafesnet_rbx_loader::loader::MeshError),
+	#[cfg(feature="roblox")]
+	LoadRobloxTexture(strafesnet_rbx_loader::loader::TextureError),
 }
 impl std::fmt::Display for LoadError{
 	fn fmt(&self,f:&mut std::fmt::Formatter<'_>)->std::fmt::Result{
@@ -94,34 +100,24 @@ pub fn load<P:AsRef<std::path::Path>>(path:P)->Result<LoadFormat,LoadError>{
 			let mut place=model.into_place();
 			place.run_scripts();
 
-			let mut loader=strafesnet_deferred_loader::roblox_legacy();
-
-			let (texture_loader,mesh_loader)=loader.get_inner_mut();
+			let mut texture_deferred_loader=RenderConfigDeferredLoader::new();
+			let mut mesh_deferred_loader=MeshDeferredLoader::new();
 
 			let map_step1=strafesnet_rbx_loader::convert(
-				&place,
-				|name|texture_loader.acquire_render_config_id(name),
-				|name|mesh_loader.acquire_mesh_id(name),
+				place.as_ref(),
+				&mut texture_deferred_loader,
+				&mut mesh_deferred_loader,
 			);
 
-			let meshpart_meshes=mesh_loader.load_meshes().map_err(LoadError::Io)?;
+			let mut mesh_loader=strafesnet_rbx_loader::loader::MeshLoader::new();
+			let meshpart_meshes=mesh_deferred_loader.into_meshes(&mut mesh_loader,LoadFailureMode::DefaultToNone).map_err(LoadError::LoadRobloxMesh)?;
 
-			let map_step2=map_step1.add_meshpart_meshes_and_calculate_attributes(
-				meshpart_meshes.into_iter().map(|(mesh_id,loader_model)|
-					(mesh_id,strafesnet_rbx_loader::data::RobloxMeshBytes::new(loader_model.get()))
-				)
-			);
+			let map_step2=map_step1.add_meshpart_meshes_and_calculate_attributes(meshpart_meshes);
 
-			let (textures,render_configs)=loader.into_render_configs().map_err(LoadError::Io)?.consume();
+			let mut texture_loader=strafesnet_rbx_loader::loader::TextureLoader::new();
+			let render_configs=texture_deferred_loader.into_render_configs(&mut texture_loader,LoadFailureMode::DefaultToNone).map_err(LoadError::LoadRobloxTexture)?;
 
-			let map=map_step2.add_render_configs_and_textures(
-				render_configs.into_iter(),
-				textures.into_iter().map(|(texture_id,texture)|
-					(texture_id,match texture{
-						strafesnet_deferred_loader::texture::Texture::ImageDDS(data)=>data,
-					})
-				)
-			);
+			let map=map_step2.add_render_configs_and_textures(render_configs);
 
 			Ok(LoadFormat::Map(map))
 		},