diff --git a/exec/mqtt_spy.js b/exec/mqtt_spy.js
index badc5e27bdedb2a726c6509e664f0da3a1dc95fd..eaa2c3def29f1695728b2a62ac9e69ff4c2ca129 100755
--- a/exec/mqtt_spy.js
+++ b/exec/mqtt_spy.js
@@ -1,5 +1,7 @@
 // Spy on a terminal server node using MQTT
 
+// usage: mqtt_spy <node_num> [char_set]
+
 require("key_defs.js", "CTRL_C");
 require("nodedefs.js", "NodeStatus");
 
@@ -34,6 +36,19 @@ function get_ansi_seq()
 	return null;
 }
 
+var my_charset = js.global.console ? console.charset : argv[1] || 'CP437';
+var node_charset;
+function output(str)
+{
+	if(my_charset != node_charset) {
+		if(node_charset == 'UTF-8')
+			str = utf8_decode(str);
+		else if(my_charset == 'UTF-8')
+			str = utf8_encode(str);
+	}
+	write(str);
+}
+
 if(argc < 1) {
 	alert("Node number not specified");
 	exit(0);
@@ -48,6 +63,7 @@ if(node_num < 1 || node_num > system.nodes || isNaN(node_num)
 var in_topic = format("sbbs/%s/node/%u/input", system.qwk_id, node_num);
 var out_topic = format("sbbs/%s/node/%u/output", system.qwk_id, node_num);
 var status_topic = format("sbbs/%s/node/%u/status", system.qwk_id, node_num);
+var terminal_topic = format("sbbs/%s/node/%u/terminal", system.qwk_id, node_num);
 var mqtt = new MQTT();
 if(!mqtt.connect()) {
 	alert("Connect error: " + mqtt.error_str);
@@ -62,13 +78,17 @@ if(!mqtt.subscribe(out_topic)) {
 	alert(format("Subscribe to '%s' error: %s", out_topic, mqtt.error_str));
 	exit(1);
 }
+if(!mqtt.subscribe(terminal_topic)) {
+	alert(format("Subscribe to '%s' error: %s", terminal_topic, mqtt.error_str));
+	exit(1);
+}
 print("*** Synchronet MQTT Spy on Node " + node_num + ": Ctrl-C to Abort ***\r\n");
 
 while(!js.terminated) {
 	var msg = mqtt.read(/* timeout: */10, /* verbose: */true);
 	if(msg) {
 		if(msg.topic == out_topic)
-			write(msg.data);
+			output(msg.data);
 		else if(msg.topic == status_topic) {
 			var new_status = parseInt(msg.data, 10);
 			if(new_status != node_status) {
@@ -76,6 +96,9 @@ while(!js.terminated) {
 				print("\r\nNew node status: " + NodeStatus[node_status]);
 			}
 		}
+		else if(msg.topic == terminal_topic) {
+			node_charset = msg.data.split('\t')[4];
+		}
 	}
 	if(js.global.console) {
 		if(console.aborted || !bbs.online)