diff --git a/src/cmd/acl.rs b/src/cmd/acl.rs
index 527cd4a18de4fc7e43985f6a71fd3b08b008c670..405b0e9c3eaf9785748278cbb665e5844f78c083 100644
--- a/src/cmd/acl.rs
+++ b/src/cmd/acl.rs
@@ -7,6 +7,7 @@ use std::{process::abort, result::Result};
 #[allow(dead_code)]
 #[derive(Clone)]
 pub enum CmdAcl {
+    Any,
     RoomOnly(String),
     AdminOnly,
     List(Vec<CmdAcl>),
@@ -68,6 +69,7 @@ impl CmdAdminRegister {
 impl fmt::Display for CmdAcl {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         match self {
+            CmdAcl::Any => write!(f, "Any"),
             CmdAcl::AdminOnly => write!(f, "AdminOnly"),
             CmdAcl::RoomOnly(room) => write!(f, "Room{}", room),
             CmdAcl::List(vec) => {
@@ -97,6 +99,7 @@ impl CmdAcl {
         user_id: &UserId,
     ) -> Result<(), String> {
         return match acls {
+            CmdAcl::Any => Ok(()),
             CmdAcl::AdminOnly => bool_to_result!(
                 cmd_admin_register.is_admin(user_id.clone()),
                 (),
@@ -107,25 +110,37 @@ impl CmdAcl {
                 (),
                 "Not permited in this room".to_string()
             ),
-            CmdAcl::List(acl_list) => match acl_list
-                .iter()
-                .map(|acl| CmdAcl::action_permited(cmd_admin_register, acl, room, user_id))
-                .filter(|acl_res| acl_res.is_err())
-                .map(|acl_res| acl_res.clone().unwrap_err())
-                .reduce(|err1, err2| err1 + ", " + &err2)
-            {
-                Some(err) => Err(err),
-                None => Ok(()),
-            },
+            CmdAcl::List(acl_list) => {
+                if acl_list.iter().any(|acl| match acl {
+                    CmdAcl::Any => true,
+                    _ => false,
+                }) {
+                    Ok(())
+                } else {
+                    match acl_list
+                        .iter()
+                        .map(|acl| CmdAcl::action_permited(cmd_admin_register, acl, room, user_id))
+                        .filter(|acl_res| acl_res.is_err())
+                        .map(|acl_res| acl_res.clone().unwrap_err())
+                        .reduce(|err1, err2| err1 + ", " + &err2)
+                    {
+                        Some(err) => Err(err),
+                        None => Ok(()),
+                    }
+                }
+            }
         };
     }
 
     fn from_string_item(string: &str) -> CmdAcl {
-        if string.to_uppercase() == "ADMINONLY" {
+        let upper = string.to_uppercase();
+        if upper == "ADMINONLY" {
             CmdAcl::AdminOnly
-        } else if string.to_uppercase().starts_with("ROOM!") {
+        } else if upper.starts_with("ROOM!") {
             let room = (&string[4..]).to_string();
             CmdAcl::RoomOnly(room)
+        } else if upper == "ANY" {
+            CmdAcl::Any
         } else {
             error!("Unknown ACL: {}", string);
             abort();