Index: trunk/nv/ecs/ecs.hh
===================================================================
--- trunk/nv/ecs/ecs.hh	(revision 546)
+++ trunk/nv/ecs/ecs.hh	(revision 547)
@@ -167,4 +167,12 @@
 				ecs& m_ecs;
 			};
+
+			template< typename System >
+			void register_system( string_view name, System* c )
+			{
+				register_handler< System >( name, (System*)( c ) );
+				register_ecs_update< System >( (System*)( c ) );
+			}
+
 
 			template < typename Component, typename Handler >
@@ -253,4 +261,12 @@
 			}
 
+			template < typename F >
+			void recursive_call( handle_type h, F&& f )
+			{
+				f( h );
+				for ( auto c : children( h ) )
+					recursive_call( c, f );
+			}
+
 			void remove( handle_type h )
 			{
@@ -321,5 +337,5 @@
 			}
 
-		protected:
+//		protected:
 
 			template < typename System, typename Components, template <class...> class List, typename... Messages >
@@ -334,4 +350,26 @@
 			typename enable_if< has_component_message< System, Components, Message >::value, void >::type
 			register_component_message( System* s )
+			{
+				component_interface* ci = get_interface<Components>();
+				register_callback( Message::message_id, [=] ( const message& msg )
+				{
+					const Message& m = message_cast<Message>( msg );
+					if ( msg.recursive )
+					{
+						this->recursive_call( m.entity, [=] ( handle_type h )
+						{
+							if ( void* c = ci->get_raw( h ) )
+								s->on( m, *( (Components*)( c ) ) );
+						} );
+					}
+					else
+						if ( void* c = ci->get_raw( m.entity ) )
+							s->on( m, *( (Components*)( c ) ) );
+				} );
+			}
+
+			template < typename System, typename Components, typename Message >
+			typename enable_if< has_ecs_component_message< this_type, System, Components, Message >::value, void >::type
+			register_ecs_component_message( System* s )
 			{
 				component_interface* ci = get_interface<Components>();
@@ -339,18 +377,13 @@
  				{
 					const Message& m = message_cast<Message>( msg );
-					if ( void* c = ci->get_raw( m.entity ) )
-						s->on( m, *((Components*)(c)) );
- 				} );
-
-			}
-
-			template < typename System, typename Components, typename Message >
-			typename enable_if< has_ecs_component_message< this_type, System, Components, Message >::value, void >::type
-			register_ecs_component_message( System* s )
-			{
-				component_interface* ci = get_interface<Components>();
- 				register_callback( Message::message_id, [=] ( const message& msg )
- 				{
-					const Message& m = message_cast<Message>( msg );
+					if ( msg.recursive )
+					{
+						this->recursive_call( m.entity, [=] ( handle_type h )
+						{
+							if ( void* c = ci->get_raw( h ) )
+								s->on( m, *this, *( (Components*)( c ) ) );
+						} );
+					}
+					else
 					if ( void* c = ci->get_raw( m.entity ) )
 						s->on( m, *this, *((Components*)(c)) );
@@ -434,4 +467,6 @@
 				m_update_handlers.push_back( handler );
 			}
+
+		protected:
 
 			handle_tree_manager< handle_type >          m_handles;
Index: trunk/nv/ecs/message_queue.hh
===================================================================
--- trunk/nv/ecs/message_queue.hh	(revision 546)
+++ trunk/nv/ecs/message_queue.hh	(revision 547)
@@ -84,6 +84,7 @@
 			{
 				message_type type;
+				uint32       recursive;
 				time_type    time;
-				uint8        payload[128 - sizeof( message_type ) - sizeof( time_type ) ];
+				uint8        payload[128 - sizeof( message_type ) - sizeof( time_type ) - sizeof( uint32 ) ];
 			};
 
@@ -126,5 +127,13 @@
 			bool dispatch( Args&&... args )
 			{
-				message m{ Payload::message_id, time_type( 0 ) };
+				message m{ Payload::message_id, 0, time_type( 0 ) };
+				new( &m.payload ) Payload{ nv::forward<Args>( args )... };
+				return dispatch( m );
+			}
+
+			template < typename Payload, typename ...Args >
+			bool dispatch_recursive( Args&&... args )
+			{
+				message m{ Payload::message_id, 1, time_type( 0 ) };
 				new( &m.payload ) Payload{ nv::forward<Args>( args )... };
 				return dispatch( m );
@@ -140,5 +149,13 @@
 			bool queue( time_type delay, Args&&... args )
 			{
-				message m{ Payload::message_id, m_time + delay };
+				message m{ Payload::message_id, 0, m_time + delay };
+				new( &m.payload ) Payload{ nv::forward<Args>( args )... };
+				return queue( m );
+			}
+
+			template < typename Payload, typename ...Args >
+			bool queue_recursive( time_type delay, Args&&... args )
+			{
+				message m{ Payload::message_id, 1, m_time + delay };
 				new( &m.payload ) Payload{ nv::forward<Args>( args )... };
 				return queue( m );
