Index: trunk/src/engine/model_manager.cc
===================================================================
--- trunk/src/engine/model_manager.cc	(revision 523)
+++ trunk/src/engine/model_manager.cc	(revision 524)
@@ -7,4 +7,5 @@
 #include "nv/engine/model_manager.hh"
 
+#include "nv/engine/ragdoll_manager.hh"
 #include "nv/lua/lua_math.hh"
 #include "nv/lua/lua_flags.hh"
@@ -26,4 +27,7 @@
 		def_data = m_rm->get< mesh_data >( table.get_string128( "path" ) );
 
+	if ( table.is_string( "ragdoll" ) )
+		gm->ragdoll_id = table.get_string32( "ragdoll" );
+	
 	if ( table.has_field( "animator" ) )
 	{
Index: trunk/src/engine/ragdoll_manager.cc
===================================================================
--- trunk/src/engine/ragdoll_manager.cc	(revision 523)
+++ trunk/src/engine/ragdoll_manager.cc	(revision 524)
@@ -66,4 +66,5 @@
 	if ( auto bind_data = rbind.lock() )
 	{
+		data->id = table.get_string32( "id" );
 		int index = data->parts.size();
 		data->parts.emplace_back();
Index: trunk/src/engine/resource_system.cc
===================================================================
--- trunk/src/engine/resource_system.cc	(revision 523)
+++ trunk/src/engine/resource_system.cc	(revision 524)
@@ -34,2 +34,16 @@
 	}
 }
+
+void nv::lua_resource_manager_base::preload_ids()
+{
+	m_id_hash.clear();
+	lua::table_guard table( m_lua, get_storage_name() );
+	uint32 count = table.get_unsigned( "__counter" );
+	for ( auto i : range( count ) )
+	{
+		lua::table_guard sub_table( table, i + 1 );
+		string64 id = sub_table.get_string64( "id" );
+		NV_ASSERT( m_id_hash.find( id ) == m_id_hash.end(), "HASH COLLISION - ", id, " - ", m_id_hash[id] );
+		m_id_hash[id] = id;
+	}
+}
