diff --git a/src/conio/cterm.c b/src/conio/cterm.c
index af4e43bca807ce1f2b30fbfd4be460f861642fcd..bbdd819d99ee432563acb8d1c087b7153d641602 100644
--- a/src/conio/cterm.c
+++ b/src/conio/cterm.c
@@ -914,10 +914,14 @@ void do_ansi(char *retbuf, size_t retsize, int *speed)
 				case 'g':	/* ToDo?  VT100 Tabs */
 					break;
 				case 'h':	/* ToDo?  Scrolling regeion, word-wrap, doorway mode */
+					if(!strcmp(cterm.escbuf,"[=255h"))
+						cterm.doorway_mode=1;
 					break;
 				case 'i':	/* ToDo?  Printing */
 					break;
 				case 'l':	/* ToDo?  Scrolling regeion, word-wrap, doorway mode */
+					if(!strcmp(cterm.escbuf,"[=255l"))
+						cterm.doorway_mode=0;
 					break;
 				case 'm':
 					*(p--)=0;
@@ -1882,47 +1886,68 @@ char *cterm_write(unsigned char *buf, int buflen, char *retbuf, size_t retsize,
 						}
 					}
 					else {	/* ANSI-BBS */
-						switch(buf[j]) {
-							case 0:
-								break;
-							case 7:			/* Beep */
-								ctputs(prn);
-								prn[0]=0;
-								if(cterm.log==CTERM_LOG_ASCII && cterm.logfile != NULL)
-									fputs("\x07", cterm.logfile);
-								#ifdef __unix__
-									putch(7);
-								#else
-									MessageBeep(MB_OK);
-								#endif
-								break;
-							case 12:		/* ^L - Clear screen */
-								ctputs(prn);
-								prn[0]=0;
-								if(cterm.log==CTERM_LOG_ASCII && cterm.logfile != NULL)
-									fputs("\x0c", cterm.logfile);
-								clearscreen((char)cterm.attr);
-								gotoxy(1,1);
-								break;
-							case 27:		/* ESC */
-								ctputs(prn);
-								prn[0]=0;
-								cterm.sequence=1;
-								break;
-							case '\t':
-								ctputs(prn);
-								prn[0]=0;
-								if(cterm.log==CTERM_LOG_ASCII && cterm.logfile != NULL)
-									fputs("\t", cterm.logfile);
-								for(k=0;k<11;k++) {
-									if(cterm_tabs[k]>wherex()) {
-										gotoxy(cterm_tabs[k],wherey());
-										break;
-									}
+						if(cterm.doorway_char) {
+							ctputs(prn);
+							ch[1]=cterm.attr;
+							puttext(cterm.x+wherex()-1,cterm.y+wherey()-1,cterm.x+wherex()-1,cterm.y+wherey()-1,ch);
+							ch[1]=0;
+							if(wherex()==cterm.width) {
+								if(wherey()==cterm.height) {
+									scrollup();
+									gotoxy(1,wherey());
 								}
-								break;
-							default:
-								strcat(prn,ch);
+								else
+									gotoxy(1,wherey()+1);
+							}
+							else
+								gotoxy(wherex()+1,wherey());
+							cterm.doorway_char=0;
+						}
+						else {
+							switch(buf[j]) {
+								case 0:
+									if(cterm.doorway_mode)
+										cterm.doorway_char=1;
+									break;
+								case 7:			/* Beep */
+									ctputs(prn);
+									prn[0]=0;
+									if(cterm.log==CTERM_LOG_ASCII && cterm.logfile != NULL)
+										fputs("\x07", cterm.logfile);
+									#ifdef __unix__
+										putch(7);
+									#else
+										MessageBeep(MB_OK);
+									#endif
+									break;
+								case 12:		/* ^L - Clear screen */
+									ctputs(prn);
+									prn[0]=0;
+									if(cterm.log==CTERM_LOG_ASCII && cterm.logfile != NULL)
+										fputs("\x0c", cterm.logfile);
+									clearscreen((char)cterm.attr);
+									gotoxy(1,1);
+									break;
+								case 27:		/* ESC */
+									ctputs(prn);
+									prn[0]=0;
+									cterm.sequence=1;
+									break;
+								case '\t':
+									ctputs(prn);
+									prn[0]=0;
+									if(cterm.log==CTERM_LOG_ASCII && cterm.logfile != NULL)
+										fputs("\t", cterm.logfile);
+									for(k=0;k<11;k++) {
+										if(cterm_tabs[k]>wherex()) {
+											gotoxy(cterm_tabs[k],wherey());
+											break;
+										}
+									}
+									break;
+								default:
+									strcat(prn,ch);
+							}
 						}
 					}
 				}
diff --git a/src/conio/cterm.h b/src/conio/cterm.h
index 5a9945429522b0227491e4977a07e0b02b32244e..017640c8335ccf16fce320dab6378f8db9a79021 100644
--- a/src/conio/cterm.h
+++ b/src/conio/cterm.h
@@ -85,6 +85,8 @@ struct cterminal {
 	int		font_size;
 	int		font_read;
 	int		font_start_time;
+	int		doorway_mode;
+	int		doorway_char;
 };
 
 #define CTERM_MUSIC_SYNCTERM	0