diff --git a/src/plugins/irc/irc-command.c b/src/plugins/irc/irc-command.c
index 9e450ef..ee0317e 100644
--- a/src/plugins/irc/irc-command.c
+++ b/src/plugins/irc/irc-command.c
@@ -708,6 +708,88 @@ irc_command_ban (void *data, struct t_gui_buffer *buffer, int argc,
 }
 
 /*
+ * irc_command_quiet: quiet nicks or hosts
+ */
+
+int
+irc_command_quiet (void *data, struct t_gui_buffer *buffer, int argc,
+                 char **argv, char **argv_eol)
+{
+    char *pos_channel;
+    int pos_args;
+
+    IRC_BUFFER_GET_SERVER_CHANNEL(buffer);
+    IRC_COMMAND_CHECK_SERVER("quiet", 1);
+
+    /* make C compiler happy */
+    (void) data;
+    (void) argv_eol;
+
+    if (argc > 1)
+    {
+        if (irc_channel_is_channel (ptr_server, argv[1]))
+        {
+            pos_channel = argv[1];
+            pos_args = 2;
+        }
+        else
+        {
+            pos_channel = NULL;
+            pos_args = 1;
+        }
+
+        /* channel not given, use default buffer */
+        if (!pos_channel)
+        {
+            if (ptr_channel && (ptr_channel->type == IRC_CHANNEL_TYPE_CHANNEL))
+                pos_channel = ptr_channel->name;
+            else
+            {
+                weechat_printf (ptr_server->buffer,
+                                _("%s%s: \"%s\" command can only be "
+                                  "executed in a channel buffer"),
+                                weechat_prefix ("error"), IRC_PLUGIN_NAME,
+                                "quiet");
+                return WEECHAT_RC_OK;
+            }
+        }
+
+        if (argv[pos_args])
+        {
+            /* loop on users */
+            while (argv[pos_args])
+            {
+                irc_server_sendf (ptr_server, IRC_SERVER_SEND_OUTQ_PRIO_HIGH, NULL,
+                                  "MODE %s +q %s",
+                                  pos_channel, argv[pos_args]);
+                pos_args++;
+            }
+        }
+        else
+        {
+            irc_server_sendf (ptr_server, IRC_SERVER_SEND_OUTQ_PRIO_HIGH, NULL,
+                              "MODE %s +q",
+                              pos_channel);
+        }
+    }
+    else
+    {
+        if (!ptr_channel)
+        {
+            weechat_printf (ptr_server->buffer,
+                            _("%s%s: \"%s\" command can only be "
+                              "executed in a channel buffer"),
+                            weechat_prefix ("error"), IRC_PLUGIN_NAME, "quiet");
+            return WEECHAT_RC_OK;
+        }
+        irc_server_sendf (ptr_server, IRC_SERVER_SEND_OUTQ_PRIO_HIGH, NULL,
+                          "MODE %s +q", ptr_channel->name);
+    }
+
+    return WEECHAT_RC_OK;
+}
+
+/*
  * irc_command_connect_one_server: connect to one server
  *                                 return 0 if error, 1 if ok
  */
@@ -5019,6 +5101,14 @@ irc_command_init ()
                              "Without argument, this command display ban list "
                              "for current channel."),
                           "%(irc_channel_nicks_hosts)", &irc_command_ban, NULL);
+    weechat_hook_command ("quiet",
+                          N_("quiet nicks or hosts"),
+                          N_("[<channel>] [<nick> [<nick>...]]"),
+                          N_("channel: channel for quiet\n"
+                             "   nick: user or host to quiet\n\n"
+                             "Without argument, this command display quiet list "
+                             "for current channel."),
+                          "%(irc_channel_nicks_hosts)", &irc_command_quiet, NULL);
     weechat_hook_command ("connect",
                           N_("connect to IRC server(s)"),
                           N_("<server> [<server>...] [-<option>[=<value>]] "
diff --git a/src/plugins/irc/irc-protocol.c b/src/plugins/irc/irc-protocol.c
index 40faffc..9096c0d 100644
--- a/src/plugins/irc/irc-protocol.c
+++ b/src/plugins/irc/irc-protocol.c
@@ -4106,6 +4106,122 @@ IRC_PROTOCOL_CALLBACK(368)
 
     return WEECHAT_RC_OK;
 }
+/*
+ * irc_protocol_cb_728: '728' command received (quietlist)
+ */
+
+IRC_PROTOCOL_CALLBACK(728)
+{
+    struct t_irc_channel *ptr_channel;
+    struct t_gui_buffer *ptr_buffer;
+    time_t datetime;
+
+    /*
+     * 728 message looks like:
+     *   :server 728 mynick #channel mode quietmask nick!user@host 1351350090
+     *    0      1   2      3        4    5       6              7
+     */
+
+    IRC_PROTOCOL_MIN_ARGS(6);
+
+    ptr_channel = irc_channel_search (server, argv[3]);
+    ptr_buffer = (ptr_channel && ptr_channel->nicks) ?
+        ptr_channel->buffer : server->buffer;
+    if (argc >= 8)
+    {
+        datetime = (time_t)(atol (argv[7]));
+        weechat_printf_tags (irc_msgbuffer_get_target_buffer (server, NULL,
+                                                              command, "quietlist",
+                                                              ptr_buffer),
+                             irc_protocol_tags (command, "irc_numeric", NULL),
+                             /* TRANSLATORS: "%s" after "on" is a date */
+                             _("%s%s[%s%s%s] %s%s%s quieted by "
+                               "%s%s %s(%s%s%s)%s on %s"),
+                             weechat_prefix ("network"),
+                             IRC_COLOR_CHAT_DELIMITERS,
+                             IRC_COLOR_CHAT_CHANNEL,
+                             argv[3],
+                             IRC_COLOR_CHAT_DELIMITERS,
+                             IRC_COLOR_CHAT_HOST,
+                             argv[5],
+                             IRC_COLOR_RESET,
+                             irc_nick_color_for_server_message (server, NULL,
+                                                                irc_message_get_nick_from_host (argv[5])),
+                             irc_message_get_nick_from_host (argv[6]),
+                             IRC_COLOR_CHAT_DELIMITERS,
+                             IRC_COLOR_CHAT_HOST,
+                             irc_message_get_address_from_host (argv[6]),
+                             IRC_COLOR_CHAT_DELIMITERS,
+                             IRC_COLOR_RESET,
+                             weechat_util_get_time_string (&datetime));
+    }
+    else
+    {
+        weechat_printf_tags (irc_msgbuffer_get_target_buffer (server, NULL,
+                                                              command, "quietlist",
+                                                              ptr_buffer),
+                             irc_protocol_tags (command, "irc_numeric", NULL),
+                             _("%s%s[%s%s%s] %s%s%s quieted by "
+                               "%s%s %s(%s%s%s)"),
+                             weechat_prefix ("network"),
+                             IRC_COLOR_CHAT_DELIMITERS,
+                             IRC_COLOR_CHAT_CHANNEL,
+                             argv[3],
+                             IRC_COLOR_CHAT_DELIMITERS,
+                             IRC_COLOR_CHAT_HOST,
+                             argv[5],
+                             IRC_COLOR_RESET,
+                             irc_nick_color_for_server_message (server, NULL,
+                                                                irc_message_get_nick_from_host (argv[6])),
+                             irc_message_get_nick_from_host (argv[6]),
+                             IRC_COLOR_CHAT_DELIMITERS,
+                             IRC_COLOR_CHAT_HOST,
+                             irc_message_get_address_from_host (argv[6]),
+                             IRC_COLOR_CHAT_DELIMITERS);
+    }
+
+    return WEECHAT_RC_OK;
+}
+
+/*
+ * irc_protocol_cb_729: '729' command received (end of quietlist)
+ */
+IRC_PROTOCOL_CALLBACK(729)
+{
+    char *pos_args;
+    struct t_irc_channel *ptr_channel;
+    struct t_gui_buffer *ptr_buffer;
+
+    /*
+     * 368 message looks like:
+     *   :server 729 mynick #channel mode :End of Channel Quiet List
+     *   0       1   2      3        4    5
+     */
+
+    IRC_PROTOCOL_MIN_ARGS(5);
+
+    pos_args = (argc > 5) ?
+        ((argv_eol[5][0] == ':') ? argv_eol[5] + 1 : argv_eol[5]) : NULL;
+
+    ptr_channel = irc_channel_search (server, argv[3]);
+    ptr_buffer = (ptr_channel && ptr_channel->nicks) ?
+        ptr_channel->buffer : server->buffer;
+    weechat_printf_tags (irc_msgbuffer_get_target_buffer (server, NULL,
+                                                          command, "quietlist",
+                                                          ptr_buffer),
+                         irc_protocol_tags (command, "irc_numeric", NULL),
+                         "%s%s[%s%s%s]%s%s%s",
+                         weechat_prefix ("network"),
+                         IRC_COLOR_CHAT_DELIMITERS,
+                         IRC_COLOR_CHAT_CHANNEL,
+                         argv[3],
+                         IRC_COLOR_CHAT_DELIMITERS,
+                         IRC_COLOR_RESET,
+                         (pos_args) ? " " : "",
+                         (pos_args) ? pos_args : "");
+
+    return WEECHAT_RC_OK;
+}
 
 /*
  * irc_protocol_cb_432: '432' command received (erroneous nickname)
@@ -4483,6 +4599,8 @@ irc_protocol_recv_command (struct t_irc_server *server,
           { "366", /* end of /names list */ 1, 0, &irc_protocol_cb_366 },
           { "367", /* banlist */ 1, 0, &irc_protocol_cb_367 },
           { "368", /* end of banlist */ 1, 0, &irc_protocol_cb_368 },
+          { "728", /* quietlist */ 1, 0, &irc_protocol_cb_728 },
+          { "729", /* end of quietlist */ 1, 0, &irc_protocol_cb_729 },
           { "369", /* whowas (end) */ 1, 0, &irc_protocol_cb_whowas_nick_msg },
           { "378", /* whois (connecting from) */ 1, 0, &irc_protocol_cb_whois_nick_msg },
           { "379", /* whois (using modes) */ 1, 0, &irc_protocol_cb_whois_nick_msg },
