diff --git a/src/server/include/net.h b/src/server/include/net.h
index afce07d32c9eb55f4b6509fd0a4066d2137b6607..c1d743cf2dfeae3dba50e65ed82b8aff2427b360 100644
--- a/src/server/include/net.h
+++ b/src/server/include/net.h
@@ -28,6 +28,7 @@ void net_server_iddqd(gpointer ref);
 void net_server_broadcast_message(const gchar *msg, gpointer ref);
 void net_server_direct_message(const gchar *msg, gpointer ref);
 void net_server_set_nickname(const gchar *nick, gpointer ref);
+int  net_server_parse_msg(const gchar *msg, gpointer ref);
 
 
 #endif /* _SERVER_INCLUDE_NET_H_ */
diff --git a/src/server/net.c b/src/server/net.c
index 6d28d43aff1b652916523de0b19c4766f86e4152..67903b34cf0565f23b3fd70c75c82656ec87002c 100644
--- a/src/server/net.c
+++ b/src/server/net.c
@@ -174,6 +174,25 @@ exit:
 	return G_SOURCE_REMOVE;
 }
 
+static void net_push_motd_update(void)
+{
+	gchar *buf;
+	gchar *motd;
+
+
+	motd = server_cfg_get_motd();
+	if (!motd)
+		return;
+
+	buf = g_strdup_printf("The MOTD has been updated and now reads: "
+			      "\n\n%s\n\n", motd);
+
+	net_server_broadcast_message(buf, NULL);
+
+	g_free(buf);
+	g_free(motd);
+}
+
 
 /**
  * @brief distribute a list of users to all clients
@@ -205,7 +224,6 @@ static gboolean net_push_userlist_cb(gpointer data)
 
 		tmp = msg;
 
-		g_message("%s priv is %d", c->nick, c->priv);
 		switch (c->priv) {
 		case PRIV_FULL:
 			buf = g_strdup_printf("<tt><span foreground='#FF0000'>"
@@ -1034,6 +1052,33 @@ void net_server_set_nickname(const gchar *nick, gpointer ref)
 
 
 
+int net_server_parse_msg(const gchar *msg, gpointer ref)
+{
+	struct con_data *c;
+
+
+	c = (struct con_data *) ref;
+
+	/* ignore if not fully priviledged */
+	if (c->priv < PRIV_FULL)
+		return -1;
+
+	/* shorter than our only supported command word */
+	if (strlen(msg) < 5)
+	       return -1;
+
+	if (strncmp(msg, "!motd", 5))
+		return -1;
+
+	/* stupidly set the motd */
+	server_cfg_set_motd(&msg[5]);
+
+	net_push_motd_update();
+
+	return 0;
+}
+
+
 /**
  * @brief broadcast a text message to all clients
  */
diff --git a/src/server/proc/proc_pr_message.c b/src/server/proc/proc_pr_message.c
index 2bc91b216828430d6965ee5278700cab17588ba4..85ce91d3758cc78cc3fe45c2555ba56830dcf4f8 100644
--- a/src/server/proc/proc_pr_message.c
+++ b/src/server/proc/proc_pr_message.c
@@ -35,5 +35,9 @@ void proc_pr_message(struct packet *pkt, gpointer ref)
 	if (strlen((gchar *) c->message) != c->len)
 		return;
 
+	/* see if it is an interpretable command */
+	if (!net_server_parse_msg((const gchar *) c->message, ref))
+		return;
+
 	net_server_broadcast_message((const gchar *) c->message, ref);
 }