Index: trunk/nv/ecs/ecs.hh
===================================================================
--- trunk/nv/ecs/ecs.hh	(revision 548)
+++ trunk/nv/ecs/ecs.hh	(revision 549)
@@ -234,4 +234,10 @@
 				}
 
+				template< typename Component >
+				bool runc( Component& c )
+				{
+					return run( *reinterpret_cast<const handle_type*>( &c ) );
+				}
+
 				template < typename SC >
 				SC& get()
@@ -272,4 +278,12 @@
 			};
 
+			template <>
+			struct gather_components<>
+			{
+				gather_components( this_type& ) {};
+				bool run( handle_type ) { return true;  }
+				template < typename Component >
+				bool runc( Component& ) { return true; }
+			};
 
 			template< typename System >
@@ -280,5 +294,4 @@
 					has_ecs_update< this_type, System, time_type >::type{} );
 			}
-
 
 			template < typename Component, typename Handler >
@@ -290,6 +303,8 @@
 				register_handler< Handler >( name, (Handler*)c );
 				register_component_messages< Handler, mpl::list< Component > >( (Handler*)( c ), message_list{} );
-				register_ecs_component_update< Handler >( (Handler*)( c ), mpl::list< Component >{} );
-				register_component_update< Handler >( (Handler*)( c ), mpl::list< Component >{} );
+				register_ecs_component_update< Handler >( (Handler*)( c ), mpl::list< Component >{},
+					has_ecs_component_update< this_type, Handler, mpl::list< Component >, time_type >::type{} );
+				register_component_update< Handler >( (Handler*)( c ), mpl::list< Component >{}, 
+					has_component_update< Handler, mpl::list< Component >, time_type >::type{} );
 				register_ecs_update< Handler >( (Handler*)( c ), 
 					has_ecs_update< this_type, Handler, time_type >::type{} );
@@ -447,32 +462,11 @@
 			void register_component_messages( System* h, List<Messages...>&& )
 			{
-				int unused_0[] = { ( register_ecs_component_message<System,Messages>( h, Components{} ), 0 )... };
-				int unused_1[] = { ( register_component_message<System,Messages>( h, Components{} ), 0 )... };
-				int unused_2[] = { ( register_ecs_message<System,Messages>( h ), 0 )... };
-			}
-
-			template < typename System, typename Message, typename C >
-			typename enable_if< has_component_message< System, mpl::list< C >, Message >::value, void >::type
-				register_component_message( System* s, mpl::list< C >&& )
-			{
-				component_interface* ci = get_interface<C>();
-				register_callback( Message::message_id, [=] ( const message& msg )
-				{
-					const Message& m = message_cast<Message>( msg );
-					auto callback = [=] ( handle_type h )
-					{
-						if ( void* c = ci->get_raw( h ) )
-							s->on( m, *( (C*)( c ) ) );
-					};
-					if ( msg.recursive )
-						this->recursive_call( m.entity, nv::move( callback ) );
-					else
-						callback( m.entity );
-				} );
+				int unused_0[] = { ( register_ecs_component_message<System,Messages>( h, Components{} , has_ecs_component_message< this_type, System, Components, Messages >::type{} ), 0 )... };
+				int unused_1[] = { ( register_component_message<System,Messages>( h, Components{}, has_component_message< System, Components, Messages >::type{} ), 0 )... };
+				int unused_2[] = { ( register_ecs_message<System,Messages>( h, has_ecs_message< this_type, System, Messages >::type{} ), 0 )... };
 			}
 
 			template < typename System, typename Message, typename C, typename... Cs >
-			typename enable_if< has_component_message< System, mpl::list< C, Cs...>, Message >::value, void >::type
-			register_component_message( System* s, mpl::list< C, Cs...>&& )
+			void register_component_message( System* s, mpl::list< C, Cs...>&&, true_type&& )
 			{
 				component_interface* ci = get_interface<C>();
@@ -497,28 +491,6 @@
 			}
 
-			template < typename System, typename Message, typename C >
-			typename enable_if< has_ecs_component_message< this_type, System, mpl::list< C >, Message >::value, void >::type
-				register_ecs_component_message( System* s, mpl::list< C >&& )
-			{
-				component_interface* ci = get_interface<C>();
-				register_callback( Message::message_id, [=] ( const message& msg )
-				{
-					const Message& m = message_cast<Message>( msg );
-					auto callback = [=] ( handle_type h )
-					{
-						if ( void* c = ci->get_raw( h ) )
-							s->on( m, *this, *( (C*)( c ) ) );
-					};
-					if ( msg.recursive )
-						this->recursive_call( m.entity, nv::move( callback ) );
-					else
-						callback( m.entity );
-				} );
-
-			}
-
 			template < typename System, typename Message, typename C, typename... Cs >
-			typename enable_if< has_ecs_component_message< this_type, System, mpl::list< C, Cs...>, Message >::value, void >::type
-			register_ecs_component_message( System* s, mpl::list< C, Cs...>&& )
+			void register_ecs_component_message( System* s, mpl::list< C, Cs...>&&, true_type&& )
 			{
 				component_interface* ci = get_interface<C>();
@@ -543,6 +515,5 @@
 			}
 			template < typename System, typename Message >
-			typename enable_if< has_ecs_message< this_type, System, Message >::value, void >::type
-			register_ecs_message( System* s )
+			void register_ecs_message( System* s, true_type&& )
 			{
 				register_callback( Message::message_id, [=] ( const message& msg )
@@ -554,14 +525,11 @@
 
 			template < typename System, typename Message, typename... Cs >
-			typename enable_if< !has_component_message< System, mpl::list< Cs...>, Message >::value, void >::type
-			register_component_message( System*, mpl::list< Cs...>&& ) {}
+			void register_component_message( System*, mpl::list< Cs...>&&, false_type&& ) {}
 
 			template < typename System, typename Message, typename... Cs >
-			typename enable_if< !has_ecs_component_message< this_type, System, mpl::list< Cs...>, Message >::value, void >::type
-			register_ecs_component_message( System*, mpl::list< Cs...>&& ) {}
+			void register_ecs_component_message( System*, mpl::list< Cs...>&&, false_type&& ) {}
 
 			template < typename System, typename Message >
-			typename enable_if< !has_ecs_message< this_type, System, Message >::value, void >::type
-			register_ecs_message( System* ) {}
+			void register_ecs_message( System*, false_type&& ) {}
 
 			template < typename System >
@@ -574,7 +542,6 @@
 			}
 
-			template < typename System, typename C >
-			typename enable_if< has_component_update< System, mpl::list< C >, time_type >::value, void >::type
-			register_component_update( System* s, mpl::list< C >&& )
+			template < typename System, typename C, typename... Cs >
+			void register_component_update( System* s, mpl::list< C, Cs...>&&, true_type&& )
 			{
 				component_interface* ci = get_interface<C>();
@@ -582,12 +549,15 @@
 				register_update( [=] ( time_type dtime )
 				{
+					gather_components< Cs... > gather( *this );
 					for ( auto& c : *storage )
-						s->update( c, dtime );
+					{
+						if ( gather.runc( c ) )
+							s->update( c, gather.get<Cs>()..., dtime );
+					}
 				} );
 			}
 
 			template < typename System, typename C, typename... Cs >
-			typename enable_if< has_component_update< System, mpl::list< C, Cs...>, time_type >::value, void >::type
-			register_component_update( System* s, mpl::list< C, Cs...>&& )
+			void register_ecs_component_update( System* s, mpl::list< C, Cs...>&&, true_type&& )
 			{
 				component_interface* ci = get_interface<C>();
@@ -595,42 +565,8 @@
 				register_update( [=] ( time_type dtime )
 				{
-					gather_components< Cs... > gather( *this );
-					for ( auto& c : *storage )
-					{
-						handle_type h = handle_cast( c );
-						if ( gather.run( h ) )
-							s->update( c, gather.get<Cs>()..., dtime );
-					}
-				} );
-			}
-
-			template < typename System, typename C >
-			typename enable_if< has_ecs_component_update< this_type, System, mpl::list< C >, time_type >::value, void >::type
-			register_ecs_component_update( System* s, mpl::list< C >&& )
-			{
-				component_interface* ci = get_interface<C>();
-				component_storage_handler<C>* storage = storage_cast<C>( ci->storage() );
-				register_update( [=] ( time_type dtime )
-				{
-					for ( auto& c : *storage )
-						s->update( *this, c, dtime );
-				} );
-			}
-
-
-
-			template < typename System, typename C, typename... Cs >
-			typename enable_if< has_ecs_component_update< this_type, System, mpl::list< C, Cs...>, time_type >::value, void >::type
-				register_ecs_component_update( System* s, mpl::list< C, Cs...>&& )
-			{
-				component_interface* ci = get_interface<C>();
-				component_storage_handler<C>* storage = storage_cast<C>( ci->storage() );
-				register_update( [=] ( time_type dtime )
-				{
 					gather_components< Cs... > gather(*this);
 					for ( auto& c : *storage )
 					{
-						handle_type h = handle_cast( c );
-						if ( gather.run( h ) )
+						if ( gather.runc( c ) )
 							s->update( *this, c, gather.get<Cs>()..., dtime );
 					}
@@ -643,10 +579,8 @@
 
 			template < typename System, typename... Cs >
-			typename enable_if< !has_component_update< System, mpl::list< Cs...>, time_type >::value, void >::type
-				register_component_update( System*, mpl::list< Cs...>&& ) {}
+			void register_component_update( System*, mpl::list< Cs...>&&, false_type&& ) {}
 
 			template < typename System, typename... Cs >
-			typename enable_if< !has_ecs_component_update< this_type, System, mpl::list< Cs...>, time_type >::value, void >::type
-				register_ecs_component_update( System*, mpl::list< Cs...>&& ) {}
+			void register_ecs_component_update( System*, mpl::list< Cs...>&&, false_type&& ) {}
 
 			void register_update( update_handler&& handler )
Index: trunk/nv/ecs/message_queue.hh
===================================================================
--- trunk/nv/ecs/message_queue.hh	(revision 548)
+++ trunk/nv/ecs/message_queue.hh	(revision 549)
@@ -47,7 +47,7 @@
 				static constexpr nv::false_type check( ... );
 
+			public:
 				typedef decltype( check<C>( 0 ) ) type;
 
-			public:
 				static constexpr bool value = type::value;
 			};
