diff --git a/pallets/smith-members/src/lib.rs b/pallets/smith-members/src/lib.rs
index f0aeed93a976f19a424ab04ea64d03fa726186bc..3ec870a07df8d6d6401c20059ec89a77e7cbd2d8 100644
--- a/pallets/smith-members/src/lib.rs
+++ b/pallets/smith-members/src/lib.rs
@@ -116,8 +116,22 @@ pub mod pallet {
     #[pallet::event]
     #[pallet::generate_deposit(pub(super) fn deposit_event)]
     pub enum Event<T: Config> {
+        /// An identity is being inivited to become a smith
+        InvitationSent {
+            idty_index: T::IdtyIndex,
+            invited_by: T::IdtyIndex,
+        },
+        /// The invitation has been accepted
+        InvitationAccepted { idty_index: T::IdtyIndex },
+        /// Certification received
+        CertificationReceived {
+            idty_index: T::IdtyIndex,
+            issued_by: T::IdtyIndex,
+        },
         /// A smith gathered enough certifications to become an authority (can call `go_online()`).
-        SmithBecameAuthority { idty_index: T::IdtyIndex },
+        PromotedToSmith { idty_index: T::IdtyIndex },
+        /// A smith has been removed from the smiths set
+        SmithExcluded { idty_index: T::IdtyIndex },
     }
 
     #[pallet::genesis_config]
@@ -248,7 +262,7 @@ pub mod pallet {
             let who = ensure_signed(origin.clone())?;
             let issuer = T::IdtyIdOf::convert(who.clone()).ok_or(Error::<T>::UnknownIssuer)?;
             Self::check_invite_smith(issuer, receiver)?;
-            Self::do_invite_smith(receiver);
+            Self::do_invite_smith(issuer, receiver);
             Ok(().into())
         }
 
@@ -299,7 +313,7 @@ impl<T: Config> Pallet<T> {
         Ok(().into())
     }
 
-    fn do_invite_smith(receiver: T::IdtyIndex) {
+    fn do_invite_smith(issuer: T::IdtyIndex, receiver: T::IdtyIndex) {
         let new_expires_on = CurrentSession::<T>::get() + T::InactivityMaxDuration::get();
         // TODO: another way to write this?
         if Smiths::<T>::get(receiver).is_some() {
@@ -321,6 +335,10 @@ impl<T: Config> Pallet<T> {
             );
         }
         ExpiresOn::<T>::append(new_expires_on, receiver);
+        Self::deposit_event(Event::<T>::InvitationSent {
+            idty_index: receiver,
+            invited_by: issuer,
+        });
     }
 
     fn check_accept_invitation(receiver: T::IdtyIndex) -> DispatchResultWithPostInfo {
@@ -339,6 +357,9 @@ impl<T: Config> Pallet<T> {
             let maybe_smith_meta = maybe_smith_meta.as_mut().expect("status checked earlier");
             maybe_smith_meta.status = SmithStatus::Pending;
         });
+        Self::deposit_event(Event::<T>::InvitationAccepted {
+            idty_index: receiver,
+        });
         Ok(().into())
     }
 
@@ -388,8 +409,12 @@ impl<T: Config> Pallet<T> {
             // expiry postponed
             let new_expires_on = CurrentSession::<T>::get() + T::InactivityMaxDuration::get();
             maybe_smith_meta.expires_on = Some(new_expires_on);
+            Self::deposit_event(Event::<T>::CertificationReceived {
+                idty_index: receiver,
+                issued_by: issuer,
+            });
             if maybe_smith_meta.status == SmithStatus::Smith {
-                Self::deposit_event(Event::<T>::SmithBecameAuthority {
+                Self::deposit_event(Event::<T>::PromotedToSmith {
                     idty_index: receiver,
                 });
             }
@@ -433,7 +458,7 @@ impl<T: Config> Pallet<T> {
                                 smith,
                                 SmithRemovalReason::OfflineTooLong,
                             );
-                            // TODO: add event? (+ add others too)
+                            Self::deposit_event(Event::<T>::SmithExcluded { idty_index: smith });
                         }
                     }
                 }
@@ -479,9 +504,7 @@ impl<T: Config> Pallet<T> {
         //     T::OnSmithDelete::on_smith_delete(idty_index, SmithRemovalReason::Blacklisted);
         // }
     }
-}
 
-impl<T: Config> Pallet<T> {
     fn provide_is_member(idty_id: &T::IdtyIndex) -> bool {
         let Some(smith) = Smiths::<T>::get(idty_id) else {
             return false;
diff --git a/pallets/smith-members/src/mock.rs b/pallets/smith-members/src/mock.rs
index 5ae7629ce12dd76bc170a78f2db0fadd37b8e18c..09faf0cda805ffffbf1ab41cb70ece216ea59630 100644
--- a/pallets/smith-members/src/mock.rs
+++ b/pallets/smith-members/src/mock.rs
@@ -17,6 +17,7 @@
 #![cfg(test)]
 
 use crate::{self as pallet_smith_members};
+use frame_support::pallet_prelude::Hooks;
 use frame_support::{
     parameter_types,
     traits::{ConstU32, ConstU64},
@@ -107,3 +108,14 @@ pub fn new_test_ext(
     .unwrap()
     .into()
 }
+
+pub fn run_to_block(n: u64) {
+    while System::block_number() < n {
+        Smith::on_finalize(System::block_number());
+        System::on_finalize(System::block_number());
+        System::reset_events();
+        System::set_block_number(System::block_number() + 1);
+        System::on_initialize(System::block_number());
+        Smith::on_initialize(System::block_number());
+    }
+}
diff --git a/pallets/smith-members/src/tests.rs b/pallets/smith-members/src/tests.rs
index fc199c339c10d52aab85697f91a86d5e0de93423..885567b6c679fc8d7eebf2ad0aa662c01d144b22 100644
--- a/pallets/smith-members/src/tests.rs
+++ b/pallets/smith-members/src/tests.rs
@@ -17,7 +17,7 @@
 #![cfg(test)]
 
 use super::*;
-use crate::mock::{new_test_ext, Runtime, RuntimeOrigin};
+use crate::mock::{new_test_ext, run_to_block, Runtime, RuntimeEvent, RuntimeOrigin, System};
 use frame_support::{assert_err, assert_ok};
 
 #[cfg(test)]
@@ -35,14 +35,23 @@ fn process_to_become_a_smith_and_lose_it() {
         ],
     })
     .execute_with(|| {
+        // Events cannot be recorded on genesis
+        run_to_block(1);
         // State before
         assert_eq!(Smiths::<Runtime>::get(5), None);
         // Try to invite
         assert_ok!(Pallet::<Runtime>::invite_smith(RuntimeOrigin::signed(1), 5));
+        System::assert_has_event(RuntimeEvent::Smith(Event::<Runtime>::InvitationSent {
+            idty_index: 5,
+            invited_by: 1,
+        }));
         // Accept invitation
         assert_ok!(Pallet::<Runtime>::accept_invitation(RuntimeOrigin::signed(
             5
         )));
+        System::assert_has_event(RuntimeEvent::Smith(Event::<Runtime>::InvitationAccepted {
+            idty_index: 5,
+        }));
         // State after
         assert_eq!(
             Smiths::<Runtime>::get(5).unwrap(),
@@ -58,6 +67,12 @@ fn process_to_become_a_smith_and_lose_it() {
             RuntimeOrigin::signed(1),
             5
         ));
+        System::assert_has_event(RuntimeEvent::Smith(
+            Event::<Runtime>::CertificationReceived {
+                idty_index: 5,
+                issued_by: 1,
+            },
+        ));
         assert_eq!(
             Smiths::<Runtime>::get(5).unwrap(),
             SmithMeta {
@@ -72,6 +87,15 @@ fn process_to_become_a_smith_and_lose_it() {
             RuntimeOrigin::signed(2),
             5
         ));
+        System::assert_has_event(RuntimeEvent::Smith(
+            Event::<Runtime>::CertificationReceived {
+                idty_index: 5,
+                issued_by: 1,
+            },
+        ));
+        System::assert_has_event(RuntimeEvent::Smith(Event::<Runtime>::PromotedToSmith {
+            idty_index: 5,
+        }));
         assert_eq!(
             Smiths::<Runtime>::get(5).unwrap(),
             SmithMeta {
@@ -89,6 +113,15 @@ fn process_to_become_a_smith_and_lose_it() {
         assert!(Smiths::<Runtime>::get(5).is_some());
         // On session 5 no more smiths because of lack of activity
         Pallet::<Runtime>::on_new_session(5);
+        System::assert_has_event(RuntimeEvent::Smith(Event::<Runtime>::SmithExcluded {
+            idty_index: 1,
+        }));
+        System::assert_has_event(RuntimeEvent::Smith(Event::<Runtime>::SmithExcluded {
+            idty_index: 2,
+        }));
+        System::assert_has_event(RuntimeEvent::Smith(Event::<Runtime>::SmithExcluded {
+            idty_index: 5,
+        }));
         assert_eq!(
             Smiths::<Runtime>::get(1),
             Some(SmithMeta {