diff --git a/src/sbbs3/mqtt.c b/src/sbbs3/mqtt.c
index 16d9e7d8107fe30b620aee07028551b78e9db213..c302044a371b8cf2baa08fdfe7a7ba3443262a28 100644
--- a/src/sbbs3/mqtt.c
+++ b/src/sbbs3/mqtt.c
@@ -519,6 +519,33 @@ static void mqtt_message_received(struct mosquitto* mosq, void* cbdata, const st
 				return;
 			}
 		}
+		if(strcmp(msg->topic, mqtt_topic(mqtt, TOPIC_BBS, topic, sizeof(topic), "exec")) == 0) {
+			for(int i = 0; i < mqtt->cfg->total_events; i++) {
+				if(stricmp(mqtt->cfg->event[i]->code, msg->payload) != 0)
+					continue;
+				if(mqtt->cfg->event[i]->node != NODE_ANY
+					&& (mqtt->cfg->event[i]->node < bbs_startup->first_node || mqtt->cfg->event[i]->node > bbs_startup->last_node)
+					&& !(mqtt->cfg->event[i]->misc&EVENT_EXCL))
+					break;	// ignore non-exclusive events for other instances
+				if(!(mqtt->cfg->event[i]->misc & EVENT_DISABLED))
+					mqtt->cfg->event[i]->last = -1;
+				break;
+			}
+			return;
+		}
+		if(strcmp(msg->topic, mqtt_topic(mqtt, TOPIC_BBS, topic, sizeof(topic), "call")) == 0) {
+			for(int i = 0; i < mqtt->cfg->total_qhubs; i++) {
+				if(stricmp(mqtt->cfg->qhub[i]->id, msg->payload) != 0)
+					continue;
+				if(mqtt->cfg->qhub[i]->node != NODE_ANY
+					&& (mqtt->cfg->qhub[i]->node < bbs_startup->first_node || mqtt->cfg->qhub[i]->node > bbs_startup->last_node))
+					break;
+				if(mqtt->cfg->qhub[i]->enabled)
+					mqtt->cfg->qhub[i]->last = -1;
+				break;
+			}
+			return;
+		}
 	}
 	if(strcmp(msg->topic, mqtt_topic(mqtt, TOPIC_HOST, topic, sizeof(topic), "recycle")) == 0
 		|| strcmp(msg->topic, mqtt_topic(mqtt, TOPIC_SERVER, topic, sizeof(topic), "recycle")) == 0) {
@@ -583,6 +610,8 @@ int mqtt_startup(struct mqtt* mqtt, scfg_t* cfg, struct startup* startup, const
 			mqtt_subscribe(mqtt, TOPIC_BBS, str, sizeof(str), "node/%d/input", i);
 			mqtt_subscribe(mqtt, TOPIC_BBS, str, sizeof(str), "node/%d/set/#", i);
 		}
+		mqtt_subscribe(mqtt, TOPIC_BBS, str, sizeof(str), "exec");
+		mqtt_subscribe(mqtt, TOPIC_BBS, str, sizeof(str), "call");
 	}
 	mqtt_pub_noval(mqtt, TOPIC_SERVER, "recycle");
 	mqtt_pub_noval(mqtt, TOPIC_SERVER, "client");