diff --git a/src/sbbs3/inkey.cpp b/src/sbbs3/inkey.cpp
index a49ae6ccc1874b1fe3dd267d9a91666217f8eaa6..4ddb4152578a2bea1182d394ad11ee4648161050 100644
--- a/src/sbbs3/inkey.cpp
+++ b/src/sbbs3/inkey.cpp
@@ -74,6 +74,11 @@ char sbbs_t::inkey(long mode)
 		ch&=0x7f; 
 
 	timeout=time(NULL);
+
+	/* Is this control key flagged as passthru? */
+	if(ch<' ' && cfg.ctrlkey_passthru&(1<<ch))
+		return(ch);	/* do not handle here */
+
 	if(ch==CTRL_C) {  /* Ctrl-C Abort */
 		sys_status|=SS_ABORT;
 		if(mode&K_SPIN) /* back space once if on spinning cursor */
diff --git a/src/sbbs3/js_console.cpp b/src/sbbs3/js_console.cpp
index e3bab643bb0568a7dc373b041c64efa5f8c0edbb..9b6ded6798541685ef59242e3bce48b9eee54034 100644
--- a/src/sbbs3/js_console.cpp
+++ b/src/sbbs3/js_console.cpp
@@ -55,6 +55,7 @@ enum {
 	,CON_PROP_TIMELEFT_WARN		/* low timeleft warning flag */
 	,CON_PROP_ABORTABLE
 	,CON_PROP_TELNET_MODE
+	,CON_PROP_CTRLKEY_PASSTHRU
 };
 
 static JSBool js_console_get(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
@@ -110,6 +111,9 @@ static JSBool js_console_get(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
 				return(JS_FALSE);
 			*vp = STRING_TO_JSVAL(js_str);
 			return(JS_TRUE);
+		case CON_PROP_CTRLKEY_PASSTHRU:
+			val=sbbs->cfg.ctrlkey_passthru;
+			break;
 		default:
 			return(JS_TRUE);
 	}
@@ -171,6 +175,9 @@ static JSBool js_console_set(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
 				break;
 			SAFECOPY(sbbs->question,JS_GetStringBytes(str));
 			break;
+		case CON_PROP_CTRLKEY_PASSTHRU:
+			sbbs->cfg.ctrlkey_passthru=val;
+			break;
 		default:
 			return(JS_TRUE);
 	}
@@ -181,20 +188,21 @@ static JSBool js_console_set(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
 #define CON_PROP_FLAGS JSPROP_ENUMERATE
 
 static struct JSPropertySpec js_console_properties[] = {
-/*		 name				,tinyid					,flags			,getter,setter	*/
-
-	{	"status"			,CON_PROP_STATUS		,CON_PROP_FLAGS	,NULL,NULL},
-	{	"line_counter"		,CON_PROP_LNCNTR 		,CON_PROP_FLAGS	,NULL,NULL},
-	{	"attributes"		,CON_PROP_ATTR			,CON_PROP_FLAGS	,NULL,NULL},
-	{	"top_of_screen"		,CON_PROP_TOS			,CON_PROP_FLAGS	,NULL,NULL},
-	{	"screen_rows"		,CON_PROP_ROWS			,CON_PROP_FLAGS	,NULL,NULL},
-	{	"autoterm"			,CON_PROP_AUTOTERM		,CON_PROP_FLAGS	,NULL,NULL},
-	{	"timeout"			,CON_PROP_TIMEOUT		,CON_PROP_FLAGS	,NULL,NULL},
-	{	"timeleft_warning"	,CON_PROP_TIMELEFT_WARN	,CON_PROP_FLAGS	,NULL,NULL},
-	{	"rio_abortable"		,CON_PROP_ABORTABLE		,CON_PROP_FLAGS	,NULL,NULL},
-	{	"telnet_mode"		,CON_PROP_TELNET_MODE	,CON_PROP_FLAGS	,NULL,NULL},
-	{	"wordwrap"			,CON_PROP_WORDWRAP		,JSPROP_ENUMERATE|JSPROP_READONLY ,NULL,NULL},
-	{	"question"			,CON_PROP_QUESTION		,CON_PROP_FLAGS ,NULL,NULL},
+/*		 name				,tinyid						,flags			,getter,setter	*/
+
+	{	"status"			,CON_PROP_STATUS			,CON_PROP_FLAGS	,NULL,NULL},
+	{	"line_counter"		,CON_PROP_LNCNTR 			,CON_PROP_FLAGS	,NULL,NULL},
+	{	"attributes"		,CON_PROP_ATTR				,CON_PROP_FLAGS	,NULL,NULL},
+	{	"top_of_screen"		,CON_PROP_TOS				,CON_PROP_FLAGS	,NULL,NULL},
+	{	"screen_rows"		,CON_PROP_ROWS				,CON_PROP_FLAGS	,NULL,NULL},
+	{	"autoterm"			,CON_PROP_AUTOTERM			,CON_PROP_FLAGS	,NULL,NULL},
+	{	"timeout"			,CON_PROP_TIMEOUT			,CON_PROP_FLAGS	,NULL,NULL},
+	{	"timeleft_warning"	,CON_PROP_TIMELEFT_WARN		,CON_PROP_FLAGS	,NULL,NULL},
+	{	"rio_abortable"		,CON_PROP_ABORTABLE			,CON_PROP_FLAGS	,NULL,NULL},
+	{	"telnet_mode"		,CON_PROP_TELNET_MODE		,CON_PROP_FLAGS	,NULL,NULL},
+	{	"wordwrap"			,CON_PROP_WORDWRAP			,JSPROP_ENUMERATE|JSPROP_READONLY ,NULL,NULL},
+	{	"question"			,CON_PROP_QUESTION			,CON_PROP_FLAGS ,NULL,NULL},
+	{	"ctrlkey_passthru"	,CON_PROP_CTRLKEY_PASSTHRU	,CON_PROP_FLAGS	,NULL,NULL},
 	{0}
 };
 
@@ -212,6 +220,7 @@ static char* con_prop_desc[] = {
 	,"current telnet mode (see TELNET_MODE_* in sbbsdefs.js for valid values)"
 	,"word-wrap buffer (used by getstr)"
 	,"current yes/no question (set by yesno and noyes)"
+	,"control key pass-through bitmask, set bits represent control key combinations <b>not</b> handled by inkey() method"
 	,NULL
 };
 #endif
diff --git a/src/sbbs3/scfgdefs.h b/src/sbbs3/scfgdefs.h
index 42d8b9bff7c0d3929c66fc69cbeb52570d5e8158..819d6bea3bfef8fd9dcf2babd8809c7157da6881 100644
--- a/src/sbbs3/scfgdefs.h
+++ b/src/sbbs3/scfgdefs.h
@@ -575,6 +575,7 @@ typedef struct
 	ushort	sec_hangup; 			/* Seconds before inactivity hang-up */
 
 	char 	color[TOTAL_COLORS];	/* Different colors for the BBS */
+	ulong	ctrlkey_passthru;		/* Bits represent control keys NOT handled by inkey() */
 
 	char 	wfc_cmd[10][LEN_CMD+1];    /* 0-9 WFC DOS commands */
 	char 	wfc_scmd[12][LEN_CMD+1];   /* F1-F12 WFC shrinking DOS commands */
diff --git a/src/sbbs3/scfglib1.c b/src/sbbs3/scfglib1.c
index f28c6238ac4ed4a7aa3a66e6caa57ab2c8b35c8e..c3b11efd7ed4bf92b9df1ca515c4e320ad89001a 100644
--- a/src/sbbs3/scfglib1.c
+++ b/src/sbbs3/scfglib1.c
@@ -294,9 +294,10 @@ BOOL read_main_cfg(scfg_t* cfg, char* error)
 	get_str(cfg->logout_mod,instream);
 	get_str(cfg->sync_mod,instream);
 	get_str(cfg->expire_mod,instream);
+	get_int(cfg->ctrlkey_passthru,instream);
 	get_int(c,instream);
 
-	for(i=0;i<224;i++)					/* unused - initialized to NULL */
+	for(i=0;i<222;i++)					/* unused - initialized to NULL */
 		get_int(n,instream);
 	for(i=0;i<254;i++)					/* unused - initialized to 0xff */
 		get_int(n,instream);