Index: trunk/nv/engine/animation.hh
===================================================================
--- trunk/nv/engine/animation.hh	(revision 523)
+++ trunk/nv/engine/animation.hh	(revision 524)
@@ -84,5 +84,5 @@
 		float         time;
 
-		animator_transition_instance() {}
+		animator_transition_instance() : source(0), time( 0.0 ) {}
 
 		animator_transition_instance( const animator_transition_data& data, uint32 src )
@@ -123,4 +123,11 @@
 					/* this duration might be inaccurate? */
 					return duration;
+				}
+				else
+				{
+// 					duration -= last.time;
+// 					last.time = 0.0f;
+					int hack;
+					m_time = 0.0f;
 				}
 			}
@@ -298,4 +305,11 @@
 		}
 
+		bool has_state( const animator_data* data, shash64 id ) const
+		{
+			for ( uint32 i = 0; i < data->layers.size(); ++i )
+				for ( uint32 j = 0; j < data->layers[i].states.size(); ++j )
+					if ( data->layers[i].states[j].name == id ) return true;
+			return false;
+		}
 
 //	protected:
@@ -373,5 +387,4 @@
 		}
 
-
 		vector< animator_layer_instance > m_layers;
 		skeleton_transforms               m_transforms;
Index: trunk/nv/engine/model_manager.hh
===================================================================
--- trunk/nv/engine/model_manager.hh	(revision 523)
+++ trunk/nv/engine/model_manager.hh	(revision 524)
@@ -41,4 +41,6 @@
 
 	struct model;
+
+	struct ragdoll_data;
 
 	struct model_node
@@ -83,4 +85,6 @@
 		resource< animator_data >      animator;
 		resource< animator_bind_data > bind_data;
+		// TODO: change to resource
+		string32                       ragdoll_id;
 		transform                      root;
 		shash64                        attach;
Index: trunk/nv/engine/ragdoll_manager.hh
===================================================================
--- trunk/nv/engine/ragdoll_manager.hh	(revision 523)
+++ trunk/nv/engine/ragdoll_manager.hh	(revision 524)
@@ -36,4 +36,5 @@
 	struct ragdoll_data
 	{
+		string32                    id;
 		vector< ragdoll_part_data > parts;
 		vector< bool >              bone_mask;
Index: trunk/nv/engine/resource_system.hh
===================================================================
--- trunk/nv/engine/resource_system.hh	(revision 523)
+++ trunk/nv/engine/resource_system.hh	(revision 524)
@@ -58,8 +58,10 @@
 		virtual void clear() = 0;
 		void load_all( bool do_clear = true );
+		void preload_ids();
 		virtual bool load_resource( const string_view& id );
 		virtual ~lua_resource_manager_base() {}
 	protected:
 		virtual bool load_resource( lua::table_guard& table, shash64 id ) = 0;
+		hash_store< shash64, string64 > m_id_hash;
 		lua::state* m_lua;
 	};
@@ -87,14 +89,14 @@
 				}
 			}
-			// NV_ASSERT( false, "resource_manager.get failed!" );
+			NV_LOG_ERROR( "resource_manager.get(\"",id,"\") failed!" );
 			return resource_type();
 		}
 
-		resource_type get( uint64 id )
-		{
-			if ( exists( shash64( id ) ) ) return this->template create< T >( shash64( id ) );
-			// NV_ASSERT( false, "resource_manager.get failed!" );
-			return resource_type();
-		}
+// 		resource_type get_( uint64 id )
+// 		{
+// 			if ( exists( shash64( id ) ) ) return this->template create< T >( shash64( id ) );
+// 			NV_LOG_ERROR( "resource_manager.get(\"", id, "\") failed!" );
+// 			return resource_type();
+// 		}
 
 		virtual void clear()
@@ -192,6 +194,5 @@
 		virtual resource< T > load_resource( source_type u )
 		{
-			resource< T > result = get( u.id().value() );
-			if ( result ) return result;
+			if ( exists( u.id() ) ) return this->template create< T >( u.id() );
 			return create_resource( u );
 		}
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;
+	}
+}
