diff --git a/src/roblox.rs b/src/roblox.rs
index a39a9d1..3d6a7a5 100644
--- a/src/roblox.rs
+++ b/src/roblox.rs
@@ -4,7 +4,8 @@ use std::collections::HashSet;
 use clap::{Args,Subcommand};
 use anyhow::Result as AResult;
 use rbx_dom_weak::Instance;
-use strafesnet_deferred_loader::rbxassetid::RobloxAssetId;
+use strafesnet_deferred_loader::deferred_loader::{LoadFailureMode,MeshDeferredLoader,RenderConfigDeferredLoader};
+use rbxassetid::RobloxAssetId;
 use tokio::io::AsyncReadExt;
 
 const DOWNLOAD_LIMIT:usize=16;
@@ -350,34 +351,24 @@ fn roblox_to_snf(pathlist:Vec<std::path::PathBuf>,output_folder:PathBuf)->AResul
 			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(ConvertError::IO)?;
+			let mut mesh_loader=strafesnet_rbx_loader::loader::MeshLoader::new();
+			let meshpart_meshes=mesh_deferred_loader.into_meshes(&mut mesh_loader,LoadFailureMode::DefaultToNone).unwrap();
 
-			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(ConvertError::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).unwrap();
 
-			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);
 
 			let mut dest=output_folder.clone();
 			dest.push(path.file_stem().unwrap());
diff --git a/src/source.rs b/src/source.rs
index 1d0f803..ffc337a 100644
--- a/src/source.rs
+++ b/src/source.rs
@@ -1,6 +1,7 @@
 use std::path::PathBuf;
 use clap::{Args,Subcommand};
 use anyhow::Result as AResult;
+use strafesnet_deferred_loader::deferred_loader::{LoadFailureMode,MeshDeferredLoader,RenderConfigDeferredLoader};
 
 #[derive(Subcommand)]
 pub enum Commands{
@@ -311,40 +312,25 @@ fn source_to_snf(pathlist:Vec<std::path::PathBuf>,output_folder:PathBuf)->AResul
 				std::fs::File::open(path.as_path())
 				.map_err(ConvertError::IO)?
 			).map_err(ConvertError::BspLoader)?;
-			let mut loader=strafesnet_deferred_loader::source_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_bsp_loader::convert(
-					&bsp,
-					|name|texture_loader.acquire_render_config_id(name),
-					|name|mesh_loader.acquire_mesh_id(name),
-				);
+			let map_step1=strafesnet_bsp_loader::convert(
+				&bsp,
+				&mut texture_deferred_loader,
+				&mut mesh_deferred_loader,
+			);
 
-				let prop_meshes=mesh_loader.load_meshes(&bsp.as_ref());
+			let mut mesh_loader=strafesnet_bsp_loader::loader::MeshLoader::new(&bsp,&mut texture_deferred_loader);
+			let prop_meshes=mesh_deferred_loader.into_meshes(&mut mesh_loader,LoadFailureMode::DefaultToNone).unwrap();
 
-				let map_step2=map_step1.add_prop_meshes(
-					//the type conflagulator 9000
-					prop_meshes.into_iter().map(|(mesh_id,loader_model)|
-						(mesh_id,strafesnet_bsp_loader::data::ModelData{
-							mdl:strafesnet_bsp_loader::data::MdlData::new(loader_model.mdl.get()),
-							vtx:strafesnet_bsp_loader::data::VtxData::new(loader_model.vtx.get()),
-							vvd:strafesnet_bsp_loader::data::VvdData::new(loader_model.vvd.get()),
-						})
-					),
-					|name|texture_loader.acquire_render_config_id(name),
-				);
+			let map_step2=map_step1.add_prop_meshes(prop_meshes);
 
-				let (textures,render_configs)=loader.into_render_configs().map_err(ConvertError::IO)?.consume();
+			let mut texture_loader=strafesnet_bsp_loader::loader::TextureLoader::new();
+			let render_configs=texture_deferred_loader.into_render_configs(&mut texture_loader,LoadFailureMode::DefaultToNone).unwrap();
 
-				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);
 
 			let mut dest=output_folder.clone();
 			dest.push(path.file_stem().unwrap());