diff --git a/src/ngircd/lists.c b/src/ngircd/lists.c
index 21058a0..4e99f82 100644
--- a/src/ngircd/lists.c
+++ b/src/ngircd/lists.c
@@ -313,6 +313,8 @@ Lists_MakeMask(const char *Pattern)
 /**
  * Check if a client is listed in a list.
  *
+ * "One shot" entries become deleted automatically.
+ *
  * @param h List head.
  * @param Client Client to check.
  * @return true if client is listed, false if not.
@@ -326,14 +328,20 @@ Lists_Check(struct list_head *h, CLIENT *Client)
 /**
  * Check if a client is listed in a list and return the "reason".
  *
+ * "One shot" entries become deleted automatically.
+ *
+ * Please note that this function uses a global static buffer for saving the
+ * "reason text", so each call to this function destroys the last returned text!
+ *
  * @param h List head.
  * @param Client Client to check.
- * @return true if client is listed, false if not.
+ * @return pointer to the "reason text" (if client is listed) or NULL.
  */
 char *
 Lists_CheckReason(struct list_head *h, CLIENT *Client)
 {
 	struct list_elem *e, *last, *next;
+	static char buffer[COMMAND_LEN];
 
 	assert(h != NULL);
 
@@ -343,13 +351,17 @@ Lists_CheckReason(struct list_head *h, CLIENT *Client)
 	while (e) {
 		next = e->next;
 		if (Match(e->mask, Client_MaskCloaked(Client))) {
+			if (e->reason)
+				strlcpy(buffer, e->reason, sizeof(buffer));
+			else
+				buffer[0] = '\0';
 			if (e->valid_until == 1) {
 				/* Entry is valid only once, delete it */
 				LogDebug("Deleted \"%s\" from list (used).",
 					 e->mask);
 				Lists_Unlink(h, last, e);
 			}
-			return e->reason ? e->reason : "";
+			return buffer;
 		}
 		last = e;
 		e = next;
