diff --git a/update_macros/src/update.rs b/update_macros/src/update.rs
index 931487d..fd8d3a3 100644
--- a/update_macros/src/update.rs
+++ b/update_macros/src/update.rs
@@ -308,6 +308,50 @@ impl Update {
             #( #resource_types: ResourceTrait, )*
         }
     }
+
+    pub fn resource_only_events(&self) -> TokenStream2 {
+        let resource_types = self.resource_types();
+        let resource_type_impls = self.resource_type_impls();
+
+        let resources = if self.resources.is_empty() {
+            quote! {}
+        } else {
+            let resources = &self.resources;
+
+            quote! {
+                #( &mut #resources, )*
+            }
+        };
+
+        let reource_requirement = self.reource_requirement();
+        let (resource_store, resource_idents) = self.resource_store();
+
+        quote! {
+            impl<P, Func, #resource_type_impls> EventReader<P, (), #resource_types, Func, ()> for Events
+            where
+                Func: Fn(&P, &mut Commands, #resources ) -> Result<()> + Send + Sync + Clone + 'static,
+                #reource_requirement
+                P: std::any::Any + Send + Sync,
+            {
+                fn add_reader(&mut self, func: Func) {
+                    match self.events.get_mut(&TypeId::of::<P>()) {
+                        Some((_, listener)) => listener.push(std::sync::Arc::new(move |world, payload| {
+                            let typed_payload: &P = payload.downcast_ref().unwrap();
+                            let mut commands = Commands::new(world.now());
+
+                            #resource_store
+                            func(typed_payload, &mut commands, #( #resource_idents, )*)?;
+
+                            commands.apply_deferred(world)?;
+
+                            Ok(())
+                        })),
+                        None => panic!("register event type first!"),
+                    }
+                }
+            }
+        }
+    }
 }
 
 impl ToTokens for Update {
@@ -541,6 +585,14 @@ pub fn update(max_components: usize, max_resources: usize) -> TokenStream {
         }
     }
 
+    let mut events = Vec::new();
+
+    for resource_count in resources.iter() {
+        let q = Update::new(vec![1].into_iter(), *resource_count).resource_only_events();
+
+        events.push(q);
+    }
+
     // updates.push(Update::new(vec![1].into_iter(), 0));
 
     // let q = quote! {
@@ -551,5 +603,6 @@ pub fn update(max_components: usize, max_resources: usize) -> TokenStream {
 
     TokenStream::from(quote! {
         #( #updates )*
+        #( #events )*
     })
 }