diff --git a/src/sbbs3/inkey.cpp b/src/sbbs3/inkey.cpp
index 34f4772b620ada143ee4fe0bc5ec60743cfb02bf..eb655a7af14571a84201b02866eabafbd6ddbe6f 100644
--- a/src/sbbs3/inkey.cpp
+++ b/src/sbbs3/inkey.cpp
@@ -43,7 +43,13 @@ int kbincom(sbbs_t* sbbs, unsigned long timeout)
 	if(sbbs->keybuftop!=sbbs->keybufbot) { 
 		ch=sbbs->keybuf[sbbs->keybufbot++]; 
 		if(sbbs->keybufbot==KEY_BUFSIZE) 
-			sbbs->keybufbot=0; 
+			sbbs->keybufbot=0;
+#if 0
+		char* p = c_escape_char(ch);
+		if(p == NULL)
+			p = (char*)&ch;
+		lprintf(LOG_DEBUG, "kbincom read %02X '%s'", ch, p);
+#endif
 	} else {
 		ch=sbbs->incom(timeout);
 		long term = sbbs->term_supports();
@@ -386,6 +392,10 @@ char sbbs_t::handle_ctrlkey(char ch, long mode)
 						}
 						if(pause_inside)
 							return '\r';
+					} else if(button == '`') {
+						return TERM_KEY_UP;
+					} else if(button == 'a') {
+						return TERM_KEY_DOWN;
 					}
 					if(console&CON_MOUSE_PASSTHRU) {
 						for(j = i; j > 0; j--)
@@ -455,8 +465,13 @@ char sbbs_t::handle_ctrlkey(char ch, long mode)
 						}
 						if(pause_inside)
 							return '\r';
+					} else if(button == 0x40) {
+						return TERM_KEY_UP;
+					} else if(button == 0x41) {
+						return TERM_KEY_DOWN;
 					}
 					if(console&CON_MOUSE_PASSTHRU) {
+						lprintf(LOG_DEBUG, "Passing-through SGR mouse report: 'ESC[<%s'", str);
 						for(j = i; j > 0; j--)
 							ungetkey(str[j - 1], /* insert: */true);
 						ungetkey('<', /* insert: */true);
@@ -465,6 +480,9 @@ char sbbs_t::handle_ctrlkey(char ch, long mode)
 					}
 					if(button == 2)  // Right-click
 						return handle_ctrlkey(TERM_KEY_ABORT, mode);
+	#ifdef _DEBUG
+					lprintf(LOG_DEBUG, "Eating SGR mouse report: 'ESC[<%s'", str);
+	#endif
 					return 0;
 				}
 				if(ch!=';' && !isdigit((uchar)ch) && ch!='R') {    /* other ANSI */
@@ -517,8 +535,8 @@ char sbbs_t::handle_ctrlkey(char ch, long mode)
 						int	x,y;
 						str[i]=0;
 						if(sscanf(str,"%u;%u",&y,&x)==2) {
-							lprintf(LOG_DEBUG,"Node %d received ANSI cursor position report: %ux%u"
-								,cfg.node_num, x, y);
+							lprintf(LOG_DEBUG,"received ANSI cursor position report: %ux%u"
+								,x, y);
 							/* Sanity check the coordinates in the response: */
 							if(x >= TERM_COLS_MIN && x <= TERM_COLS_MAX) cols=x;
 							if(y >= TERM_ROWS_MIN && y <= TERM_ROWS_MAX) rows=y;
@@ -567,25 +585,28 @@ struct mouse_hotspot* sbbs_t::add_hotspot(struct mouse_hotspot* spot)
 	if(spot->maxx < 0)
 		spot->maxx = cols - 1;
 #ifdef _DEBUG
+	char dbg[128];
 	lprintf(LOG_DEBUG, "Adding mouse hot spot %ld-%ld x %ld = '%s'"
-		,spot->minx, spot->maxx, spot->y, spot->cmd);
+		,spot->minx, spot->maxx, spot->y, c_escape_str(spot->cmd, dbg, sizeof(dbg), /* Ctrl-only? */true));
 #endif
 	list_node_t* node = listInsertNodeData(&mouse_hotspots, spot, sizeof(*spot));
 	if(node == NULL)
 		return NULL;
-	set_mouse(MOUSE_MODE_X10 | MOUSE_MODE_EXT);
+	set_mouse(MOUSE_MODE_NORM | MOUSE_MODE_EXT);
 	return (struct mouse_hotspot*)node->data;
 }
 
 void sbbs_t::clear_hotspots(void)
 {
-#ifdef _DEBUG
 	long spots = listCountNodes(&mouse_hotspots);
-	if(spots)
+	if(spots) {
+#ifdef _DEBUG
 		lprintf(LOG_DEBUG, "Clearing %ld mouse hot spots", spots);
 #endif
-	set_mouse(MOUSE_MODE_OFF);
-	listFreeNodes(&mouse_hotspots);
+		listFreeNodes(&mouse_hotspots);
+		if(!(console&CON_MOUSE_REPORT))
+			set_mouse(MOUSE_MODE_OFF);
+	}
 }
 
 void sbbs_t::scroll_hotspots(long count)
diff --git a/src/sbbs3/sbbsdefs.h b/src/sbbs3/sbbsdefs.h
index cde40c31bf809eb6f0bc6a91b1ce1ebb3a218e03..c24e9745ee39dc758236f8ffd2920991eba9408c 100644
--- a/src/sbbs3/sbbsdefs.h
+++ b/src/sbbs3/sbbsdefs.h
@@ -493,6 +493,7 @@ typedef enum {						/* Values for xtrn_t.event				*/
 #define CON_BLINK_FONT	(1<<20)	/* Alt blink attribute font activated		*/
 #define CON_HBLINK_FONT	(1<<21)	/* Alt high-blink attribute font activated	*/
 #define CON_MOUSE_PASSTHRU	(1<<24)	// Pass-through unhandled mouse reports
+#define CON_MOUSE_REPORT	(1<<25)	// Mouse-reports enabled for non-hotspots (e.g. scroll-wheel)
 #define CON_CR_CLREOL		(1<<31)	// outchar('\r') clears to end-of-line first
 
 							/* Number of milliseconds						*/