diff --git a/engine/session/src/session.rs b/engine/session/src/session.rs
index 78b5c7c..b782078 100644
--- a/engine/session/src/session.rs
+++ b/engine/session/src/session.rs
@@ -211,16 +211,7 @@ impl Session{
 				self.last_ray_hit=model_id;
 				if let Some(model_id)=model_id{
 					if let Some(model)=self.geometry_shared.le_models.get(model_id.get() as usize){
-						let noice=model.brush_info.flags.iter_names().filter_map(|(name,flags)|{
-							(flags.bits()!=0).then(||name)
-						}).collect::<Vec<&str>>().join("|");
-						println!("brush_info.flags={noice}");
-						for (i,side) in model.brush_info.sides.iter().enumerate(){
-							let noice_string=side.iter_names().filter_map(|(name,flags)|{
-								(flags.bits()!=0).then(||name)
-							}).collect::<Vec<&str>>().join("|");
-							println!("brush_info.sides[{i}]={noice_string}");
-						}
+						println!("{}",model.debug_info);
 					}
 				}
 			}
diff --git a/lib/bsp_loader/src/bsp.rs b/lib/bsp_loader/src/bsp.rs
index b22dfc7..60d72ee 100644
--- a/lib/bsp_loader/src/bsp.rs
+++ b/lib/bsp_loader/src/bsp.rs
@@ -43,6 +43,7 @@ fn add_brush<'a>(
 	origin:vbsp::Vector,
 	rendercolor:vbsp::Color,
 	attributes:attr::CollisionAttributesId,
+	debug_info:model::DebugInfo,
 ){
 	let transform=integer::Planar64Affine3::from_translation(
 		valve_transform(origin.into())
@@ -59,7 +60,7 @@ fn add_brush<'a>(
 			Ok(mesh_id)=>{
 				let mesh=model::MeshId::new(mesh_id);
 				world_models.push(
-					model::Model{mesh,attributes,transform,color,brush_info:model::BrushInfo::BUH}
+					model::Model{mesh,attributes,transform,color,debug_info}
 				);
 			},
 			Err(e)=>{
@@ -70,7 +71,7 @@ fn add_brush<'a>(
 		_=>{
 			let mesh=mesh_deferred_loader.acquire_mesh_id(model);
 			prop_models.push(
-				model::Model{mesh,attributes,transform,color,brush_info:model::BrushInfo::BUH}
+				model::Model{mesh,attributes,transform,color,debug_info}
 			);
 		}
 	}
@@ -139,7 +140,7 @@ pub fn convert<'a>(
 				valve_transform(prop.origin.into()),
 			),
 			color:glam::Vec4::ONE,
-			brush_info:model::BrushInfo::BUH,
+			debug_info:model::DebugInfo::Prop,
 		}
 	}).collect();
 
@@ -208,7 +209,7 @@ pub fn convert<'a>(
 		attributes:ATTRIBUTE_DECORATION,
 		transform:integer::Planar64Affine3::IDENTITY,
 		color:glam::Vec4::W,
-		brush_info:model::BrushInfo::BUH,
+		debug_info:model::DebugInfo::World,
 	});
 
 	// THE CUBE OF DESTINY
@@ -219,6 +220,13 @@ pub fn convert<'a>(
 	const ENTITY_ATTRIBUTE:gameplay_attributes::CollisionAttributesId=ATTRIBUTE_DECORATION;
 	const ENTITY_TRIGGER_ATTRIBUTE:gameplay_attributes::CollisionAttributesId=ATTRIBUTE_INTERSECT_DEFAULT;
 	for raw_ent in &bsp.entities{
+		let debug_info=match model::EntityInfo::new(raw_ent.properties()){
+			Ok(entity_info)=>model::DebugInfo::Entity(entity_info),
+			Err(_)=>{
+				println!("EntityInfoError");
+				model::DebugInfo::World
+			},
+		};
 		macro_rules! ent_brush_default{
 			($entity:ident)=>{
 				add_brush(mesh_deferred_loader,&mut world_models,&mut prop_models,$entity.model,$entity.origin,$entity.rendercolor,ENTITY_ATTRIBUTE)
@@ -459,7 +467,7 @@ pub fn convert<'a>(
 						integer::vec3::ZERO,
 					),
 					color:glam::Vec4::ONE,
-					brush_info:model::BrushInfo{flags:brush.flags,sides}
+					debug_info:model::DebugInfo::Brush(model::BrushInfo{flags:brush.flags,sides}),
 				});
 			},
 			Err(e)=>println!("Brush mesh error: {e}"),
@@ -475,7 +483,7 @@ pub fn convert<'a>(
 			attributes:ATTRIBUTE_INTERSECT_DEFAULT,
 			transform:integer::Planar64Affine3::from_translation(valve_transform(spawn_point.into())),
 			color:glam::Vec4::W,
-			brush_info:model::BrushInfo::BUH,
+			debug_info:model::DebugInfo::World,
 		});
 
 		let first_stage=Stage::empty(model_id);
diff --git a/lib/common/src/model.rs b/lib/common/src/model.rs
index 51b924c..3c6306f 100644
--- a/lib/common/src/model.rs
+++ b/lib/common/src/model.rs
@@ -214,18 +214,81 @@ pub struct Model{
 	pub attributes:gameplay_attributes::CollisionAttributesId,
 	pub color:Color4,//transparency is in here
 	pub transform:Planar64Affine3,
-	pub brush_info:BrushInfo,
+	pub debug_info:DebugInfo,
 }
 
+#[derive(Debug,Clone)]
+pub enum DebugInfo{
+	World,
+	Prop,
+	Brush(BrushInfo),
+	Entity(EntityInfo),
+}
+impl std::fmt::Display for DebugInfo{
+	fn fmt(&self,f:&mut std::fmt::Formatter<'_>)->std::fmt::Result{
+		match self{
+			DebugInfo::World=>write!(f,"World"),
+			DebugInfo::Prop=>write!(f,"Prop"),
+			DebugInfo::Brush(brush_info)=>brush_info.fmt(f),
+			DebugInfo::Entity(entity_info)=>entity_info.fmt(f),
+		}
+	}
+}
 
 #[derive(Debug,Clone)]
 pub struct BrushInfo{
 	pub flags:vbsp::BrushFlags,
 	pub sides:Vec<vbsp::TextureFlags>,
 }
-impl BrushInfo{
-	pub const BUH:Self=BrushInfo{
-		flags:vbsp::BrushFlags::empty(),
-		sides:vec![],
-	};
+impl std::fmt::Display for BrushInfo{
+	fn fmt(&self,f:&mut std::fmt::Formatter<'_>)->std::fmt::Result{
+		let noice=self.flags.iter_names().filter_map(|(name,flags)|{
+			(flags.bits()!=0).then(||name)
+		}).collect::<Vec<&str>>().join("|");
+		writeln!(f,"brush_info.flags={noice}")?;
+		for (i,side) in self.sides.iter().enumerate(){
+			let noice_string=side.iter_names().filter_map(|(name,flags)|{
+				(flags.bits()!=0).then(||name)
+			}).collect::<Vec<&str>>().join("|");
+			writeln!(f,"brush_info.sides[{i}]={noice_string}")?;
+		}
+		Ok(())
+	}
+}
+
+#[derive(Debug,Clone)]
+pub struct EntityInfo{
+	pub classname:Box<str>,
+	pub properties:Vec<(Box<str>,Box<str>)>,
+}
+pub enum EntityInfoError{
+	MissingClassname,
+}
+impl EntityInfo{
+	pub fn new<'a>(iter:impl IntoIterator<Item=(&'a str,&'a str)>)->Result<Self,EntityInfoError>{
+		let mut classname:Option<Box<str>>=None;
+		let mut properties:Vec<(Box<str>,Box<str>)>=Vec::new();
+		for (name,value) in iter{
+			match name{
+				"classname"=>classname=Some(value.into()),
+				"hammerid"=>(),
+				_=>properties.push((name.into(),value.into())),
+			}
+		}
+		properties.sort_by(|(n0,_),(n1,_)|n0.cmp(n1));
+		let Some(classname)=classname else{
+			return Err(EntityInfoError::MissingClassname);
+		};
+		Ok(EntityInfo{classname,properties})
+	}
+}
+impl std::fmt::Display for EntityInfo{
+	fn fmt(&self,f:&mut std::fmt::Formatter<'_>)->std::fmt::Result{
+		writeln!(f,"struct {}{{",self.classname)?;
+		for (name,value) in &self.properties{
+			writeln!(f,"\t{name}:{value},")?;
+		}
+		write!(f,"}}")?;
+		Ok(())
+	}
 }
diff --git a/lib/snf/src/newtypes/model.rs b/lib/snf/src/newtypes/model.rs
index 26e5585..c290d47 100644
--- a/lib/snf/src/newtypes/model.rs
+++ b/lib/snf/src/newtypes/model.rs
@@ -250,7 +250,7 @@ impl Into<strafesnet_common::model::Model> for Model{
 				]),
 				strafesnet_common::integer::vec3::raw_xyz(_9,_a,_b)
 			),
-			brush_info:strafesnet_common::model::BrushInfo::BUH,
+			debug_info:strafesnet_common::model::DebugInfo::World,
 		}
 	}
 }