diff --git a/src/main/java/com/slprojects/privateServerPlugin/GoodbyeMessageManager.java b/src/main/java/com/slprojects/privateServerPlugin/GoodbyeMessageManager.java
new file mode 100644
index 0000000000000000000000000000000000000000..ac0ea0fc28f2b228ca9c98b758e6512cb59bb717
--- /dev/null
+++ b/src/main/java/com/slprojects/privateServerPlugin/GoodbyeMessageManager.java
@@ -0,0 +1,47 @@
+package com.slprojects.privateServerPlugin;
+
+import net.kyori.adventure.text.Component;
+import net.kyori.adventure.text.minimessage.MiniMessage;
+
+import java.util.List;
+
+public class GoodbyeMessageManager {
+
+    private static final List<String> SHORT_SESSION_MESSAGES = List.of(
+            "Abadakor, <red>%s<reset> n'avait pas envie de nous voir",
+            "<red>%s<reset> avait une envie très pressante",
+            "En fait non, <red>%s<reset> en a décidé autrement. :3"
+    );
+
+    private static final List<String> MEDIUM_SESSION_MESSAGES = List.of(
+            "<red>%s<reset> est parti(e) ranger sa chambre",
+            "<red>%s<reset> est parti(e) faire caca",
+            "<red>%s<reset> est parti(e) mettre la table",
+            "<red>%s<reset> est parti(e) manger",
+            "<red>%s<reset> est parti(e) faire quelques trucs :3",
+            "<red>%s<reset> a disparu ? Non, il/elle est parti(e). :)"
+    );
+
+    private static final List<String> LONG_SESSION_MESSAGES = List.of(
+            "<red>%s<reset> nous a quitté car il/elle s'est fait rappelé(e) à l'ordre par sa maman :')",
+            "<red>%s<reset> a retrouvé le monde réel",
+            "<red>%s<reset> en a eu assez"
+    );
+
+    public Component getGoodbyeMessage(String playerNickname, long sessionDurationInSeconds) {
+        List<String> messagePool;
+
+        if (sessionDurationInSeconds < 30) {
+            messagePool = SHORT_SESSION_MESSAGES;
+        } else if (sessionDurationInSeconds < 3600) {
+            messagePool = MEDIUM_SESSION_MESSAGES;
+        } else {
+            messagePool = LONG_SESSION_MESSAGES;
+        }
+
+        int randomIndex = (int) (Math.random() * messagePool.size());
+        String chosenMessage = String.format(messagePool.get(randomIndex), playerNickname);
+
+        return MiniMessage.miniMessage().deserialize(chosenMessage);
+    }
+}
diff --git a/src/main/java/com/slprojects/privateServerPlugin/PrivateServerPlugin.java b/src/main/java/com/slprojects/privateServerPlugin/PrivateServerPlugin.java
index 940f473bb9fd319fe37232cb29b1cf82a454e2a4..c72987bc19d215c9f0e04841cc24f41207126711 100644
--- a/src/main/java/com/slprojects/privateServerPlugin/PrivateServerPlugin.java
+++ b/src/main/java/com/slprojects/privateServerPlugin/PrivateServerPlugin.java
@@ -5,16 +5,24 @@ import org.bukkit.entity.Player;
 import org.bukkit.event.EventHandler;
 import org.bukkit.event.Listener;
 import org.bukkit.event.player.PlayerJoinEvent;
+import org.bukkit.event.player.PlayerQuitEvent;
 import org.bukkit.plugin.java.JavaPlugin;
 
+import java.time.Instant;
+import java.util.HashMap;
+import java.util.Map;
+
 public final class PrivateServerPlugin extends JavaPlugin implements Listener {
 
     private WelcomeMessageManager welcomeMessageManager;
+    private GoodbyeMessageManager goodbyeMessageManager;
+    private final Map<Player, Instant> playerJoinTimes = new HashMap<>();
 
     @Override
     public void onEnable() {
         getServer().getPluginManager().registerEvents(this, this);
         this.welcomeMessageManager = new WelcomeMessageManager();
+        this.goodbyeMessageManager = new GoodbyeMessageManager();
     }
 
     @Override
@@ -24,11 +32,30 @@ public final class PrivateServerPlugin extends JavaPlugin implements Listener {
 
     @EventHandler
     public void onPlayerJoin(PlayerJoinEvent event) {
+        Player player = event.getPlayer();
         event.joinMessage(null);
-        Component welcomeMessage = welcomeMessageManager.getNextRandomMessage(event.getPlayer().getName());
 
+        playerJoinTimes.put(player, Instant.now());
+
+        Component welcomeMessage = welcomeMessageManager.getNextRandomMessage(player.getName());
         for (Player p : getServer().getOnlinePlayers()) {
             p.sendMessage(welcomeMessage);
         }
     }
+
+    @EventHandler
+    public void onPlayerQuit(PlayerQuitEvent event) {
+        Player player = event.getPlayer();
+        event.quitMessage(null);
+
+        Instant joinTime = playerJoinTimes.remove(player);
+        if (joinTime != null) {
+            long sessionDurationInSeconds = Instant.now().getEpochSecond() - joinTime.getEpochSecond();
+
+            Component goodbyeMessage = goodbyeMessageManager.getGoodbyeMessage(player.getName(), sessionDurationInSeconds);
+            for (Player p : getServer().getOnlinePlayers()) {
+                p.sendMessage(goodbyeMessage);
+            }
+        }
+    }
 }